/*
* Copyright (c) 2015 the original author or authors.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Etienne Studer & Donát Csikós (Gradle Inc.) - initial API and implementation and initial documentation
*/
package org.eclipse.buildship.ui.launch;
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.swt.SWT;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Text;
import org.eclipse.buildship.core.i18n.CoreMessages;
import org.eclipse.buildship.core.launch.GradleRunConfigurationAttributes;
import org.eclipse.buildship.core.util.collections.CollectionsUtils;
import org.eclipse.buildship.ui.PluginImage.ImageState;
import org.eclipse.buildship.ui.PluginImages;
/**
* Specifies the JVM arguments and program arguments to apply when executing tasks via the run
* configurations.
*/
public final class ArgumentsTab extends AbstractLaunchConfigurationTab {
private Text argumentsText;
private Text jvmArgumentsText;
@Override
public String getName() {
return LaunchMessages.Tab_Name_Arguments;
}
@Override
public Image getImage() {
return PluginImages.RUN_CONFIG_ARGUMENTS.withState(ImageState.ENABLED).getImage();
}
@Override
public void createControl(Composite root) {
Composite parent = new Composite(root, SWT.NONE);
GridLayout layout = new GridLayout(1, false);
parent.setLayout(layout);
setControl(parent);
Group argumentsGroup = createGroup(parent, CoreMessages.RunConfiguration_Label_Arguments + ":"); //$NON-NLS-1$
createArgumentsSelectionControl(argumentsGroup);
Group jvmArgumentsGroup = createGroup(parent, CoreMessages.RunConfiguration_Label_JvmArguments + ":"); //$NON-NLS-1$
createJvmArgumentsSelectionControl(jvmArgumentsGroup);
}
private Group createGroup(Composite parent, String groupName) {
Group group = new Group(parent, SWT.NONE);
group.setText(groupName);
group.setLayout(new GridLayout());
group.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false));
return group;
}
private void createArgumentsSelectionControl(Composite container) {
this.argumentsText = createTextControl(container);
createVariablesSelectorButton(container, this.argumentsText);
}
private void createJvmArgumentsSelectionControl(Composite container) {
this.jvmArgumentsText = createTextControl(container);
createVariablesSelectorButton(container, this.jvmArgumentsText);
}
private Text createTextControl(Composite container) {
Text textControl = new Text(container, SWT.MULTI | SWT.BORDER | SWT.WRAP | SWT.V_SCROLL);
GridData textLayoutData = new GridData(SWT.FILL, SWT.TOP, true, false, 1, 1);
textLayoutData.heightHint = 65;
textControl.setLayoutData(textLayoutData);
textControl.addModifyListener(new ModifyListener() {
@Override
public void modifyText(ModifyEvent e) {
updateLaunchConfigurationDialog();
}
});
return textControl;
}
private void createVariablesSelectorButton(Composite container, final Text target) {
Composite buttonContainer = new Composite(container, SWT.NONE);
GridLayout buttonContainerLayout = new GridLayout(1, false);
buttonContainerLayout.marginHeight = 1;
buttonContainerLayout.marginWidth = 0;
buttonContainer.setLayout(buttonContainerLayout);
buttonContainer.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_END));
Button selectVariableButton = new Button(buttonContainer, SWT.NONE);
selectVariableButton.setText(LaunchMessages.Button_Label_SelectVariables);
selectVariableButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
StringVariableSelectionDialog dialog = new StringVariableSelectionDialog(getShell());
dialog.open();
String variable = dialog.getVariableExpression();
if (variable != null) {
target.insert(variable);
}
}
});
}
@Override
public void initializeFrom(ILaunchConfiguration configuration) {
GradleRunConfigurationAttributes configurationAttributes = GradleRunConfigurationAttributes.from(configuration);
this.argumentsText.setText(CollectionsUtils.joinWithSpace(configurationAttributes.getArgumentExpressions()));
this.jvmArgumentsText.setText(CollectionsUtils.joinWithSpace(configurationAttributes.getJvmArgumentExpressions()));
}
@Override
public void performApply(ILaunchConfigurationWorkingCopy configuration) {
GradleRunConfigurationAttributes.applyArgumentExpressions(CollectionsUtils.splitBySpace(this.argumentsText.getText()), configuration);
GradleRunConfigurationAttributes.applyJvmArgumentExpressions(CollectionsUtils.splitBySpace(this.jvmArgumentsText.getText()), configuration);
}
@Override
public void setDefaults(ILaunchConfigurationWorkingCopy configuration) {
// leave the controls empty
}
}