package net.sourceforge.phpdt.externaltools.launchConfigurations;
/***********************************************************************************************************************************
* Copyright (c) 2000, 2002 IBM Corp. All rights reserved. This file is 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
**********************************************************************************************************************************/
import java.io.File;
import net.sourceforge.phpdt.externaltools.group.IGroupDialogPage;
import net.sourceforge.phpdt.externaltools.internal.dialog.ExternalToolVariableForm;
import net.sourceforge.phpdt.externaltools.internal.model.ExternalToolsImages;
import net.sourceforge.phpdt.externaltools.internal.model.ExternalToolsPlugin;
import net.sourceforge.phpdt.externaltools.internal.registry.ExternalToolVariable;
import net.sourceforge.phpdt.externaltools.model.IExternalToolConstants;
import net.sourceforge.phpdt.externaltools.model.ToolUtil;
import net.sourceforge.phpdt.externaltools.variable.ExpandVariableContext;
import net.sourceforge.phpeclipse.PHPeclipsePlugin;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.MultiStatus;
import org.eclipse.debug.core.ILaunchConfiguration;
import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
import org.eclipse.debug.ui.AbstractLaunchConfigurationTab;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.dialogs.IMessageProvider;
import org.eclipse.jface.preference.IPreferenceStore;
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.events.SelectionListener;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.DirectoryDialog;
import org.eclipse.swt.widgets.FileDialog;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.dialogs.ContainerSelectionDialog;
import org.eclipse.ui.dialogs.ResourceSelectionDialog;
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 = PHPeclipsePlugin.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(PHPeclipsePlugin.PHP_RUN_PREF), 0);
locationField.add(store.getString(PHPeclipsePlugin.APACHE_RUN_PREF), 1);
locationField.add(store.getString(PHPeclipsePlugin.MYSQL_RUN_PREF), 2);
locationField.add(store.getString(PHPeclipsePlugin.XAMPP_START_PREF), 3);
locationField.add(store.getString(PHPeclipsePlugin.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 null
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 null
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;
}
}
}