/******************************************************************************* * Copyright (c) 2005, 2015 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 *******************************************************************************/ package org.eclipse.jdt.internal.debug.ui.launcher; import org.eclipse.core.resources.IWorkspaceRoot; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.CoreException; import org.eclipse.debug.core.ILaunchConfiguration; import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy; import org.eclipse.debug.internal.ui.SWTFactory; import org.eclipse.jdt.core.IJavaModel; import org.eclipse.jdt.core.IJavaProject; import org.eclipse.jdt.core.JavaCore; import org.eclipse.jdt.core.JavaModelException; import org.eclipse.jdt.debug.ui.launchConfigurations.JavaLaunchTab; import org.eclipse.jdt.internal.debug.ui.JDIDebugUIPlugin; import org.eclipse.jdt.internal.debug.ui.actions.ControlAccessibleListener; import org.eclipse.jdt.internal.launching.JavaMigrationDelegate; import org.eclipse.jdt.launching.IJavaLaunchConfigurationConstants; import org.eclipse.jdt.ui.JavaElementLabelProvider; import org.eclipse.jface.viewers.ILabelProvider; import org.eclipse.jface.window.Window; import org.eclipse.swt.events.ModifyEvent; import org.eclipse.swt.events.ModifyListener; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.events.SelectionListener; import org.eclipse.swt.layout.GridData; 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.ui.dialogs.ElementListSelectionDialog; /** * Provides general widgets and methods for a Java type launch configuration * 'Main' tab. * Currently there are only three Java type launch configurations: Local Java Application, Applet, and Remote Debug * which this class is used by * * @since 3.2 */ public abstract class AbstractJavaMainTab extends JavaLaunchTab { /** * A listener which handles widget change events for the controls * in this tab. */ private class WidgetListener implements ModifyListener, SelectionListener { @Override public void modifyText(ModifyEvent e) { updateLaunchConfigurationDialog(); } @Override public void widgetDefaultSelected(SelectionEvent e) {/*do nothing*/} @Override public void widgetSelected(SelectionEvent e) { Object source = e.getSource(); if (source == fProjButton) { handleProjectButtonSelected(); } else { updateLaunchConfigurationDialog(); } } } protected static final String EMPTY_STRING = ""; //$NON-NLS-1$ //Project UI widgets protected Text fProjText; private Button fProjButton; private WidgetListener fListener = new WidgetListener(); /** * chooses a project for the type of java launch config that it is * @return the selected project or <code>null</code> if none */ private IJavaProject chooseJavaProject() { ILabelProvider labelProvider= new JavaElementLabelProvider(JavaElementLabelProvider.SHOW_DEFAULT); ElementListSelectionDialog dialog= new ElementListSelectionDialog(getShell(), labelProvider); dialog.setTitle(LauncherMessages.AbstractJavaMainTab_4); dialog.setMessage(LauncherMessages.AbstractJavaMainTab_3); try { dialog.setElements(JavaCore.create(getWorkspaceRoot()).getJavaProjects()); } catch (JavaModelException jme) {JDIDebugUIPlugin.log(jme);} IJavaProject javaProject= getJavaProject(); if (javaProject != null) { dialog.setInitialSelections(new Object[] { javaProject }); } if (dialog.open() == Window.OK) { return (IJavaProject) dialog.getFirstResult(); } return null; } /** * Creates the widgets for specifying a main type. * * @param parent the parent composite */ protected void createProjectEditor(Composite parent) { Group group = SWTFactory.createGroup(parent, LauncherMessages.AbstractJavaMainTab_0, 2, 1, GridData.FILL_HORIZONTAL); fProjText = SWTFactory.createSingleText(group, 1); fProjText.addModifyListener(fListener); ControlAccessibleListener.addListener(fProjText, group.getText()); fProjButton = createPushButton(group, LauncherMessages.AbstractJavaMainTab_1, null); fProjButton.addSelectionListener(fListener); } /** * returns the default listener from this class. For all subclasses * this listener will only provide the functionality of updating the current tab * * @return a widget listener */ protected WidgetListener getDefaultListener() { return fListener; } /** * Convenience method to get access to the java model. */ private IJavaModel getJavaModel() { return JavaCore.create(getWorkspaceRoot()); } /** * Return the IJavaProject corresponding to the project name in the project name * text field, or null if the text does not match a project name. */ protected IJavaProject getJavaProject() { String projectName = fProjText.getText().trim(); if (projectName.length() < 1) { return null; } return getJavaModel().getJavaProject(projectName); } /** * Convenience method to get the workspace root. */ protected IWorkspaceRoot getWorkspaceRoot() { return ResourcesPlugin.getWorkspace().getRoot(); } /** * Show a dialog that lets the user select a project. This in turn provides * context for the main type, allowing the user to key a main type name, or * constraining the search for main types to the specified project. */ protected void handleProjectButtonSelected() { IJavaProject project = chooseJavaProject(); if (project == null) { return; } String projectName = project.getElementName(); fProjText.setText(projectName); } /* (non-Javadoc) * @see org.eclipse.debug.ui.ILaunchConfigurationTab#initializeFrom(org.eclipse.debug.core.ILaunchConfiguration) */ @Override public void initializeFrom(ILaunchConfiguration config) { updateProjectFromConfig(config); super.initializeFrom(config); } /** * updates the project text field form the configuration * @param config the configuration we are editing */ private void updateProjectFromConfig(ILaunchConfiguration config) { String projectName = EMPTY_STRING; try { projectName = config.getAttribute(IJavaLaunchConfigurationConstants.ATTR_PROJECT_NAME, EMPTY_STRING); } catch (CoreException ce) { setErrorMessage(ce.getStatus().getMessage()); } fProjText.setText(projectName); } /** * Maps the config to associated java resource * * @param config */ protected void mapResources(ILaunchConfigurationWorkingCopy config) { try { //CONTEXTLAUNCHING IJavaProject javaProject = getJavaProject(); if (javaProject != null && javaProject.exists() && javaProject.isOpen()) { JavaMigrationDelegate.updateResourceMapping(config); } } catch(CoreException ce) { setErrorMessage(ce.getStatus().getMessage()); } } }