/******************************************************************************* * 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 java.lang.reflect.InvocationTargetException; 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.IClassFile; import org.eclipse.jdt.core.ICompilationUnit; import org.eclipse.jdt.core.IJavaElement; import org.eclipse.jdt.core.IMember; import org.eclipse.jdt.core.IType; import org.eclipse.jdt.core.search.IJavaSearchScope; import org.eclipse.jdt.core.search.SearchEngine; import org.eclipse.jdt.internal.debug.ui.JDIDebugUIPlugin; import org.eclipse.jdt.internal.debug.ui.actions.ControlAccessibleListener; import org.eclipse.jdt.launching.IJavaLaunchConfigurationConstants; 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; /** * Provides general widgets and methods for a Java type launch configuration * 'Main' tab. * This class provides shared functionality for those main tabs which have a 'main type' field on them; * such as a main method for a local Java application, or an Applet for Java Applets * * @since 3.2 */ public abstract class SharedJavaMainTab extends AbstractJavaMainTab { protected Text fMainText; private Button fSearchButton; /** * Creates the widgets for specifying a main type. * * @param parent the parent composite */ protected void createMainTypeEditor(Composite parent, String text) { Group group = SWTFactory.createGroup(parent, text, 2, 1, GridData.FILL_HORIZONTAL); fMainText = SWTFactory.createSingleText(group, 1); fMainText.addModifyListener(new ModifyListener() { @Override public void modifyText(ModifyEvent e) { updateLaunchConfigurationDialog(); } }); ControlAccessibleListener.addListener(fMainText, group.getText()); fSearchButton = createPushButton(group, LauncherMessages.AbstractJavaMainTab_2, null); fSearchButton.addSelectionListener(new SelectionListener() { @Override public void widgetDefaultSelected(SelectionEvent e) { } @Override public void widgetSelected(SelectionEvent e) { handleSearchButtonSelected(); } }); createMainTypeExtensions(group); } /** * This method allows the group for main type to be extended with custom controls. * All control added via this method come after the main type text editor and search button in * the order they are added to the parent composite * * @param parent the parent to add to * @since 3.3 */ protected void createMainTypeExtensions(Composite parent) { //do nothing by default } /** * The select button pressed handler */ protected abstract void handleSearchButtonSelected(); /** * Set the main type & name attributes on the working copy based on the IJavaElement */ protected void initializeMainTypeAndName(IJavaElement javaElement, ILaunchConfigurationWorkingCopy config) { String name = null; if (javaElement instanceof IMember) { IMember member = (IMember)javaElement; if (member.isBinary()) { javaElement = member.getClassFile(); } else { javaElement = member.getCompilationUnit(); } } if (javaElement instanceof ICompilationUnit || javaElement instanceof IClassFile) { try { IJavaSearchScope scope = SearchEngine.createJavaSearchScope(new IJavaElement[]{javaElement}, false); MainMethodSearchEngine engine = new MainMethodSearchEngine(); IType[] types = engine.searchMainMethods(getLaunchConfigurationDialog(), scope, false); if (types != null && (types.length > 0)) { // Simply grab the first main type found in the searched element name = types[0].getFullyQualifiedName(); } } catch (InterruptedException ie) {JDIDebugUIPlugin.log(ie);} catch (InvocationTargetException ite) {JDIDebugUIPlugin.log(ite);} } if (name == null) { name = EMPTY_STRING; } config.setAttribute(IJavaLaunchConfigurationConstants.ATTR_MAIN_TYPE_NAME, name); if (name.length() > 0) { int index = name.lastIndexOf('.'); if (index > 0) { name = name.substring(index + 1); } name = getLaunchConfigurationDialog().generateName(name); config.rename(name); } } /** * Loads the main type from the launch configuration's preference store * @param config the config to load the main type from */ protected void updateMainTypeFromConfig(ILaunchConfiguration config) { String mainTypeName = EMPTY_STRING; try { mainTypeName = config.getAttribute(IJavaLaunchConfigurationConstants.ATTR_MAIN_TYPE_NAME, EMPTY_STRING); } catch (CoreException ce) {JDIDebugUIPlugin.log(ce);} fMainText.setText(mainTypeName); } }