X-Git-Url: http://secure.phpeclipse.com

diff --git a/net.sourceforge.phpeclipse.externaltools/src/net/sourceforge/phpdt/externaltools/launchConfigurations/ExternalToolsMainTab.java b/net.sourceforge.phpeclipse.externaltools/src/net/sourceforge/phpdt/externaltools/launchConfigurations/ExternalToolsMainTab.java
index 49102df..f9a4f9f 100644
--- a/net.sourceforge.phpeclipse.externaltools/src/net/sourceforge/phpdt/externaltools/launchConfigurations/ExternalToolsMainTab.java
+++ b/net.sourceforge.phpeclipse.externaltools/src/net/sourceforge/phpdt/externaltools/launchConfigurations/ExternalToolsMainTab.java
@@ -54,545 +54,620 @@ import org.eclipse.ui.dialogs.SelectionDialog;
 
 public class ExternalToolsMainTab extends AbstractLaunchConfigurationTab {
 
-  protected Combo locationField;
-
-  protected Text workDirectoryField;
-
-  protected Button fileLocationButton;
-
-  protected Button workspaceLocationButton;
-
-  protected Button fileWorkingDirectoryButton;
-
-  protected Button workspaceWorkingDirectoryButton;
-
-  protected Button runBackgroundButton;
-
-  protected Text argumentField;
-
-  protected Button variableButton;
-
-  protected SelectionAdapter selectionAdapter;
-
-  protected ModifyListener modifyListener = new ModifyListener() {
-    public void modifyText(ModifyEvent e) {
-      updateLaunchConfigurationDialog();
-    }
-  };
-
-  /**
-   * @see org.eclipse.debug.ui.ILaunchConfigurationTab#createControl(org.eclipse.swt.widgets.Composite)
-   */
-  public void createControl(Composite parent) {
-    Composite mainComposite = new Composite(parent, SWT.NONE);
-    setControl(mainComposite);
-    GridLayout layout = new GridLayout();
-    layout.numColumns = 2;
-    GridData gridData = new GridData(GridData.FILL_HORIZONTAL);
-    mainComposite.setLayout(layout);
-    mainComposite.setLayoutData(gridData);
-    mainComposite.setFont(parent.getFont());
-    createLocationComponent(mainComposite);
-    createWorkDirectoryComponent(mainComposite);
-    createArgumentComponent(mainComposite);
-    createVerticalSpacer(mainComposite, 2);
-    createRunBackgroundComponent(mainComposite);
-  }
-
-  /**
-   * Creates the controls needed to edit the location attribute of an external tool
-   * 
-   * @param parent
-   *          the composite to create the controls in
-   */
-  protected void createLocationComponent(Composite parent) {
-    Font font = parent.getFont();
-
-    Composite composite = new Composite(parent, SWT.NONE);
-    GridLayout layout = new GridLayout();
-    layout.marginWidth = 0;
-    layout.marginHeight = 0;
-    layout.numColumns = 1;
-    GridData gridData = new GridData(GridData.FILL_HORIZONTAL);
-    composite.setLayout(layout);
-    composite.setLayoutData(gridData);
-
-    Label label = new Label(composite, SWT.NONE);
-    label.setText(ExternalToolsLaunchConfigurationMessages.getString("ExternalToolsMainTab.&Location___2")); //$NON-NLS-1$
-    label.setFont(font);
-
-    final IPreferenceStore store = ExternalToolsPlugin.getDefault().getPreferenceStore();
-    locationField = new Combo(composite, SWT.DROP_DOWN | SWT.BORDER);
-    GridData data = new GridData(GridData.FILL_HORIZONTAL);
-    data.widthHint = IDialogConstants.ENTRY_FIELD_WIDTH;
-    locationField.setLayoutData(data);
-    locationField.setFont(font);
-    locationField.add(store.getString(ExternalToolsPlugin.PHP_RUN_PREF), 0);
-    locationField.add(store.getString(ExternalToolsPlugin.APACHE_RUN_PREF), 1);
-    locationField.add(store.getString(ExternalToolsPlugin.MYSQL_RUN_PREF), 2);
-    locationField.add(store.getString(ExternalToolsPlugin.XAMPP_START_PREF), 3);
-    locationField.add(store.getString(ExternalToolsPlugin.XAMPP_STOP_PREF), 4);
-    Composite buttonComposite = new Composite(parent, SWT.NONE);
-    layout = new GridLayout();
-    layout.marginWidth = 0;
-    layout.marginHeight = 0;
-    layout.numColumns = 1;
-    gridData = new GridData(GridData.HORIZONTAL_ALIGN_END);
-    buttonComposite.setLayout(layout);
-    buttonComposite.setLayoutData(gridData);
-    buttonComposite.setFont(font);
-
-    createVerticalSpacer(buttonComposite, 1);
-
-    workspaceLocationButton = createPushButton(buttonComposite, ExternalToolsLaunchConfigurationMessages
-        .getString("ExternalToolsMainTab.&Browse_Workspace..._3"), null); //$NON-NLS-1$
-    workspaceLocationButton.addSelectionListener(new SelectionAdapter() {
-      public void widgetSelected(SelectionEvent evt) {
-        handleWorkspaceLocationButtonSelected();
-      }
-    });
-    fileLocationButton = createPushButton(buttonComposite, ExternalToolsLaunchConfigurationMessages
-        .getString("ExternalToolsMainTab.Brows&e_File_System..._4"), null); //$NON-NLS-1$
-    fileLocationButton.addSelectionListener(new SelectionAdapter() {
-      public void widgetSelected(SelectionEvent evt) {
-        handleLocationButtonSelected();
-      }
-    });
-  }
-
-  /**
-   * Creates the controls needed to edit the working directory attribute of an external tool
-   * 
-   * @param parent
-   *          the composite to create the controls in
-   */
-  protected void createWorkDirectoryComponent(Composite parent) {
-    Font font = parent.getFont();
-
-    Composite composite = new Composite(parent, SWT.NONE);
-    GridLayout layout = new GridLayout();
-    layout.marginWidth = 0;
-    layout.marginHeight = 0;
-    layout.numColumns = 1;
-    GridData gridData = new GridData(GridData.FILL_HORIZONTAL);
-    composite.setLayout(layout);
-    composite.setLayoutData(gridData);
-
-    Label label = new Label(composite, SWT.NONE);
-    label.setText(ExternalToolsLaunchConfigurationMessages.getString("ExternalToolsMainTab.Working_&Directory__5")); //$NON-NLS-1$
-    label.setFont(font);
-
-    workDirectoryField = new Text(composite, SWT.BORDER);
-    GridData data = new GridData(GridData.FILL_HORIZONTAL);
-    data.widthHint = IDialogConstants.ENTRY_FIELD_WIDTH;
-    workDirectoryField.setLayoutData(data);
-    workDirectoryField.setFont(font);
-
-    Composite buttonComposite = new Composite(parent, SWT.NONE);
-    layout = new GridLayout();
-    layout.marginWidth = 0;
-    layout.marginHeight = 0;
-    layout.numColumns = 1;
-    gridData = new GridData(GridData.HORIZONTAL_ALIGN_END);
-    buttonComposite.setLayout(layout);
-    buttonComposite.setLayoutData(gridData);
-    buttonComposite.setFont(font);
-
-    createVerticalSpacer(buttonComposite, 1);
-    workspaceWorkingDirectoryButton = createPushButton(buttonComposite, ExternalToolsLaunchConfigurationMessages
-        .getString("ExternalToolsMainTab.Browse_Wor&kspace..._6"), null); //$NON-NLS-1$
-    workspaceWorkingDirectoryButton.addSelectionListener(new SelectionAdapter() {
-      public void widgetSelected(SelectionEvent evt) {
-        handleWorkspaceWorkingDirectoryButtonSelected();
-      }
-    });
-    fileWorkingDirectoryButton = createPushButton(buttonComposite, ExternalToolsLaunchConfigurationMessages
-        .getString("ExternalToolsMainTab.Browse_F&ile_System..._7"), null); //$NON-NLS-1$
-    fileWorkingDirectoryButton.addSelectionListener(new SelectionAdapter() {
-      public void widgetSelected(SelectionEvent evt) {
-        handleFileWorkingDirectoryButtonSelected();
-      }
-    });
-  }
-
-  /**
-   * Creates the controls needed to edit the argument and prompt for argument attributes of an external tool
-   * 
-   * @param parent
-   *          the composite to create the controls in
-   */
-  protected void createArgumentComponent(Composite parent) {
-    Font font = parent.getFont();
-
-    Label label = new Label(parent, SWT.NONE);
-    label.setText(ExternalToolsLaunchConfigurationMessages.getString("ExternalToolsOptionTab.&Arguments___1")); //$NON-NLS-1$
-    GridData data = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
-    data.horizontalSpan = 2;
-    label.setLayoutData(data);
-    label.setFont(font);
-
-    argumentField = new Text(parent, SWT.BORDER);
-    data = new GridData(GridData.FILL_HORIZONTAL);
-    data.widthHint = IDialogConstants.ENTRY_FIELD_WIDTH;
-    argumentField.setLayoutData(data);
-    argumentField.setFont(font);
-    argumentField.addModifyListener(new ModifyListener() {
-      public void modifyText(ModifyEvent e) {
-        updateLaunchConfigurationDialog();
-      }
-    });
-
-    variableButton = createPushButton(parent, ExternalToolsLaunchConfigurationMessages
-        .getString("ExternalToolsOptionTab.Varia&bles..._2"), null); //$NON-NLS-1$
-    variableButton.addSelectionListener(new SelectionAdapter() {
-      public void widgetSelected(SelectionEvent e) {
-        VariableSelectionDialog dialog = new VariableSelectionDialog(getShell());
-        if (dialog.open() == SelectionDialog.OK) {
-          argumentField.insert(dialog.getForm().getSelectedVariable());
-        }
-      }
-    });
-
-    Label instruction = new Label(parent, SWT.NONE);
-    instruction
-        .setText(ExternalToolsLaunchConfigurationMessages
-            .getString("ExternalToolsOptionTab.Note__Enclose_an_argument_containing_spaces_using_double-quotes_(__)._Not_applicable_for_variables._3")); //$NON-NLS-1$
-    data = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
-    data.horizontalSpan = 2;
-    instruction.setLayoutData(data);
-    instruction.setFont(font);
-  }
-
-  /**
-   * Creates the controls needed to edit the run in background attribute of an external tool
-   * 
-   * @param parent
-   *          the composite to create the controls in
-   */
-  protected void createRunBackgroundComponent(Composite parent) {
-    runBackgroundButton = new Button(parent, SWT.CHECK);
-    runBackgroundButton.setText(ExternalToolsLaunchConfigurationMessages
-        .getString("ExternalToolsOptionTab.Run_tool_in_bac&kground_4")); //$NON-NLS-1$
-    GridData data = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
-    runBackgroundButton.setLayoutData(data);
-    runBackgroundButton.setFont(parent.getFont());
-    runBackgroundButton.addSelectionListener(getSelectionAdapter());
-  }
-
-  /**
-   * @see org.eclipse.debug.ui.ILaunchConfigurationTab#setDefaults(org.eclipse.debug.core.ILaunchConfigurationWorkingCopy)
-   */
-  public void setDefaults(ILaunchConfigurationWorkingCopy configuration) {
-    configuration.setAttribute(IExternalToolConstants.ATTR_RUN_IN_BACKGROUND, false);
-  }
-
-  /**
-   * @see org.eclipse.debug.ui.ILaunchConfigurationTab#initializeFrom(org.eclipse.debug.core.ILaunchConfiguration)
-   */
-  public void initializeFrom(ILaunchConfiguration configuration) {
-    updateLocation(configuration);
-    updateWorkingDirectory(configuration);
-    updateArgument(configuration);
-    updateRunBackground(configuration);
-  }
-
-  protected void updateWorkingDirectory(ILaunchConfiguration configuration) {
-    String workingDir = ""; //$NON-NLS-1$
-    try {
-      workingDir = configuration.getAttribute(IExternalToolConstants.ATTR_WORKING_DIRECTORY, ""); //$NON-NLS-1$
-    } catch (CoreException ce) {
-      ExternalToolsPlugin.getDefault().log(
-          ExternalToolsLaunchConfigurationMessages.getString("ExternalToolsMainTab.Error_reading_configuration_10"), ce); //$NON-NLS-1$
-    }
-    workDirectoryField.setText(workingDir);
-    workDirectoryField.addModifyListener(modifyListener);
-
-  }
-
-  protected void updateLocation(ILaunchConfiguration configuration) {
-    String location = ""; //$NON-NLS-1$
-    try {
-      location = configuration.getAttribute(IExternalToolConstants.ATTR_LOCATION, ""); //$NON-NLS-1$
-    } catch (CoreException ce) {
-      ExternalToolsPlugin.getDefault().log(
-          ExternalToolsLaunchConfigurationMessages.getString("ExternalToolsMainTab.Error_reading_configuration_10"), ce); //$NON-NLS-1$
-    }
-    locationField.setText(location);
-    locationField.addModifyListener(modifyListener);
-  }
-
-  protected void updateArgument(ILaunchConfiguration configuration) {
-    String arguments = ""; //$NON-NLS-1$
-    try {
-      arguments = configuration.getAttribute(IExternalToolConstants.ATTR_TOOL_ARGUMENTS, ""); //$NON-NLS-1$
-    } catch (CoreException ce) {
-      ExternalToolsPlugin.getDefault().log(
-          ExternalToolsLaunchConfigurationMessages.getString("ExternalToolsOptionTab.Error_reading_configuration_7"), ce); //$NON-NLS-1$
-    }
-    argumentField.setText(arguments);
-  }
-
-  protected void updateRunBackground(ILaunchConfiguration configuration) {
-    boolean runInBackgroud = true;
-    try {
-      runInBackgroud = configuration.getAttribute(IExternalToolConstants.ATTR_RUN_IN_BACKGROUND, false);
-    } catch (CoreException ce) {
-      ExternalToolsPlugin.getDefault().log(
-          ExternalToolsLaunchConfigurationMessages.getString("ExternalToolsOptionTab.Error_reading_configuration_7"), ce); //$NON-NLS-1$
-    }
-    runBackgroundButton.setSelection(runInBackgroud);
-  }
-
-  /**
-   * @see org.eclipse.debug.ui.ILaunchConfigurationTab#performApply(org.eclipse.debug.core.ILaunchConfigurationWorkingCopy)
-   */
-  public void performApply(ILaunchConfigurationWorkingCopy configuration) {
-    String location = locationField.getText().trim();
-    if (location.length() == 0) {
-      configuration.setAttribute(IExternalToolConstants.ATTR_LOCATION, (String) null);
-    } else {
-      configuration.setAttribute(IExternalToolConstants.ATTR_LOCATION, location);
-    }
-
-    String workingDirectory = workDirectoryField.getText().trim();
-    if (workingDirectory.length() == 0) {
-      configuration.setAttribute(IExternalToolConstants.ATTR_WORKING_DIRECTORY, (String) null);
-    } else {
-      configuration.setAttribute(IExternalToolConstants.ATTR_WORKING_DIRECTORY, workingDirectory);
-    }
-
-    setAttribute(IExternalToolConstants.ATTR_RUN_IN_BACKGROUND, configuration, runBackgroundButton.getSelection(), false);
-
-    String arguments = argumentField.getText().trim();
-    if (arguments.length() == 0) {
-      configuration.setAttribute(IExternalToolConstants.ATTR_TOOL_ARGUMENTS, (String) null);
-    } else {
-      configuration.setAttribute(IExternalToolConstants.ATTR_TOOL_ARGUMENTS, arguments);
-    }
-  }
-
-  /**
-   * @see org.eclipse.debug.ui.ILaunchConfigurationTab#getName()
-   */
-  public String getName() {
-    return ExternalToolsLaunchConfigurationMessages.getString("ExternalToolsMainTab.&Main_17"); //$NON-NLS-1$
-  }
-
-  /**
-   * @see ILaunchConfigurationTab#isValid(org.eclipse.debug.core.ILaunchConfiguration)
-   */
-  public boolean isValid(ILaunchConfiguration launchConfig) {
-    setErrorMessage(null);
-    setMessage(null);
-    return validateLocation() && validateWorkDirectory();
-  }
-
-  /**
-   * Validates the content of the location field.
-   */
-  protected boolean validateLocation() {
-    String value = locationField.getText().trim();
-    if (value.length() < 1) {
-      setErrorMessage(ExternalToolsLaunchConfigurationMessages
-          .getString("ExternalToolsMainTab.External_tool_location_cannot_be_empty_18")); //$NON-NLS-1$
-      setMessage(null);
-      return false;
-    }
-
-    // Translate field contents to the actual file location so we
-    // can check to ensure the file actually exists.
-    MultiStatus multiStatus = new MultiStatus(IExternalToolConstants.PLUGIN_ID, 0, "", null); //$NON-NLS-1$
-    value = ToolUtil.expandFileLocation(value, ExpandVariableContext.EMPTY_CONTEXT, multiStatus);
-    if (!multiStatus.isOK()) {
-      IStatus[] children = multiStatus.getChildren();
-      if (children.length > 0) {
-        setErrorMessage(children[0].getMessage());
-        setMessage(null);
-      }
-      return false;
-    }
-
-    File file = new File(value);
-    if (!file.exists()) { // The file does not exist.
-      setErrorMessage(ExternalToolsLaunchConfigurationMessages
-          .getString("ExternalToolsMainTab.External_tool_location_does_not_exist_19")); //$NON-NLS-1$
-      return false;
-    }
-    if (!file.isFile()) {
-      setErrorMessage(ExternalToolsLaunchConfigurationMessages
-          .getString("ExternalToolsMainTab.External_tool_location_specified_is_not_a_file_20")); //$NON-NLS-1$
-      return false;
-    }
-    return true;
-  }
-
-  /**
-   * Validates the content of the working directory field.
-   */
-  protected boolean validateWorkDirectory() {
-
-    String value = workDirectoryField.getText().trim();
-    if (value.length() > 0) {
-      // Translate field contents to the actual directory location so we
-      // can check to ensure the directory actually exists.
-      MultiStatus multiStatus = new MultiStatus(IExternalToolConstants.PLUGIN_ID, 0, "", null); //$NON-NLS-1$
-      value = ToolUtil.expandDirectoryLocation(value, ExpandVariableContext.EMPTY_CONTEXT, multiStatus);
-      if (!multiStatus.isOK()) {
-        IStatus[] children = multiStatus.getChildren();
-        if (children.length > 0) {
-          setErrorMessage(children[0].getMessage());
-        }
-        return false;
-      }
-
-      File file = new File(value);
-      if (!file.exists()) { // The directory does not exist.
-        setErrorMessage(ExternalToolsLaunchConfigurationMessages
-            .getString("ExternalToolsMainTab.External_tool_working_directory_does_not_exist_or_is_invalid_21")); //$NON-NLS-1$
-        return false;
-      }
-    }
-    return true;
-  }
-
-  protected void handleLocationButtonSelected() {
-    FileDialog fileDialog = new FileDialog(getShell(), SWT.NONE);
-    fileDialog.setFileName(locationField.getText());
-    String text = fileDialog.open();
-    if (text != null) {
-      locationField.setText(text);
-    }
-  }
-
-  /**
-   * Prompts the user for a workspace location within the workspace and sets the location as a String containing the workspace_loc
-   * variable or <code>null</code> if no location was obtained from the user.
-   */
-  protected void handleWorkspaceLocationButtonSelected() {
-    ResourceSelectionDialog dialog;
-    dialog = new ResourceSelectionDialog(getShell(), ResourcesPlugin.getWorkspace().getRoot(),
-        ExternalToolsLaunchConfigurationMessages.getString("ExternalToolsMainTab.Select_a_resource_22")); //$NON-NLS-1$
-    dialog.open();
-    Object[] results = dialog.getResult();
-    if (results == null || results.length < 1) {
-      return;
-    }
-    IResource resource = (IResource) results[0];
-    StringBuffer buf = new StringBuffer();
-    ToolUtil.buildVariableTag(IExternalToolConstants.VAR_WORKSPACE_LOC, resource.getFullPath().toString(), buf);
-    String text = buf.toString();
-    if (text != null) {
-      locationField.setText(text);
-    }
-  }
-
-  /**
-   * Prompts the user for a working directory location within the workspace and sets the working directory as a String containing
-   * the workspace_loc variable or <code>null</code> if no location was obtained from the user.
-   */
-  protected void handleWorkspaceWorkingDirectoryButtonSelected() {
-    ContainerSelectionDialog containerDialog;
-    containerDialog = new ContainerSelectionDialog(getShell(), ResourcesPlugin.getWorkspace().getRoot(), false,
-        ExternalToolsLaunchConfigurationMessages.getString("ExternalToolsMainTab.&Select_a_directory__23")); //$NON-NLS-1$
-    containerDialog.open();
-    Object[] resource = containerDialog.getResult();
-    String text = null;
-    if (resource != null && resource.length > 0) {
-      text = ToolUtil.buildVariableTag(IExternalToolConstants.VAR_RESOURCE_LOC, ((IPath) resource[0]).toString());
-    }
-    if (text != null) {
-      workDirectoryField.setText(text);
-    }
-  }
-
-  protected void handleFileWorkingDirectoryButtonSelected() {
-    DirectoryDialog dialog = new DirectoryDialog(getShell(), SWT.SAVE);
-    dialog.setMessage(ExternalToolsLaunchConfigurationMessages.getString("ExternalToolsMainTab.&Select_a_directory__23")); //$NON-NLS-1$
-    dialog.setFilterPath(workDirectoryField.getText());
-    String text = dialog.open();
-    if (text != null) {
-      workDirectoryField.setText(text);
-    }
-  }
-
-  /**
-   * @see org.eclipse.debug.ui.ILaunchConfigurationTab#getImage()
-   */
-  public Image getImage() {
-    return ExternalToolsImages.getImage(IExternalToolConstants.IMG_TAB_MAIN);
-  }
-
-  /**
-   * Method getSelectionAdapter.
-   * 
-   * @return SelectionListener
-   */
-  protected SelectionListener getSelectionAdapter() {
-    if (selectionAdapter == null) {
-      selectionAdapter = new SelectionAdapter() {
-        public void widgetSelected(SelectionEvent e) {
-          updateLaunchConfigurationDialog();
-        }
-      };
-    }
-    return selectionAdapter;
-  }
-
-  private class VariableSelectionDialog extends SelectionDialog {
-    private ExternalToolVariableForm form;
-
-    private VariableSelectionDialog(Shell parent) {
-      super(parent);
-      setTitle(ExternalToolsLaunchConfigurationMessages.getString("ExternalToolsOptionTab.Select_variable_10")); //$NON-NLS-1$
-    }
-
-    protected Control createDialogArea(Composite parent) {
-      // Create the dialog area
-      Composite composite = (Composite) super.createDialogArea(parent);
-      ExternalToolVariable[] variables = ExternalToolsPlugin.getDefault().getArgumentVariableRegistry().getArgumentVariables();
-      form = new ExternalToolVariableForm(ExternalToolsLaunchConfigurationMessages
-          .getString("ExternalToolsOptionTab.&Choose_a_variable__11"), variables); //$NON-NLS-1$
-      form.createContents(composite, new IGroupDialogPage() {
-        public GridData setButtonGridData(Button button) {
-          GridData data = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
-          data.heightHint = convertVerticalDLUsToPixels(IDialogConstants.BUTTON_HEIGHT);
-          int widthHint = convertHorizontalDLUsToPixels(IDialogConstants.BUTTON_WIDTH);
-          data.widthHint = Math.max(widthHint, button.computeSize(SWT.DEFAULT, SWT.DEFAULT, true).x);
-          button.setLayoutData(data);
-          return data;
-        }
-
-        public void setMessage(String newMessage, int newType) {
-          VariableSelectionDialog.this.setMessage(newMessage);
-        }
-
-        public void updateValidState() {
-        }
-
-        public int convertHeightHint(int chars) {
-          return convertHeightInCharsToPixels(chars);
-        }
-
-        public String getMessage() {
-          if (!form.isValid()) {
-            return ExternalToolsLaunchConfigurationMessages.getString("ExternalToolsOptionTab.Invalid_selection_12"); //$NON-NLS-1$
-          }
-          return null;
-        }
-
-        public int getMessageType() {
-          if (!form.isValid()) {
-            return IMessageProvider.ERROR;
-          }
-          return 0;
-        }
-      });
-      return composite;
-    }
-
-    private ExternalToolVariableForm getForm() {
-      return form;
-    }
-  }
+	protected Combo locationField;
+
+	protected Text workDirectoryField;
+
+	protected Button fileLocationButton;
+
+	protected Button workspaceLocationButton;
+
+	protected Button fileWorkingDirectoryButton;
+
+	protected Button workspaceWorkingDirectoryButton;
+
+	protected Button runBackgroundButton;
+
+	protected Text argumentField;
+
+	protected Button variableButton;
+
+	protected SelectionAdapter selectionAdapter;
+
+	protected ModifyListener modifyListener = new ModifyListener() {
+		public void modifyText(ModifyEvent e) {
+			updateLaunchConfigurationDialog();
+		}
+	};
+
+	/**
+	 * @see org.eclipse.debug.ui.ILaunchConfigurationTab#createControl(org.eclipse.swt.widgets.Composite)
+	 */
+	public void createControl(Composite parent) {
+		Composite mainComposite = new Composite(parent, SWT.NONE);
+		setControl(mainComposite);
+		GridLayout layout = new GridLayout();
+		layout.numColumns = 2;
+		GridData gridData = new GridData(GridData.FILL_HORIZONTAL);
+		mainComposite.setLayout(layout);
+		mainComposite.setLayoutData(gridData);
+		mainComposite.setFont(parent.getFont());
+		createLocationComponent(mainComposite);
+		createWorkDirectoryComponent(mainComposite);
+		createArgumentComponent(mainComposite);
+		createVerticalSpacer(mainComposite, 2);
+		createRunBackgroundComponent(mainComposite);
+	}
+
+	/**
+	 * Creates the controls needed to edit the location attribute of an external
+	 * tool
+	 * 
+	 * @param parent
+	 *            the composite to create the controls in
+	 */
+	protected void createLocationComponent(Composite parent) {
+		Font font = parent.getFont();
+
+		Composite composite = new Composite(parent, SWT.NONE);
+		GridLayout layout = new GridLayout();
+		layout.marginWidth = 0;
+		layout.marginHeight = 0;
+		layout.numColumns = 1;
+		GridData gridData = new GridData(GridData.FILL_HORIZONTAL);
+		composite.setLayout(layout);
+		composite.setLayoutData(gridData);
+
+		Label label = new Label(composite, SWT.NONE);
+		label.setText(ExternalToolsLaunchConfigurationMessages
+				.getString("ExternalToolsMainTab.&Location___2")); //$NON-NLS-1$
+		label.setFont(font);
+
+		final IPreferenceStore store = ExternalToolsPlugin.getDefault()
+				.getPreferenceStore();
+		locationField = new Combo(composite, SWT.DROP_DOWN | SWT.BORDER);
+		GridData data = new GridData(GridData.FILL_HORIZONTAL);
+		data.widthHint = IDialogConstants.ENTRY_FIELD_WIDTH;
+		locationField.setLayoutData(data);
+		locationField.setFont(font);
+		locationField.add(store.getString(ExternalToolsPlugin.PHP_RUN_PREF), 0);
+		locationField.add(store.getString(ExternalToolsPlugin.APACHE_RUN_PREF),
+				1);
+		locationField.add(store.getString(ExternalToolsPlugin.MYSQL_RUN_PREF),
+				2);
+		locationField.add(
+				store.getString(ExternalToolsPlugin.XAMPP_START_PREF), 3);
+		locationField.add(store.getString(ExternalToolsPlugin.XAMPP_STOP_PREF),
+				4);
+		Composite buttonComposite = new Composite(parent, SWT.NONE);
+		layout = new GridLayout();
+		layout.marginWidth = 0;
+		layout.marginHeight = 0;
+		layout.numColumns = 1;
+		gridData = new GridData(GridData.HORIZONTAL_ALIGN_END);
+		buttonComposite.setLayout(layout);
+		buttonComposite.setLayoutData(gridData);
+		buttonComposite.setFont(font);
+
+		createVerticalSpacer(buttonComposite, 1);
+
+		workspaceLocationButton = createPushButton(
+				buttonComposite,
+				ExternalToolsLaunchConfigurationMessages
+						.getString("ExternalToolsMainTab.&Browse_Workspace..._3"), null); //$NON-NLS-1$
+		workspaceLocationButton.addSelectionListener(new SelectionAdapter() {
+			public void widgetSelected(SelectionEvent evt) {
+				handleWorkspaceLocationButtonSelected();
+			}
+		});
+		fileLocationButton = createPushButton(
+				buttonComposite,
+				ExternalToolsLaunchConfigurationMessages
+						.getString("ExternalToolsMainTab.Brows&e_File_System..._4"), null); //$NON-NLS-1$
+		fileLocationButton.addSelectionListener(new SelectionAdapter() {
+			public void widgetSelected(SelectionEvent evt) {
+				handleLocationButtonSelected();
+			}
+		});
+	}
+
+	/**
+	 * Creates the controls needed to edit the working directory attribute of an
+	 * external tool
+	 * 
+	 * @param parent
+	 *            the composite to create the controls in
+	 */
+	protected void createWorkDirectoryComponent(Composite parent) {
+		Font font = parent.getFont();
+
+		Composite composite = new Composite(parent, SWT.NONE);
+		GridLayout layout = new GridLayout();
+		layout.marginWidth = 0;
+		layout.marginHeight = 0;
+		layout.numColumns = 1;
+		GridData gridData = new GridData(GridData.FILL_HORIZONTAL);
+		composite.setLayout(layout);
+		composite.setLayoutData(gridData);
+
+		Label label = new Label(composite, SWT.NONE);
+		label.setText(ExternalToolsLaunchConfigurationMessages
+				.getString("ExternalToolsMainTab.Working_&Directory__5")); //$NON-NLS-1$
+		label.setFont(font);
+
+		workDirectoryField = new Text(composite, SWT.BORDER);
+		GridData data = new GridData(GridData.FILL_HORIZONTAL);
+		data.widthHint = IDialogConstants.ENTRY_FIELD_WIDTH;
+		workDirectoryField.setLayoutData(data);
+		workDirectoryField.setFont(font);
+
+		Composite buttonComposite = new Composite(parent, SWT.NONE);
+		layout = new GridLayout();
+		layout.marginWidth = 0;
+		layout.marginHeight = 0;
+		layout.numColumns = 1;
+		gridData = new GridData(GridData.HORIZONTAL_ALIGN_END);
+		buttonComposite.setLayout(layout);
+		buttonComposite.setLayoutData(gridData);
+		buttonComposite.setFont(font);
+
+		createVerticalSpacer(buttonComposite, 1);
+		workspaceWorkingDirectoryButton = createPushButton(
+				buttonComposite,
+				ExternalToolsLaunchConfigurationMessages
+						.getString("ExternalToolsMainTab.Browse_Wor&kspace..._6"), null); //$NON-NLS-1$
+		workspaceWorkingDirectoryButton
+				.addSelectionListener(new SelectionAdapter() {
+					public void widgetSelected(SelectionEvent evt) {
+						handleWorkspaceWorkingDirectoryButtonSelected();
+					}
+				});
+		fileWorkingDirectoryButton = createPushButton(
+				buttonComposite,
+				ExternalToolsLaunchConfigurationMessages
+						.getString("ExternalToolsMainTab.Browse_F&ile_System..._7"), null); //$NON-NLS-1$
+		fileWorkingDirectoryButton.addSelectionListener(new SelectionAdapter() {
+			public void widgetSelected(SelectionEvent evt) {
+				handleFileWorkingDirectoryButtonSelected();
+			}
+		});
+	}
+
+	/**
+	 * Creates the controls needed to edit the argument and prompt for argument
+	 * attributes of an external tool
+	 * 
+	 * @param parent
+	 *            the composite to create the controls in
+	 */
+	protected void createArgumentComponent(Composite parent) {
+		Font font = parent.getFont();
+
+		Label label = new Label(parent, SWT.NONE);
+		label.setText(ExternalToolsLaunchConfigurationMessages
+				.getString("ExternalToolsOptionTab.&Arguments___1")); //$NON-NLS-1$
+		GridData data = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
+		data.horizontalSpan = 2;
+		label.setLayoutData(data);
+		label.setFont(font);
+
+		argumentField = new Text(parent, SWT.BORDER);
+		data = new GridData(GridData.FILL_HORIZONTAL);
+		data.widthHint = IDialogConstants.ENTRY_FIELD_WIDTH;
+		argumentField.setLayoutData(data);
+		argumentField.setFont(font);
+		argumentField.addModifyListener(new ModifyListener() {
+			public void modifyText(ModifyEvent e) {
+				updateLaunchConfigurationDialog();
+			}
+		});
+
+		variableButton = createPushButton(
+				parent,
+				ExternalToolsLaunchConfigurationMessages
+						.getString("ExternalToolsOptionTab.Varia&bles..._2"), null); //$NON-NLS-1$
+		variableButton.addSelectionListener(new SelectionAdapter() {
+			public void widgetSelected(SelectionEvent e) {
+				VariableSelectionDialog dialog = new VariableSelectionDialog(
+						getShell());
+				if (dialog.open() == SelectionDialog.OK) {
+					argumentField
+							.insert(dialog.getForm().getSelectedVariable());
+				}
+			}
+		});
+
+		Label instruction = new Label(parent, SWT.NONE);
+		instruction
+				.setText(ExternalToolsLaunchConfigurationMessages
+						.getString("ExternalToolsOptionTab.Note__Enclose_an_argument_containing_spaces_using_double-quotes_(__)._Not_applicable_for_variables._3")); //$NON-NLS-1$
+		data = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
+		data.horizontalSpan = 2;
+		instruction.setLayoutData(data);
+		instruction.setFont(font);
+	}
+
+	/**
+	 * Creates the controls needed to edit the run in background attribute of an
+	 * external tool
+	 * 
+	 * @param parent
+	 *            the composite to create the controls in
+	 */
+	protected void createRunBackgroundComponent(Composite parent) {
+		runBackgroundButton = new Button(parent, SWT.CHECK);
+		runBackgroundButton.setText(ExternalToolsLaunchConfigurationMessages
+				.getString("ExternalToolsOptionTab.Run_tool_in_bac&kground_4")); //$NON-NLS-1$
+		GridData data = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
+		runBackgroundButton.setLayoutData(data);
+		runBackgroundButton.setFont(parent.getFont());
+		runBackgroundButton.addSelectionListener(getSelectionAdapter());
+	}
+
+	/**
+	 * @see org.eclipse.debug.ui.ILaunchConfigurationTab#setDefaults(org.eclipse.debug.core.ILaunchConfigurationWorkingCopy)
+	 */
+	public void setDefaults(ILaunchConfigurationWorkingCopy configuration) {
+		configuration.setAttribute(
+				IExternalToolConstants.ATTR_RUN_IN_BACKGROUND, false);
+	}
+
+	/**
+	 * @see org.eclipse.debug.ui.ILaunchConfigurationTab#initializeFrom(org.eclipse.debug.core.ILaunchConfiguration)
+	 */
+	public void initializeFrom(ILaunchConfiguration configuration) {
+		updateLocation(configuration);
+		updateWorkingDirectory(configuration);
+		updateArgument(configuration);
+		updateRunBackground(configuration);
+	}
+
+	protected void updateWorkingDirectory(ILaunchConfiguration configuration) {
+		String workingDir = ""; //$NON-NLS-1$
+		try {
+			workingDir = configuration.getAttribute(
+					IExternalToolConstants.ATTR_WORKING_DIRECTORY, ""); //$NON-NLS-1$
+		} catch (CoreException ce) {
+			ExternalToolsPlugin
+					.getDefault()
+					.log(
+							ExternalToolsLaunchConfigurationMessages
+									.getString("ExternalToolsMainTab.Error_reading_configuration_10"), ce); //$NON-NLS-1$
+		}
+		workDirectoryField.setText(workingDir);
+		workDirectoryField.addModifyListener(modifyListener);
+
+	}
+
+	protected void updateLocation(ILaunchConfiguration configuration) {
+		String location = ""; //$NON-NLS-1$
+		try {
+			location = configuration.getAttribute(
+					IExternalToolConstants.ATTR_LOCATION, ""); //$NON-NLS-1$
+		} catch (CoreException ce) {
+			ExternalToolsPlugin
+					.getDefault()
+					.log(
+							ExternalToolsLaunchConfigurationMessages
+									.getString("ExternalToolsMainTab.Error_reading_configuration_10"), ce); //$NON-NLS-1$
+		}
+		locationField.setText(location);
+		locationField.addModifyListener(modifyListener);
+	}
+
+	protected void updateArgument(ILaunchConfiguration configuration) {
+		String arguments = ""; //$NON-NLS-1$
+		try {
+			arguments = configuration.getAttribute(
+					IExternalToolConstants.ATTR_TOOL_ARGUMENTS, ""); //$NON-NLS-1$
+		} catch (CoreException ce) {
+			ExternalToolsPlugin
+					.getDefault()
+					.log(
+							ExternalToolsLaunchConfigurationMessages
+									.getString("ExternalToolsOptionTab.Error_reading_configuration_7"), ce); //$NON-NLS-1$
+		}
+		argumentField.setText(arguments);
+	}
+
+	protected void updateRunBackground(ILaunchConfiguration configuration) {
+		boolean runInBackgroud = true;
+		try {
+			runInBackgroud = configuration.getAttribute(
+					IExternalToolConstants.ATTR_RUN_IN_BACKGROUND, false);
+		} catch (CoreException ce) {
+			ExternalToolsPlugin
+					.getDefault()
+					.log(
+							ExternalToolsLaunchConfigurationMessages
+									.getString("ExternalToolsOptionTab.Error_reading_configuration_7"), ce); //$NON-NLS-1$
+		}
+		runBackgroundButton.setSelection(runInBackgroud);
+	}
+
+	/**
+	 * @see org.eclipse.debug.ui.ILaunchConfigurationTab#performApply(org.eclipse.debug.core.ILaunchConfigurationWorkingCopy)
+	 */
+	public void performApply(ILaunchConfigurationWorkingCopy configuration) {
+		String location = locationField.getText().trim();
+		if (location.length() == 0) {
+			configuration.setAttribute(IExternalToolConstants.ATTR_LOCATION,
+					(String) null);
+		} else {
+			configuration.setAttribute(IExternalToolConstants.ATTR_LOCATION,
+					location);
+		}
+
+		String workingDirectory = workDirectoryField.getText().trim();
+		if (workingDirectory.length() == 0) {
+			configuration.setAttribute(
+					IExternalToolConstants.ATTR_WORKING_DIRECTORY,
+					(String) null);
+		} else {
+			configuration.setAttribute(
+					IExternalToolConstants.ATTR_WORKING_DIRECTORY,
+					workingDirectory);
+		}
+
+		setAttribute(IExternalToolConstants.ATTR_RUN_IN_BACKGROUND,
+				configuration, runBackgroundButton.getSelection(), false);
+
+		String arguments = argumentField.getText().trim();
+		if (arguments.length() == 0) {
+			configuration.setAttribute(
+					IExternalToolConstants.ATTR_TOOL_ARGUMENTS, (String) null);
+		} else {
+			configuration.setAttribute(
+					IExternalToolConstants.ATTR_TOOL_ARGUMENTS, arguments);
+		}
+	}
+
+	/**
+	 * @see org.eclipse.debug.ui.ILaunchConfigurationTab#getName()
+	 */
+	public String getName() {
+		return ExternalToolsLaunchConfigurationMessages
+				.getString("ExternalToolsMainTab.&Main_17"); //$NON-NLS-1$
+	}
+
+	/**
+	 * @see ILaunchConfigurationTab#isValid(org.eclipse.debug.core.ILaunchConfiguration)
+	 */
+	public boolean isValid(ILaunchConfiguration launchConfig) {
+		setErrorMessage(null);
+		setMessage(null);
+		return validateLocation() && validateWorkDirectory();
+	}
+
+	/**
+	 * Validates the content of the location field.
+	 */
+	protected boolean validateLocation() {
+		String value = locationField.getText().trim();
+		if (value.length() < 1) {
+			setErrorMessage(ExternalToolsLaunchConfigurationMessages
+					.getString("ExternalToolsMainTab.External_tool_location_cannot_be_empty_18")); //$NON-NLS-1$
+			setMessage(null);
+			return false;
+		}
+
+		// Translate field contents to the actual file location so we
+		// can check to ensure the file actually exists.
+		MultiStatus multiStatus = new MultiStatus(
+				IExternalToolConstants.PLUGIN_ID, 0, "", null); //$NON-NLS-1$
+		value = ToolUtil.expandFileLocation(value,
+				ExpandVariableContext.EMPTY_CONTEXT, multiStatus);
+		if (!multiStatus.isOK()) {
+			IStatus[] children = multiStatus.getChildren();
+			if (children.length > 0) {
+				setErrorMessage(children[0].getMessage());
+				setMessage(null);
+			}
+			return false;
+		}
+
+		File file = new File(value);
+		if (!file.exists()) { // The file does not exist.
+			setErrorMessage(ExternalToolsLaunchConfigurationMessages
+					.getString("ExternalToolsMainTab.External_tool_location_does_not_exist_19")); //$NON-NLS-1$
+			return false;
+		}
+		if (!file.isFile()) {
+			setErrorMessage(ExternalToolsLaunchConfigurationMessages
+					.getString("ExternalToolsMainTab.External_tool_location_specified_is_not_a_file_20")); //$NON-NLS-1$
+			return false;
+		}
+		return true;
+	}
+
+	/**
+	 * Validates the content of the working directory field.
+	 */
+	protected boolean validateWorkDirectory() {
+
+		String value = workDirectoryField.getText().trim();
+		if (value.length() > 0) {
+			// Translate field contents to the actual directory location so we
+			// can check to ensure the directory actually exists.
+			MultiStatus multiStatus = new MultiStatus(
+					IExternalToolConstants.PLUGIN_ID, 0, "", null); //$NON-NLS-1$
+			value = ToolUtil.expandDirectoryLocation(value,
+					ExpandVariableContext.EMPTY_CONTEXT, multiStatus);
+			if (!multiStatus.isOK()) {
+				IStatus[] children = multiStatus.getChildren();
+				if (children.length > 0) {
+					setErrorMessage(children[0].getMessage());
+				}
+				return false;
+			}
+
+			File file = new File(value);
+			if (!file.exists()) { // The directory does not exist.
+				setErrorMessage(ExternalToolsLaunchConfigurationMessages
+						.getString("ExternalToolsMainTab.External_tool_working_directory_does_not_exist_or_is_invalid_21")); //$NON-NLS-1$
+				return false;
+			}
+		}
+		return true;
+	}
+
+	protected void handleLocationButtonSelected() {
+		FileDialog fileDialog = new FileDialog(getShell(), SWT.NONE);
+		fileDialog.setFileName(locationField.getText());
+		String text = fileDialog.open();
+		if (text != null) {
+			locationField.setText(text);
+		}
+	}
+
+	/**
+	 * Prompts the user for a workspace location within the workspace and sets
+	 * the location as a String containing the workspace_loc variable or
+	 * <code>null</code> if no location was obtained from the user.
+	 */
+	protected void handleWorkspaceLocationButtonSelected() {
+		ResourceSelectionDialog dialog;
+		dialog = new ResourceSelectionDialog(getShell(), ResourcesPlugin
+				.getWorkspace().getRoot(),
+				ExternalToolsLaunchConfigurationMessages
+						.getString("ExternalToolsMainTab.Select_a_resource_22")); //$NON-NLS-1$
+		dialog.open();
+		Object[] results = dialog.getResult();
+		if (results == null || results.length < 1) {
+			return;
+		}
+		IResource resource = (IResource) results[0];
+		StringBuffer buf = new StringBuffer();
+		ToolUtil.buildVariableTag(IExternalToolConstants.VAR_WORKSPACE_LOC,
+				resource.getFullPath().toString(), buf);
+		String text = buf.toString();
+		if (text != null) {
+			locationField.setText(text);
+		}
+	}
+
+	/**
+	 * Prompts the user for a working directory location within the workspace
+	 * and sets the working directory as a String containing the workspace_loc
+	 * variable or <code>null</code> if no location was obtained from the
+	 * user.
+	 */
+	protected void handleWorkspaceWorkingDirectoryButtonSelected() {
+		ContainerSelectionDialog containerDialog;
+		containerDialog = new ContainerSelectionDialog(
+				getShell(),
+				ResourcesPlugin.getWorkspace().getRoot(),
+				false,
+				ExternalToolsLaunchConfigurationMessages
+						.getString("ExternalToolsMainTab.&Select_a_directory__23")); //$NON-NLS-1$
+		containerDialog.open();
+		Object[] resource = containerDialog.getResult();
+		String text = null;
+		if (resource != null && resource.length > 0) {
+			text = ToolUtil.buildVariableTag(
+					IExternalToolConstants.VAR_RESOURCE_LOC,
+					((IPath) resource[0]).toString());
+		}
+		if (text != null) {
+			workDirectoryField.setText(text);
+		}
+	}
+
+	protected void handleFileWorkingDirectoryButtonSelected() {
+		DirectoryDialog dialog = new DirectoryDialog(getShell(), SWT.SAVE);
+		dialog.setMessage(ExternalToolsLaunchConfigurationMessages
+				.getString("ExternalToolsMainTab.&Select_a_directory__23")); //$NON-NLS-1$
+		dialog.setFilterPath(workDirectoryField.getText());
+		String text = dialog.open();
+		if (text != null) {
+			workDirectoryField.setText(text);
+		}
+	}
+
+	/**
+	 * @see org.eclipse.debug.ui.ILaunchConfigurationTab#getImage()
+	 */
+	public Image getImage() {
+		return ExternalToolsImages
+				.getImage(IExternalToolConstants.IMG_TAB_MAIN);
+	}
+
+	/**
+	 * Method getSelectionAdapter.
+	 * 
+	 * @return SelectionListener
+	 */
+	protected SelectionListener getSelectionAdapter() {
+		if (selectionAdapter == null) {
+			selectionAdapter = new SelectionAdapter() {
+				public void widgetSelected(SelectionEvent e) {
+					updateLaunchConfigurationDialog();
+				}
+			};
+		}
+		return selectionAdapter;
+	}
+
+	private class VariableSelectionDialog extends SelectionDialog {
+		private ExternalToolVariableForm form;
+
+		private VariableSelectionDialog(Shell parent) {
+			super(parent);
+			setTitle(ExternalToolsLaunchConfigurationMessages
+					.getString("ExternalToolsOptionTab.Select_variable_10")); //$NON-NLS-1$
+		}
+
+		protected Control createDialogArea(Composite parent) {
+			// Create the dialog area
+			Composite composite = (Composite) super.createDialogArea(parent);
+			ExternalToolVariable[] variables = ExternalToolsPlugin.getDefault()
+					.getArgumentVariableRegistry().getArgumentVariables();
+			form = new ExternalToolVariableForm(
+					ExternalToolsLaunchConfigurationMessages
+							.getString("ExternalToolsOptionTab.&Choose_a_variable__11"), variables); //$NON-NLS-1$
+			form.createContents(composite, new IGroupDialogPage() {
+				public GridData setButtonGridData(Button button) {
+					GridData data = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
+					data.heightHint = convertVerticalDLUsToPixels(IDialogConstants.BUTTON_HEIGHT);
+					int widthHint = convertHorizontalDLUsToPixels(IDialogConstants.BUTTON_WIDTH);
+					data.widthHint = Math.max(widthHint, button.computeSize(
+							SWT.DEFAULT, SWT.DEFAULT, true).x);
+					button.setLayoutData(data);
+					return data;
+				}
+
+				public void setMessage(String newMessage, int newType) {
+					VariableSelectionDialog.this.setMessage(newMessage);
+				}
+
+				public void updateValidState() {
+				}
+
+				public int convertHeightHint(int chars) {
+					return convertHeightInCharsToPixels(chars);
+				}
+
+				public String getMessage() {
+					if (!form.isValid()) {
+						return ExternalToolsLaunchConfigurationMessages
+								.getString("ExternalToolsOptionTab.Invalid_selection_12"); //$NON-NLS-1$
+					}
+					return null;
+				}
+
+				public int getMessageType() {
+					if (!form.isValid()) {
+						return IMessageProvider.ERROR;
+					}
+					return 0;
+				}
+			});
+			return composite;
+		}
+
+		private ExternalToolVariableForm getForm() {
+			return form;
+		}
+	}
 
 }
\ No newline at end of file