blob: 1a9ce5ca6334c9d2028c86b6ac95864dcd41dc5b [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2008-2014 Sonatype, Inc.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* Sonatype, Inc. - initial API and implementation
* Lars Vogel <Lars.Vogel@gmail.com> - Bug 344997, remove goal selection button
*******************************************************************************/
package org.eclipse.m2e.ui.internal.launch;
import java.io.File;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
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.variables.VariablesPlugin;
import org.eclipse.debug.core.ILaunchConfiguration;
import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
import org.eclipse.debug.ui.AbstractLaunchConfigurationTab;
import org.eclipse.debug.ui.StringVariableSelectionDialog;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.FocusAdapter;
import org.eclipse.swt.events.FocusEvent;
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.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.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.swt.widgets.TableItem;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.dialogs.ContainerSelectionDialog;
import org.eclipse.ui.dialogs.ElementTreeSelectionDialog;
import org.eclipse.ui.model.BaseWorkbenchContentProvider;
import org.eclipse.ui.model.WorkbenchLabelProvider;
import org.apache.maven.cli.configuration.SettingsXmlConfigurationProcessor;
import org.eclipse.m2e.actions.MavenLaunchConstants;
import org.eclipse.m2e.core.MavenPlugin;
import org.eclipse.m2e.core.embedder.IMavenConfiguration;
import org.eclipse.m2e.core.ui.internal.MavenImages;
import org.eclipse.m2e.core.ui.internal.dialogs.MavenPropertyDialog;
import org.eclipse.m2e.internal.launch.LaunchingUtils;
import org.eclipse.m2e.internal.launch.Messages;
/**
* Maven Launch dialog Main tab
*
* @author Dmitri Maximovich
* @author Eugene Kuleshov
*/
@SuppressWarnings("restriction")
public class MavenLaunchMainTab extends AbstractLaunchConfigurationTab implements MavenLaunchConstants {
private static final Logger log = LoggerFactory.getLogger(MavenLaunchMainTab.class);
public static final String ID_EXTERNAL_TOOLS_LAUNCH_GROUP = "org.eclipse.ui.externaltools.launchGroup"; //$NON-NLS-1$
protected Text pomDirNameText;
protected Text goalsText;
protected Text goalsAutoBuildText;
protected Text goalsManualBuildText;
protected Text goalsCleanText;
protected Text goalsAfterCleanText;
protected Text profilesText;
protected Table propsTable;
private Button offlineButton;
private Button updateSnapshotsButton;
private Button debugOutputButton;
private Button skipTestsButton;
private Button nonRecursiveButton;
private Button enableWorkspaceResolution;
private Button removePropButton;
private Button editPropButton;
private Combo threadsCombo;
private MavenRuntimeSelector runtimeSelector;
private Text userSettings;
public MavenLaunchMainTab() {
}
public Image getImage() {
return MavenImages.IMG_LAUNCH_MAIN;
}
/**
* @wbp.parser.entryPoint
*/
public void createControl(Composite parent) {
Composite mainComposite = new Composite(parent, SWT.NONE);
setControl(mainComposite);
//PlatformUI.getWorkbench().getHelpSystem().setHelp(mainComposite, IAntUIHelpContextIds.ANT_MAIN_TAB);
GridLayout layout = new GridLayout();
layout.numColumns = 5;
GridData gridData = new GridData(GridData.FILL_HORIZONTAL);
mainComposite.setLayout(layout);
mainComposite.setLayoutData(gridData);
mainComposite.setFont(parent.getFont());
class Listener implements ModifyListener, SelectionListener {
public void modifyText(ModifyEvent e) {
entriesChanged();
}
public void widgetDefaultSelected(SelectionEvent e) {
entriesChanged();
}
public void widgetSelected(SelectionEvent e) {
entriesChanged();
}
}
Listener modyfyingListener = new Listener();
Label label = new Label(mainComposite, SWT.NONE);
label.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false, 5, 1));
label.setText(Messages.launchPomGroup);
this.pomDirNameText = new Text(mainComposite, SWT.BORDER);
this.pomDirNameText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false, 5, 1));
this.pomDirNameText.addModifyListener(modyfyingListener);
final Composite pomDirButtonsComposite = new Composite(mainComposite, SWT.NONE);
pomDirButtonsComposite.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 5, 1));
final GridLayout pomDirButtonsGridLayout = new GridLayout();
pomDirButtonsGridLayout.marginWidth = 0;
pomDirButtonsGridLayout.marginHeight = 0;
pomDirButtonsGridLayout.numColumns = 3;
pomDirButtonsComposite.setLayout(pomDirButtonsGridLayout);
final Button browseWorkspaceButton = new Button(pomDirButtonsComposite, SWT.NONE);
browseWorkspaceButton.setText(Messages.launchBrowseWorkspace);
browseWorkspaceButton
.addSelectionListener(new BrowseWorkspaceDirAction(pomDirNameText, Messages.launchChoosePomDir));
final Button browseFilesystemButton = new Button(pomDirButtonsComposite, SWT.NONE);
browseFilesystemButton.setText(Messages.launchBrowseFs);
browseFilesystemButton.addSelectionListener(new BrowseDirAction(pomDirNameText));
final Button browseVariablesButton = new Button(pomDirButtonsComposite, SWT.NONE);
browseVariablesButton.setText(Messages.launchBrowseVariables);
browseVariablesButton.addSelectionListener(new VariablesAction(pomDirNameText));
// pom file
// goals
Label goalsLabel = new Label(mainComposite, SWT.NONE);
GridData gd_goalsLabel = new GridData();
gd_goalsLabel.horizontalAlignment = SWT.RIGHT;
gd_goalsLabel.verticalIndent = 7;
goalsLabel.setLayoutData(gd_goalsLabel);
goalsLabel.setText(Messages.launchGoalsLabel); //$NON-NLS-1$
goalsText = new Text(mainComposite, SWT.BORDER);
goalsText.setData("name", "goalsText"); //$NON-NLS-1$ //$NON-NLS-2$
GridData gd_goalsText = new GridData(SWT.FILL, SWT.CENTER, true, false, 4, 1);
gd_goalsText.verticalIndent = 7;
goalsText.setLayoutData(gd_goalsText);
goalsText.addModifyListener(modyfyingListener);
goalsText.addFocusListener(new GoalsFocusListener(goalsText));
Label profilesLabel = new Label(mainComposite, SWT.NONE);
profilesLabel.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1));
profilesLabel.setText(Messages.launchProfilesLabel); //$NON-NLS-1$
// profilesLabel.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false));
profilesText = new Text(mainComposite, SWT.BORDER);
profilesText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 4, 1));
profilesText.addModifyListener(modyfyingListener);
Label lblUserSettings = new Label(mainComposite, SWT.NONE);
lblUserSettings.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1));
lblUserSettings.setText(Messages.MavenLaunchMainTab_lblUserSettings_text);
userSettings = new Text(mainComposite, SWT.BORDER);
userSettings.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 4, 1));
userSettings.addModifyListener(modyfyingListener);
final Composite userSettingsButtonsComposite = new Composite(mainComposite, SWT.NONE);
userSettingsButtonsComposite.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 5, 1));
final GridLayout userSettingsButtonsGridLayout = new GridLayout();
userSettingsButtonsGridLayout.marginWidth = 0;
userSettingsButtonsGridLayout.marginHeight = 0;
userSettingsButtonsGridLayout.numColumns = 3;
userSettingsButtonsComposite.setLayout(userSettingsButtonsGridLayout);
final Button userSettingsWorkspaceButton = new Button(userSettingsButtonsComposite, SWT.NONE);
userSettingsWorkspaceButton.setText(Messages.launchBrowseWorkspace);
userSettingsWorkspaceButton
.addSelectionListener(new BrowseWorkspaceFileAction(userSettings, Messages.launchChooseSettingsFile));
final Button userSettingsFilesystemButton = new Button(userSettingsButtonsComposite, SWT.NONE);
userSettingsFilesystemButton.setText(Messages.launchBrowseFs);
userSettingsFilesystemButton.addSelectionListener(new BrowseFileAction(userSettings, new String[] {"*.xml"}));
final Button userSettingsVariablesButton = new Button(userSettingsButtonsComposite, SWT.NONE);
userSettingsVariablesButton.setText(Messages.launchBrowseVariables);
userSettingsVariablesButton.addSelectionListener(new VariablesAction(userSettings));
new Label(mainComposite, SWT.NONE);
offlineButton = new Button(mainComposite, SWT.CHECK);
offlineButton.setToolTipText("-o");
offlineButton.setText(org.eclipse.m2e.internal.launch.Messages.MavenLaunchMainTab_btnOffline);
offlineButton.addSelectionListener(modyfyingListener);
updateSnapshotsButton = new Button(mainComposite, SWT.CHECK);
updateSnapshotsButton.setToolTipText("-U"); //$NON-NLS-1$
updateSnapshotsButton.addSelectionListener(modyfyingListener);
GridData gd_updateSnapshotsButton = new GridData(SWT.LEFT, SWT.CENTER, false, false, 3, 1);
gd_updateSnapshotsButton.horizontalIndent = 10;
updateSnapshotsButton.setLayoutData(gd_updateSnapshotsButton);
updateSnapshotsButton.setText(org.eclipse.m2e.internal.launch.Messages.MavenLaunchMainTab_btnUpdateSnapshots);
new Label(mainComposite, SWT.NONE);
debugOutputButton = new Button(mainComposite, SWT.CHECK);
debugOutputButton.setToolTipText("-X -e"); //$NON-NLS-1$
debugOutputButton.addSelectionListener(modyfyingListener);
debugOutputButton.setText(org.eclipse.m2e.internal.launch.Messages.MavenLaunchMainTab_btnDebugOutput);
skipTestsButton = new Button(mainComposite, SWT.CHECK);
skipTestsButton.setToolTipText("-Dmaven.test.skip=true"); //$NON-NLS-1$
skipTestsButton.addSelectionListener(modyfyingListener);
GridData gd_skipTestsButton = new GridData();
gd_skipTestsButton.horizontalIndent = 10;
skipTestsButton.setLayoutData(gd_skipTestsButton);
skipTestsButton.setText(org.eclipse.m2e.internal.launch.Messages.MavenLaunchMainTab_btnSkipTests);
nonRecursiveButton = new Button(mainComposite, SWT.CHECK);
GridData gd_nonrecursiveButton = new GridData(SWT.LEFT, SWT.CENTER, false, false, 2, 1);
gd_nonrecursiveButton.horizontalIndent = 10;
nonRecursiveButton.setLayoutData(gd_nonrecursiveButton);
nonRecursiveButton.setText(org.eclipse.m2e.internal.launch.Messages.MavenLaunchMainTab_btnNotRecursive);
nonRecursiveButton.setToolTipText("-N"); //$NON-NLS-1$
nonRecursiveButton.setData("name", "nonRecursiveButton"); //$NON-NLS-1$ //$NON-NLS-2$
nonRecursiveButton.addSelectionListener(modyfyingListener);
new Label(mainComposite, SWT.NONE);
enableWorkspaceResolution = new Button(mainComposite, SWT.CHECK);
enableWorkspaceResolution.addSelectionListener(modyfyingListener);
enableWorkspaceResolution.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false, 4, 1));
enableWorkspaceResolution.setData("name", "enableWorkspaceResolution"); //$NON-NLS-1$ //$NON-NLS-2$
enableWorkspaceResolution.setText(org.eclipse.m2e.internal.launch.Messages.MavenLaunchMainTab_btnResolveWorkspace);
{
final int processors = Runtime.getRuntime().availableProcessors();
new Label(mainComposite, SWT.NONE);
Composite composite = new Composite(mainComposite, SWT.NONE);
composite.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false, 2, 1));
GridLayout gridLayout = new GridLayout(2, false);
gridLayout.marginWidth = 0;
gridLayout.marginHeight = 0;
composite.setLayout(gridLayout);
threadsCombo = new Combo(composite, SWT.BORDER | SWT.READ_ONLY | SWT.SINGLE);
for(int i = 1; i <= processors; i++ ) {
threadsCombo.add(Integer.toString(i));
}
threadsCombo.setEnabled(processors > 1);
threadsCombo.addSelectionListener(modyfyingListener);
Label threadsLabel = new Label(composite, SWT.NONE);
threadsLabel.setText(org.eclipse.m2e.internal.launch.Messages.MavenLaunchMainTab_lblThreads);
threadsLabel.setToolTipText("--threads"); //$NON-NLS-1$
}
new Label(mainComposite, SWT.NONE);
new Label(mainComposite, SWT.NONE);
TableViewer tableViewer = new TableViewer(mainComposite, SWT.BORDER | SWT.FULL_SELECTION | SWT.MULTI);
tableViewer.addDoubleClickListener(event -> {
TableItem[] selection = propsTable.getSelection();
if(selection.length == 1) {
editProperty(selection[0].getText(0), selection[0].getText(1));
}
});
tableViewer.addSelectionChangedListener(event -> {
TableItem[] items = propsTable.getSelection();
if(items == null || items.length == 0) {
editPropButton.setEnabled(false);
removePropButton.setEnabled(false);
} else if(items.length == 1) {
editPropButton.setEnabled(true);
removePropButton.setEnabled(true);
} else {
editPropButton.setEnabled(false);
removePropButton.setEnabled(true);
}
});
this.propsTable = tableViewer.getTable();
//this.tProps.setItemCount(10);
this.propsTable.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 4, 3));
this.propsTable.setLinesVisible(true);
this.propsTable.setHeaderVisible(true);
final TableColumn propColumn = new TableColumn(this.propsTable, SWT.NONE, 0);
propColumn.setWidth(120);
propColumn.setText(Messages.launchPropName); //$NON-NLS-1$
final TableColumn valueColumn = new TableColumn(this.propsTable, SWT.NONE, 1);
valueColumn.setWidth(200);
valueColumn.setText(Messages.launchPropValue); //$NON-NLS-1$
final Button addPropButton = new Button(mainComposite, SWT.NONE);
addPropButton.setLayoutData(new GridData(SWT.FILL, SWT.TOP, false, false));
addPropButton.setText(Messages.launchPropAddButton); //$NON-NLS-1$
addPropButton.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
addProperty();
}
});
editPropButton = new Button(mainComposite, SWT.NONE);
editPropButton.setLayoutData(new GridData(SWT.FILL, SWT.TOP, false, false));
editPropButton.setText(Messages.launchPropEditButton); //$NON-NLS-1$
editPropButton.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
if(propsTable.getSelectionCount() > 0) {
TableItem[] selection = propsTable.getSelection();
if(selection.length == 1) {
editProperty(selection[0].getText(0), selection[0].getText(1));
}
}
}
});
editPropButton.setEnabled(false);
removePropButton = new Button(mainComposite, SWT.NONE);
removePropButton.setLayoutData(new GridData(SWT.FILL, SWT.TOP, false, false));
removePropButton.setText(Messages.launchPropRemoveButton); //$NON-NLS-1$
removePropButton.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
if(propsTable.getSelectionCount() > 0) {
propsTable.remove(propsTable.getSelectionIndices());
entriesChanged();
}
}
});
removePropButton.setEnabled(false);
Label mavenRuntimeLabel = new Label(mainComposite, SWT.NONE);
mavenRuntimeLabel.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false));
mavenRuntimeLabel.setText(Messages.MavenLaunchMainTab_lblRuntime);
runtimeSelector = new MavenRuntimeSelector(mainComposite);
runtimeSelector.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false, 4, 1));
runtimeSelector.addSelectionChangedListener(event -> entriesChanged());
goalsText.setFocus();
}
protected Shell getShell() {
return super.getShell();
}
void addProperty() {
MavenPropertyDialog dialog = getMavenPropertyDialog(
org.eclipse.m2e.internal.launch.Messages.MavenLaunchMainTab_property_dialog_title, "", ""); //$NON-NLS-2$ //$NON-NLS-3$
if(dialog.open() == IDialogConstants.OK_ID) {
TableItem item = new TableItem(propsTable, SWT.NONE);
item.setText(0, dialog.getName());
item.setText(1, dialog.getValue());
entriesChanged();
}
}
void editProperty(String name, String value) {
MavenPropertyDialog dialog = getMavenPropertyDialog(
org.eclipse.m2e.internal.launch.Messages.MavenLaunchMainTab_property_dialog_edit_title, name, value);
if(dialog.open() == IDialogConstants.OK_ID) {
TableItem[] item = propsTable.getSelection();
item[0].setText(0, dialog.getName());
item[0].setText(1, dialog.getValue());
entriesChanged();
}
}
private MavenPropertyDialog getMavenPropertyDialog(String title, String initName, String initValue) {
return new MavenPropertyDialog(getShell(), title, initName, initValue, null) {
protected Control createDialogArea(Composite parent) {
Composite comp = (Composite) super.createDialogArea(parent);
Button variablesButton = new Button(comp, SWT.PUSH);
GridData gd = new GridData(GridData.HORIZONTAL_ALIGN_END);
gd.horizontalSpan = 2;
gd.widthHint = Math.max(convertHorizontalDLUsToPixels(IDialogConstants.BUTTON_WIDTH), //
variablesButton.computeSize(SWT.DEFAULT, SWT.DEFAULT, true).x);
variablesButton.setLayoutData(gd);
variablesButton.setFont(comp.getFont());
variablesButton.setText(Messages.launchPropertyDialogBrowseVariables); //$NON-NLS-1$;
variablesButton.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent se) {
StringVariableSelectionDialog variablesDialog = new StringVariableSelectionDialog(getShell());
if(variablesDialog.open() == IDialogConstants.OK_ID) {
String variable = variablesDialog.getVariableExpression();
if(variable != null) {
valueText.insert(variable.trim());
}
}
}
});
return comp;
}
};
}
public void initializeFrom(ILaunchConfiguration configuration) {
String pomDirName = getAttribute(configuration, ATTR_POM_DIR, ""); //$NON-NLS-1$
this.pomDirNameText.setText(pomDirName);
this.goalsText.setText(getAttribute(configuration, ATTR_GOALS, "")); //$NON-NLS-1$
this.profilesText.setText(getAttribute(configuration, ATTR_PROFILES, "")); //$NON-NLS-1$
try {
IMavenConfiguration mavenConfiguration = MavenPlugin.getMavenConfiguration();
this.offlineButton.setSelection(getAttribute(configuration, ATTR_OFFLINE, mavenConfiguration.isOffline()));
this.debugOutputButton
.setSelection(getAttribute(configuration, ATTR_DEBUG_OUTPUT, mavenConfiguration.isDebugOutput()));
this.updateSnapshotsButton.setSelection(getAttribute(configuration, ATTR_UPDATE_SNAPSHOTS, false));
this.skipTestsButton.setSelection(getAttribute(configuration, ATTR_SKIP_TESTS, false));
this.nonRecursiveButton.setSelection(getAttribute(configuration, ATTR_NON_RECURSIVE, false));
this.enableWorkspaceResolution.setSelection(getAttribute(configuration, ATTR_WORKSPACE_RESOLUTION, false));
this.threadsCombo.select(getAttribute(configuration, ATTR_THREADS, 1) - 1);
this.runtimeSelector.initializeFrom(configuration);
this.userSettings.setText(getAttribute(configuration, ATTR_USER_SETTINGS, ""));
this.userSettings.setMessage(nvl(mavenConfiguration.getUserSettingsFile(),
SettingsXmlConfigurationProcessor.DEFAULT_USER_SETTINGS_FILE.getAbsolutePath()));
this.propsTable.removeAll();
List<String> properties = configuration.getAttribute(ATTR_PROPERTIES, Collections.emptyList());
for(String property : properties) {
int n = property.indexOf('=');
String name = property;
String value = ""; //$NON-NLS-1$
if(n > -1) {
name = property.substring(0, n);
if(n > 1) {
value = property.substring(n + 1);
}
}
TableItem item = new TableItem(propsTable, SWT.NONE);
item.setText(0, name);
item.setText(1, value);
}
} catch(CoreException ex) {
// XXX should we at least log something here?
}
setDirty(false);
}
protected static String nvl(String str, String nullValue) {
return str != null ? str : nullValue;
}
private String getAttribute(ILaunchConfiguration configuration, String name, String defaultValue) {
try {
return configuration.getAttribute(name, defaultValue);
} catch(CoreException ex) {
log.error(ex.getMessage(), ex);
return defaultValue;
}
}
private boolean getAttribute(ILaunchConfiguration configuration, String name, boolean defaultValue) {
try {
return configuration.getAttribute(name, defaultValue);
} catch(CoreException ex) {
return defaultValue;
}
}
private int getAttribute(ILaunchConfiguration configuration, String name, int defaultValue) {
try {
return configuration.getAttribute(name, defaultValue);
} catch(CoreException ex) {
return defaultValue;
}
}
public void setDefaults(ILaunchConfigurationWorkingCopy configuration) {
}
public void performApply(ILaunchConfigurationWorkingCopy configuration) {
configuration.setAttribute(ATTR_POM_DIR, this.pomDirNameText.getText());
configuration.setAttribute(ATTR_GOALS, this.goalsText.getText());
configuration.setAttribute(ATTR_PROFILES, this.profilesText.getText());
configuration.setAttribute(ATTR_USER_SETTINGS, this.userSettings.getText());
configuration.setAttribute(ATTR_OFFLINE, this.offlineButton.getSelection());
configuration.setAttribute(ATTR_UPDATE_SNAPSHOTS, this.updateSnapshotsButton.getSelection());
configuration.setAttribute(ATTR_SKIP_TESTS, this.skipTestsButton.getSelection());
configuration.setAttribute(ATTR_NON_RECURSIVE, this.nonRecursiveButton.getSelection());
configuration.setAttribute(ATTR_WORKSPACE_RESOLUTION, this.enableWorkspaceResolution.getSelection());
configuration.setAttribute(ATTR_DEBUG_OUTPUT, this.debugOutputButton.getSelection());
runtimeSelector.performApply(configuration);
configuration.setAttribute(ATTR_THREADS, threadsCombo.getSelectionIndex() + 1);
// store as String in "param=value" format
List<String> properties = new ArrayList<String>();
for(TableItem item : this.propsTable.getItems()) {
String p = item.getText(0);
String v = item.getText(1);
if(p != null && p.trim().length() > 0) {
String prop = p.trim() + "=" + (v == null ? "" : v); //$NON-NLS-1$ //$NON-NLS-2$
properties.add(prop);
}
}
configuration.setAttribute(ATTR_PROPERTIES, properties);
}
public String getName() {
return Messages.launchMainTabName; //$NON-NLS-1$
}
public boolean isValid(ILaunchConfiguration launchConfig) {
setErrorMessage(null);
String pomFileName = this.pomDirNameText.getText();
if(pomFileName == null || pomFileName.trim().length() == 0) {
setErrorMessage(Messages.launchPomDirectoryEmpty);
return false;
}
if(!isDirectoryExist(pomFileName)) {
if(getErrorMessage() == null) {
setErrorMessage(Messages.launchPomDirectoryDoesntExist);
}
return false;
}
return true;
}
protected boolean isDirectoryExist(String name) {
if(name == null || name.trim().length() == 0) {
return false;
}
try {
String dirName = LaunchingUtils.substituteVar(name);
if(dirName == null) {
return false;
}
File pomDir = new File(dirName);
if(!pomDir.exists()) {
return false;
}
if(!pomDir.isDirectory()) {
return false;
}
} catch(CoreException e) {
setErrorMessage(Messages.launchErrorEvaluatingBaseDirectory);
return false;
}
return true;
}
void entriesChanged() {
setDirty(true);
updateLaunchConfigurationDialog();
}
private static final class GoalsFocusListener extends FocusAdapter {
private Text text;
public GoalsFocusListener(Text text) {
this.text = text;
}
public void focusGained(FocusEvent e) {
super.focusGained(e);
text.setData("focus"); //$NON-NLS-1$
}
}
private class BrowseWorkspaceDirAction extends SelectionAdapter {
private Text target;
private String label;
public BrowseWorkspaceDirAction(Text target, String label) {
this.target = target;
this.label = label;
}
public void widgetSelected(SelectionEvent e) {
ContainerSelectionDialog dialog = new ContainerSelectionDialog(getShell(), //
ResourcesPlugin.getWorkspace().getRoot(), false, label); //$NON-NLS-1$
dialog.showClosedProjects(false);
int buttonId = dialog.open();
if(buttonId == IDialogConstants.OK_ID) {
Object[] resource = dialog.getResult();
if(resource != null && resource.length > 0) {
String fileLoc = VariablesPlugin.getDefault().getStringVariableManager()
.generateVariableExpression("workspace_loc", ((IPath) resource[0]).toString()); //$NON-NLS-1$
target.setText(fileLoc);
entriesChanged();
}
}
}
}
private class BrowseWorkspaceFileAction extends SelectionAdapter {
private Text target;
private String label;
public BrowseWorkspaceFileAction(Text target, String label) {
this.target = target;
this.label = label;
}
public void widgetSelected(SelectionEvent e) {
ElementTreeSelectionDialog dialog = new ElementTreeSelectionDialog(getShell(), //
new WorkbenchLabelProvider(), new BaseWorkbenchContentProvider());
dialog.setTitle(label);
dialog.setInput(ResourcesPlugin.getWorkspace().getRoot());
int buttonId = dialog.open();
if(buttonId == IDialogConstants.OK_ID) {
Object[] resource = dialog.getResult();
if(resource != null && resource.length > 0) {
String fileLoc = VariablesPlugin.getDefault().getStringVariableManager()
.generateVariableExpression("workspace_loc", ((IResource) resource[0]).getFullPath().toString()); //$NON-NLS-1$
target.setText(fileLoc);
entriesChanged();
}
}
}
}
private class BrowseDirAction extends SelectionAdapter {
private Text target;
public BrowseDirAction(Text target) {
this.target = target;
}
public void widgetSelected(SelectionEvent e) {
DirectoryDialog dialog = new DirectoryDialog(getShell(), SWT.NONE);
dialog.setFilterPath(target.getText());
String text = dialog.open();
if(text != null) {
target.setText(text);
entriesChanged();
}
}
}
private class BrowseFileAction extends SelectionAdapter {
private Text target;
private String[] filter;
public BrowseFileAction(Text target, String[] filter) {
this.target = target;
this.filter = filter;
}
public void widgetSelected(SelectionEvent e) {
FileDialog dialog = new FileDialog(getShell(), SWT.NONE);
dialog.setFilterPath(target.getText());
dialog.setFilterExtensions(filter);
String text = dialog.open();
if(text != null) {
target.setText(text);
entriesChanged();
}
}
}
private class VariablesAction extends SelectionAdapter {
private Text target;
public VariablesAction(Text target) {
this.target = target;
}
public void widgetSelected(SelectionEvent e) {
StringVariableSelectionDialog dialog = new StringVariableSelectionDialog(getShell());
dialog.open();
String variable = dialog.getVariableExpression();
if(variable != null) {
target.insert(variable);
}
}
}
}