blob: a1d34cbefa29ac878340f0ad8db5f8ebc7fed3b2 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2005, 2018 IBM Corporation and others.
* 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:
* IBM Corporation - initial API and implementation
* Les Jones <lesojones@gmail.com> - bug 195433, 218210
*******************************************************************************/
package org.eclipse.pde.internal.ui.launcher;
import static org.eclipse.swt.events.SelectionListener.widgetSelectedAdapter;
import java.util.Arrays;
import java.util.Comparator;
import org.eclipse.core.runtime.*;
import org.eclipse.debug.core.ILaunchConfiguration;
import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
import org.eclipse.jdt.launching.*;
import org.eclipse.jdt.launching.environments.IExecutionEnvironment;
import org.eclipse.jface.window.Window;
import org.eclipse.osgi.util.NLS;
import org.eclipse.pde.internal.core.util.VMUtil;
import org.eclipse.pde.internal.launching.launcher.VMHelper;
import org.eclipse.pde.internal.ui.PDEUIMessages;
import org.eclipse.pde.internal.ui.SWTFactory;
import org.eclipse.pde.internal.ui.util.SWTUtil;
import org.eclipse.pde.launching.IPDELauncherConstants;
import org.eclipse.pde.ui.launcher.AbstractLauncherTab;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.*;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.*;
public class JREBlock {
private AbstractLauncherTab fTab;
private Listener fListener = new Listener();
private Button fJavawButton;
private Button fJavaButton;
private Button fJreButton;
private Button fEeButton;
private Button fJrePrefButton;
private Button fEePrefButton;
private Combo fJreCombo;
private Combo fEeCombo;
private Text fBootstrap;
class Listener extends SelectionAdapter implements ModifyListener {
@Override
public void widgetSelected(SelectionEvent e) {
Object source = e.getSource();
// When a radio button selection changes, we get two events. One for the deselection of the old button and another for the selection
// of the new button. We only need to update the configuration once when the selection changes. Hence, we can ignore the deselection
// event of the old button.
if (source instanceof Button && !((Button) source).getSelection())
return;
fTab.updateLaunchConfigurationDialog();
if (source == fEeCombo || source == fEeButton || source == fJreCombo || source == fJreButton) {
updateBootstrapEnablement();
}
if (source == fJreButton || source == fEeButton)
updateJREEnablement();
}
@Override
public void modifyText(ModifyEvent e) {
fTab.scheduleUpdateJob();
}
}
public JREBlock(AbstractLauncherTab tab) {
fTab = tab;
}
public void createControl(Composite parent) {
Group group = new Group(parent, SWT.NONE);
group.setText(PDEUIMessages.MainTab_jreSection);
GridLayout layout = new GridLayout();
layout.numColumns = 3;
group.setLayout(layout);
group.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
createJavaExecutableSection(group);
createJRESection(group);
createBootstrapEntriesSection(group);
}
protected void createJRESection(Composite parent) {
fEeButton = new Button(parent, SWT.RADIO);
fEeButton.setText(PDEUIMessages.BasicLauncherTab_ee);
fEeButton.addSelectionListener(fListener);
fEeCombo = SWTFactory.createCombo(parent, SWT.DROP_DOWN | SWT.READ_ONLY, 1, null);
fEeCombo.addSelectionListener(fListener);
fEePrefButton = new Button(parent, SWT.PUSH);
fEePrefButton.setText(PDEUIMessages.BasicLauncherTab_environments);
fEePrefButton.addSelectionListener(widgetSelectedAdapter(e -> {
String currentEE = parseEESelection(fEeCombo.getText());
if (SWTFactory.showPreferencePage(fTab.getControl().getShell(), "org.eclipse.jdt.debug.ui.jreProfiles", null) == Window.OK) { //$NON-NLS-1$
// The launch dialog may have been closed while the preference page was open
if (!fTab.getControl().isDisposed()) {
setEECombo();
setEEComboSelection(currentEE);
}
}
}));
fEePrefButton.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, false));
SWTUtil.setButtonDimensionHint(fEePrefButton);
fJreButton = new Button(parent, SWT.RADIO);
fJreButton.setText(PDEUIMessages.BasicLauncherTab_jre);
fJreButton.addSelectionListener(fListener);
fJreCombo = SWTFactory.createCombo(parent, SWT.DROP_DOWN | SWT.READ_ONLY, 1, null);
fJreCombo.addSelectionListener(fListener);
fJrePrefButton = new Button(parent, SWT.PUSH);
fJrePrefButton.setText(PDEUIMessages.BasicLauncherTab_installedJREs);
fJrePrefButton.addSelectionListener(widgetSelectedAdapter(e -> {
String currentVM = fJreCombo.getText();
String currentEE = parseEESelection(fEeCombo.getText());
boolean useDefault = VMUtil.getDefaultVMInstallName().equals(currentVM);
if (SWTFactory.showPreferencePage(fTab.getControl().getShell(), "org.eclipse.jdt.debug.ui.preferences.VMPreferencePage", null) == Window.OK) { //$NON-NLS-1$
// The launch dialog may have been closed while the preference page was open
if (!fTab.getControl().isDisposed()) {
setJRECombo();
if (useDefault || fJreCombo.indexOf(currentVM) == -1)
fJreCombo.setText(VMUtil.getDefaultVMInstallName());
else
fJreCombo.setText(currentVM);
setEECombo();
setEEComboSelection(currentEE);
updateBootstrapEnablement();
}
}
}));
fJrePrefButton.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, false));
SWTUtil.setButtonDimensionHint(fJrePrefButton);
}
protected void createJavaExecutableSection(Composite parent) {
Label label = new Label(parent, SWT.NONE);
label.setText(PDEUIMessages.BasicLauncherTab_javaExec);
Composite composite = new Composite(parent, SWT.NONE);
GridLayout layout = new GridLayout();
layout.numColumns = 2;
layout.marginHeight = layout.marginWidth = 0;
layout.horizontalSpacing = 20;
composite.setLayout(layout);
GridData gd = new GridData(GridData.FILL_HORIZONTAL);
gd.horizontalSpan = 2;
composite.setLayoutData(gd);
fJavawButton = new Button(composite, SWT.RADIO);
fJavawButton.addSelectionListener(fListener);
fJavaButton = new Button(composite, SWT.RADIO);
fJavaButton.setText("&java"); //$NON-NLS-1$
fJavaButton.addSelectionListener(fListener);
}
private void createBootstrapEntriesSection(Composite parent) {
Label label = new Label(parent, SWT.NONE);
label.setText(PDEUIMessages.BasicLauncherTab_bootstrap);
fBootstrap = new Text(parent, SWT.BORDER);
GridData gd = new GridData(GridData.FILL_HORIZONTAL);
gd.widthHint = 300;
gd.horizontalSpan = 2;
fBootstrap.setLayoutData(gd);
fBootstrap.addModifyListener(fListener);
}
public void initializeFrom(ILaunchConfiguration config) throws CoreException {
initializeJRESection(config);
initializeBootstrapEntriesSection(config);
}
private void initializeJRESection(ILaunchConfiguration config) throws CoreException {
String javaCommand = config.getAttribute(IJavaLaunchConfigurationConstants.ATTR_JAVA_COMMAND, "javaw"); //$NON-NLS-1$
String javawText = NLS.bind(PDEUIMessages.BasicLauncherTab_javaExecDefault, javaCommand);
fJavawButton.setText(javawText);
fJavawButton.setSelection(javaCommand.equals("javaw")); //$NON-NLS-1$
fJavaButton.setSelection(!fJavawButton.getSelection());
String jre = config.getAttribute(IJavaLaunchConfigurationConstants.ATTR_JRE_CONTAINER_PATH, (String) null);
IPath jrePath = null;
if (jre != null) {
jrePath = Path.fromPortableString(jre);
}
String vmInstallName = null;
String eeId = null;
if (jrePath == null) {
// Try to get a default EE based on the selected plug-ins in the config
eeId = VMHelper.getDefaultEEName(config);
if (eeId == null) {
vmInstallName = VMHelper.getDefaultVMInstallName(config);
}
} else {
eeId = JavaRuntime.getExecutionEnvironmentId(jrePath);
if (eeId == null) {
vmInstallName = JavaRuntime.getVMInstallName(jrePath);
}
}
fJreButton.setSelection(vmInstallName != null);
fEeButton.setSelection(eeId != null);
setJRECombo();
setEECombo();
setJREComboSelection(vmInstallName);
setEEComboSelection(eeId);
updateJREEnablement();
updateBootstrapEnablement();
}
private void updateBootstrapEnablement() {
IPath jrePath = null;
if (fJreButton.getSelection()) {
if (fJreCombo.getSelectionIndex() != -1) {
String jreName = fJreCombo.getText();
IVMInstall install = VMHelper.getVMInstall(jreName);
// remove the name to make portable
jrePath = JavaRuntime.newJREContainerPath(install);
}
} else {
if (fEeCombo.getSelectionIndex() != -1) {
IExecutionEnvironment environment = VMUtil
.getExecutionEnvironment(parseEESelection(fEeCombo.getText()));
if (environment != null) {
jrePath = JavaRuntime.newJREContainerPath(environment);
}
}
}
if (jrePath != null) {
IVMInstall vmInstall = JavaRuntime.getVMInstall(jrePath);
if (vmInstall != null) {
boolean modularJava = JavaRuntime.isModularJava(vmInstall);
fBootstrap.setEnabled(!modularJava);
}
}
}
private void setEEComboSelection(String eeId) {
if (eeId != null) {
String[] items = fEeCombo.getItems();
for (int i = 0; i < items.length; i++) {
if (parseEESelection(items[i]).equals(eeId)) {
fEeCombo.select(i);
return;
}
}
}
if (fEeCombo.getItemCount() > 0 && fEeCombo.getSelectionIndex() == -1)
fEeCombo.select(0);
}
private void setJREComboSelection(String vmInstallName) {
if (vmInstallName != null) {
fJreCombo.setText(vmInstallName);
}
if (fJreCombo.getSelectionIndex() == -1) {
fJreCombo.setText(VMUtil.getDefaultVMInstallName());
}
}
private void updateJREEnablement() {
fJreCombo.setEnabled(fJreButton.getSelection());
fJrePrefButton.setEnabled(fJreButton.getSelection());
fEeCombo.setEnabled(fEeButton.getSelection());
fEePrefButton.setEnabled(fEeButton.getSelection());
}
private void initializeBootstrapEntriesSection(ILaunchConfiguration config) throws CoreException {
fBootstrap.setText(config.getAttribute(IPDELauncherConstants.BOOTSTRAP_ENTRIES, "")); //$NON-NLS-1$
}
public void performApply(ILaunchConfigurationWorkingCopy config) {
saveJRESection(config);
saveBootstrapEntriesSection(config);
}
protected void saveJRESection(ILaunchConfigurationWorkingCopy config) {
String javaCommand = fJavawButton.getSelection() ? null : "java"; //$NON-NLS-1$
config.setAttribute(IJavaLaunchConfigurationConstants.ATTR_JAVA_COMMAND, javaCommand);
IPath jrePath = null;
if (fJreButton.getSelection()) {
if (fJreCombo.getSelectionIndex() != -1) {
String jreName = fJreCombo.getText();
IVMInstall install = VMHelper.getVMInstall(jreName);
// remove the name to make portable
jrePath = JavaRuntime.newJREContainerPath(install);
}
} else {
if (fEeCombo.getSelectionIndex() != -1) {
IExecutionEnvironment environment = VMUtil.getExecutionEnvironment(parseEESelection(fEeCombo.getText()));
if (environment != null) {
jrePath = JavaRuntime.newJREContainerPath(environment);
}
}
}
String attr = null;
if (jrePath != null) {
attr = jrePath.toPortableString();
}
config.setAttribute(IJavaLaunchConfigurationConstants.ATTR_JRE_CONTAINER_PATH, attr);
}
protected void saveBootstrapEntriesSection(ILaunchConfigurationWorkingCopy config) {
config.setAttribute(IPDELauncherConstants.BOOTSTRAP_ENTRIES, fBootstrap.getText().trim());
}
public void setDefaults(ILaunchConfigurationWorkingCopy config) {
config.setAttribute(IPDELauncherConstants.BOOTSTRAP_ENTRIES, ""); //$NON-NLS-1$
}
private void setJRECombo() {
String[] jres = VMUtil.getVMInstallNames();
Arrays.sort(jres, getComparator());
fJreCombo.setItems(jres);
}
private void setEECombo() {
IExecutionEnvironment[] eeObjects = VMUtil.getExecutionEnvironments();
String[] ees = new String[eeObjects.length];
for (int i = 0; i < eeObjects.length; i++) {
String vm;
try {
vm = VMUtil.getVMInstallName(eeObjects[i]);
} catch (CoreException e) {
vm = PDEUIMessages.BasicLauncherTab_unbound;
}
ees[i] = NLS.bind("{0} ({1})", new String[] {eeObjects[i].getId(), vm}); //$NON-NLS-1$
}
fEeCombo.setItems(ees);
}
private Comparator<Object> getComparator() {
return (arg0, arg1) -> arg0.toString().compareTo(arg1.toString());
}
public String validate() {
if (fEeButton.getSelection() && fEeCombo.getText().indexOf(PDEUIMessages.BasicLauncherTab_unbound) != -1)
return NLS.bind(PDEUIMessages.BasicLauncherTab_noJreForEeMessage, parseEESelection(fEeCombo.getText()));
return null;
}
private String parseEESelection(String selection) {
int index = selection.indexOf(" ("); //$NON-NLS-1$
if (index == -1)
return selection;
return selection.substring(0, index);
}
}