mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-07-26 18:35:32 +02:00
Bug 309899 - New local terminal launch configurations should have reasonable default values
This commit is contained in:
parent
d03e95d0fa
commit
c8b9148f5b
11 changed files with 200 additions and 27 deletions
|
@ -7,7 +7,7 @@ feature@org.eclipse.tm.terminal.telnet=v201005032000,:pserver:anonymous:none@dev
|
||||||
feature@org.eclipse.tm.terminal.test=v200905272300,:pserver:anonymous:none@dev.eclipse.org:/cvsroot/dsdp,,org.eclipse.tm.core/terminal/org.eclipse.tm.terminal.test-feature
|
feature@org.eclipse.tm.terminal.test=v200905272300,:pserver:anonymous:none@dev.eclipse.org:/cvsroot/dsdp,,org.eclipse.tm.core/terminal/org.eclipse.tm.terminal.test-feature
|
||||||
feature@org.eclipse.tm.terminal.view=v201005032000,:pserver:anonymous:none@dev.eclipse.org:/cvsroot/dsdp,,org.eclipse.tm.core/terminal/org.eclipse.tm.terminal.view-feature
|
feature@org.eclipse.tm.terminal.view=v201005032000,:pserver:anonymous:none@dev.eclipse.org:/cvsroot/dsdp,,org.eclipse.tm.core/terminal/org.eclipse.tm.terminal.view-feature
|
||||||
plugin@org.eclipse.tm.terminal=v201005200200,:pserver:anonymous:none@dev.eclipse.org:/cvsroot/dsdp,,org.eclipse.tm.core/terminal/org.eclipse.tm.terminal
|
plugin@org.eclipse.tm.terminal=v201005200200,:pserver:anonymous:none@dev.eclipse.org:/cvsroot/dsdp,,org.eclipse.tm.core/terminal/org.eclipse.tm.terminal
|
||||||
plugin@org.eclipse.tm.terminal.local=v201005032000,:pserver:anonymous:none@dev.eclipse.org:/cvsroot/dsdp,,org.eclipse.tm.core/terminal/org.eclipse.tm.terminal.local
|
plugin@org.eclipse.tm.terminal.local=v201005200200,:pserver:anonymous:none@dev.eclipse.org:/cvsroot/dsdp,,org.eclipse.tm.core/terminal/org.eclipse.tm.terminal.local
|
||||||
plugin@org.eclipse.tm.terminal.serial=v200905272300,:pserver:anonymous:none@dev.eclipse.org:/cvsroot/dsdp,,org.eclipse.tm.core/terminal/org.eclipse.tm.terminal.serial
|
plugin@org.eclipse.tm.terminal.serial=v200905272300,:pserver:anonymous:none@dev.eclipse.org:/cvsroot/dsdp,,org.eclipse.tm.core/terminal/org.eclipse.tm.terminal.serial
|
||||||
plugin@org.eclipse.tm.terminal.ssh=v200905272300,:pserver:anonymous:none@dev.eclipse.org:/cvsroot/dsdp,,org.eclipse.tm.core/terminal/org.eclipse.tm.terminal.ssh
|
plugin@org.eclipse.tm.terminal.ssh=v200905272300,:pserver:anonymous:none@dev.eclipse.org:/cvsroot/dsdp,,org.eclipse.tm.core/terminal/org.eclipse.tm.terminal.ssh
|
||||||
plugin@org.eclipse.tm.terminal.telnet=v200909160005,:pserver:anonymous:none@dev.eclipse.org:/cvsroot/dsdp,,org.eclipse.tm.core/terminal/org.eclipse.tm.terminal.telnet
|
plugin@org.eclipse.tm.terminal.telnet=v200909160005,:pserver:anonymous:none@dev.eclipse.org:/cvsroot/dsdp,,org.eclipse.tm.core/terminal/org.eclipse.tm.terminal.telnet
|
||||||
|
|
|
@ -13,7 +13,12 @@
|
||||||
package org.eclipse.tm.internal.terminal.local;
|
package org.eclipse.tm.internal.terminal.local;
|
||||||
|
|
||||||
import java.io.OutputStream;
|
import java.io.OutputStream;
|
||||||
|
import java.text.Format;
|
||||||
|
import java.text.MessageFormat;
|
||||||
|
|
||||||
import org.eclipse.core.runtime.CoreException;
|
import org.eclipse.core.runtime.CoreException;
|
||||||
|
import org.eclipse.core.runtime.IStatus;
|
||||||
|
import org.eclipse.core.runtime.Status;
|
||||||
import org.eclipse.debug.core.DebugEvent;
|
import org.eclipse.debug.core.DebugEvent;
|
||||||
import org.eclipse.debug.core.DebugException;
|
import org.eclipse.debug.core.DebugException;
|
||||||
import org.eclipse.debug.core.DebugPlugin;
|
import org.eclipse.debug.core.DebugPlugin;
|
||||||
|
@ -26,6 +31,9 @@ import org.eclipse.debug.core.model.IProcess;
|
||||||
import org.eclipse.debug.core.model.IStreamMonitor;
|
import org.eclipse.debug.core.model.IStreamMonitor;
|
||||||
import org.eclipse.debug.core.model.IStreamsProxy;
|
import org.eclipse.debug.core.model.IStreamsProxy;
|
||||||
import org.eclipse.debug.ui.IDebugUIConstants;
|
import org.eclipse.debug.ui.IDebugUIConstants;
|
||||||
|
import org.eclipse.jface.dialogs.ErrorDialog;
|
||||||
|
import org.eclipse.swt.widgets.Display;
|
||||||
|
import org.eclipse.swt.widgets.Shell;
|
||||||
import org.eclipse.tm.internal.terminal.local.launch.LocalTerminalLaunchUtilities;
|
import org.eclipse.tm.internal.terminal.local.launch.LocalTerminalLaunchUtilities;
|
||||||
import org.eclipse.tm.internal.terminal.local.process.LocalTerminalProcessFactory;
|
import org.eclipse.tm.internal.terminal.local.process.LocalTerminalProcessFactory;
|
||||||
import org.eclipse.tm.internal.terminal.local.process.LocalTerminalProcessRegistry;
|
import org.eclipse.tm.internal.terminal.local.process.LocalTerminalProcessRegistry;
|
||||||
|
@ -42,7 +50,7 @@ import org.eclipse.tm.internal.terminal.provisional.api.provider.TerminalConnect
|
||||||
* <code>vi</code> editor).
|
* <code>vi</code> editor).
|
||||||
*
|
*
|
||||||
* @author Mirko Raner
|
* @author Mirko Raner
|
||||||
* @version $Revision: 1.4 $
|
* @version $Revision: 1.1 $
|
||||||
*/
|
*/
|
||||||
public class LocalTerminalConnector extends TerminalConnectorImpl
|
public class LocalTerminalConnector extends TerminalConnectorImpl
|
||||||
implements IDebugEventSetListener {
|
implements IDebugEventSetListener {
|
||||||
|
@ -171,22 +179,48 @@ implements IDebugEventSetListener {
|
||||||
control.setState(TerminalState.CONNECTING);
|
control.setState(TerminalState.CONNECTING);
|
||||||
ILaunchConfigurationWorkingCopy workingCopy = null;
|
ILaunchConfigurationWorkingCopy workingCopy = null;
|
||||||
ILaunchConfiguration configuration = null;
|
ILaunchConfiguration configuration = null;
|
||||||
|
String configurationName = null;
|
||||||
try {
|
try {
|
||||||
|
|
||||||
String configurationName = settings.getLaunchConfigurationName();
|
configurationName = settings.getLaunchConfigurationName();
|
||||||
configuration = LocalTerminalUtilities.findLaunchConfiguration(configurationName);
|
configuration = LocalTerminalUtilities.findLaunchConfiguration(configurationName);
|
||||||
|
}
|
||||||
|
catch (CoreException exception) {
|
||||||
|
|
||||||
// Always set the the process factory ID and enable console output (there is no need
|
Shell shell = Display.getDefault().getActiveShell();
|
||||||
// to restore these attributes afterwards; disabling console output does not make
|
String title = LocalTerminalMessages.errorTitleCouldNotConnectToTerminal;
|
||||||
// sense for terminal launches and will be overridden when the configuration is
|
Format text;
|
||||||
// actually launched):
|
text = new MessageFormat(LocalTerminalMessages.errorLaunchConfigurationNoLongerExists);
|
||||||
//
|
String message = text.format(new Object[] {configurationName});
|
||||||
|
IStatus status = new Status(IStatus.ERROR, LocalTerminalActivator.PLUGIN_ID, message);
|
||||||
|
ErrorDialog.openError(shell, title, null, status);
|
||||||
|
control.setState(TerminalState.CLOSED);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
|
||||||
|
String oldFactoryID = configuration.getAttribute(ATTR_PROCESS_FACTORY_ID, (String)null);
|
||||||
workingCopy = configuration.getWorkingCopy();
|
workingCopy = configuration.getWorkingCopy();
|
||||||
workingCopy.setAttribute(ATTR_CAPTURE_OUTPUT, true);
|
workingCopy.setAttribute(ATTR_CAPTURE_OUTPUT, true);
|
||||||
workingCopy.setAttribute(ATTR_CAPTURE_IN_CONSOLE, true);
|
workingCopy.setAttribute(ATTR_CAPTURE_IN_CONSOLE, true);
|
||||||
workingCopy.setAttribute(ATTR_PROCESS_FACTORY_ID, LocalTerminalProcessFactory.ID);
|
workingCopy.setAttribute(ATTR_PROCESS_FACTORY_ID, LocalTerminalProcessFactory.ID);
|
||||||
configuration = workingCopy.doSave();
|
configuration = workingCopy.doSave();
|
||||||
|
try {
|
||||||
|
|
||||||
launch = configuration.launch(ILaunchManager.RUN_MODE, null);
|
launch = configuration.launch(ILaunchManager.RUN_MODE, null);
|
||||||
|
}
|
||||||
|
finally {
|
||||||
|
|
||||||
|
// The process factory ID is used to distinguish between launches that originate
|
||||||
|
// from the terminal connector and launches that originate from the launch dialog.
|
||||||
|
// After launching, the original ID is restored so that the launch is not mistaken
|
||||||
|
// as originating from the terminal connector UI when it is launched via the launch
|
||||||
|
// dialog the next time:
|
||||||
|
//
|
||||||
|
workingCopy = configuration.getWorkingCopy();
|
||||||
|
workingCopy.setAttribute(ATTR_PROCESS_FACTORY_ID, oldFactoryID);
|
||||||
|
workingCopy.doSave();
|
||||||
|
}
|
||||||
|
|
||||||
// To prevent a console from being allocated, the launch will actually not contain a
|
// To prevent a console from being allocated, the launch will actually not contain a
|
||||||
// reference to the runtime process. The process has to be obtained from the
|
// reference to the runtime process. The process has to be obtained from the
|
||||||
|
@ -257,9 +291,9 @@ implements IDebugEventSetListener {
|
||||||
//
|
//
|
||||||
LocalTerminalProcessRegistry.addProcessBackToFinishedLaunch(launch);
|
LocalTerminalProcessRegistry.addProcessBackToFinishedLaunch(launch);
|
||||||
|
|
||||||
// Now, terminate the process if it hasn't been terminated already:
|
// Now, terminate the process if it was ever started and hasn't been terminated already:
|
||||||
//
|
//
|
||||||
if (launch.canTerminate()) {
|
if (launch != null && launch.canTerminate()) {
|
||||||
|
|
||||||
launch.terminate();
|
launch.terminate();
|
||||||
//
|
//
|
||||||
|
|
|
@ -51,7 +51,7 @@ public class LocalTerminalLaunchListProvider implements IStructuredContentProvid
|
||||||
public Object[] getElements(Object input) {
|
public Object[] getElements(Object input) {
|
||||||
|
|
||||||
ILaunchManager launchManager = DebugPlugin.getDefault().getLaunchManager();
|
ILaunchManager launchManager = DebugPlugin.getDefault().getLaunchManager();
|
||||||
ILaunchConfigurationType type = LocalTerminalUtilities.PROGRAM_LAUNCH_TYPE;
|
ILaunchConfigurationType type = LocalTerminalUtilities.TERMINAL_LAUNCH_TYPE;
|
||||||
ILaunchConfiguration[] configurations = null;
|
ILaunchConfiguration[] configurations = null;
|
||||||
try {
|
try {
|
||||||
|
|
||||||
|
|
|
@ -18,7 +18,7 @@ import org.eclipse.osgi.util.NLS;
|
||||||
* messages used by the Local Terminal Connector.
|
* messages used by the Local Terminal Connector.
|
||||||
*
|
*
|
||||||
* @author Mirko Raner
|
* @author Mirko Raner
|
||||||
* @version $Revision: 1.3 $
|
* @version $Revision: 1.1 $
|
||||||
*/
|
*/
|
||||||
public class LocalTerminalMessages extends NLS {
|
public class LocalTerminalMessages extends NLS {
|
||||||
|
|
||||||
|
@ -80,6 +80,15 @@ public class LocalTerminalMessages extends NLS {
|
||||||
/** The error message for an invalid working directory location. */
|
/** The error message for an invalid working directory location. */
|
||||||
public static String invalidWorkingDirectory;
|
public static String invalidWorkingDirectory;
|
||||||
|
|
||||||
|
/** The error message for attempting to directly launch a Terminal launch configuration. */
|
||||||
|
public static String errorDirectLaunch;
|
||||||
|
|
||||||
|
/** The error message for attempting to launch a no longer existing launch configuration. */
|
||||||
|
public static String errorLaunchConfigurationNoLongerExists;
|
||||||
|
|
||||||
|
/** The error dialog title for failed terminal connections. */
|
||||||
|
public static String errorTitleCouldNotConnectToTerminal;
|
||||||
|
|
||||||
/** The title string of the warning displayed when terminal launches are still running. */
|
/** The title string of the warning displayed when terminal launches are still running. */
|
||||||
public static String warningTitleTerminalsStillRunning;
|
public static String warningTitleTerminalsStillRunning;
|
||||||
|
|
||||||
|
|
|
@ -28,6 +28,13 @@ locationNotSpecified=Executable location was not specified in configuration ''{0
|
||||||
invalidLocation=Executable does not exist for the external tool named ''{0}''
|
invalidLocation=Executable does not exist for the external tool named ''{0}''
|
||||||
invalidWorkingDirectory=The path {0} is not a directory and cannot be used as working directory \
|
invalidWorkingDirectory=The path {0} is not a directory and cannot be used as working directory \
|
||||||
for ''{1}''
|
for ''{1}''
|
||||||
|
errorDirectLaunch=Terminal launch configurations can only be launched from the Terminal view. \
|
||||||
|
Please open the Terminal view and click the view's Settings button to select and launch a local \
|
||||||
|
Terminal.
|
||||||
|
errorLaunchConfigurationNoLongerExists=The launch configuration ''{0}'' that is selected in the \
|
||||||
|
Terminal Settings does no longer exist. Please open the Settings dialog to select a valid launch \
|
||||||
|
configuration.
|
||||||
|
errorTitleCouldNotConnectToTerminal=Could not connect to Terminal
|
||||||
warningTitleTerminalsStillRunning=Warning: Terminals with active processes are still running
|
warningTitleTerminalsStillRunning=Warning: Terminals with active processes are still running
|
||||||
warningMessageTerminalsStillRunning=The workbench is about to be shut down even though one or more \
|
warningMessageTerminalsStillRunning=The workbench is about to be shut down even though one or more \
|
||||||
terminals with active processes are still running. You may abort the shut-down of the workbench \
|
terminals with active processes are still running. You may abort the shut-down of the workbench \
|
||||||
|
|
|
@ -37,6 +37,7 @@ import org.eclipse.swt.widgets.Layout;
|
||||||
import org.eclipse.swt.widgets.Shell;
|
import org.eclipse.swt.widgets.Shell;
|
||||||
import org.eclipse.swt.widgets.Table;
|
import org.eclipse.swt.widgets.Table;
|
||||||
import org.eclipse.swt.widgets.Widget;
|
import org.eclipse.swt.widgets.Widget;
|
||||||
|
import org.eclipse.tm.internal.terminal.local.launch.LocalTerminalLaunchUtilities;
|
||||||
import org.eclipse.tm.internal.terminal.local.ui.DependentHeightComposite;
|
import org.eclipse.tm.internal.terminal.local.ui.DependentHeightComposite;
|
||||||
import org.eclipse.tm.internal.terminal.provisional.api.ISettingsPage;
|
import org.eclipse.tm.internal.terminal.provisional.api.ISettingsPage;
|
||||||
import org.eclipse.tm.internal.terminal.provisional.api.Logger;
|
import org.eclipse.tm.internal.terminal.provisional.api.Logger;
|
||||||
|
@ -46,7 +47,7 @@ import org.eclipse.tm.internal.terminal.provisional.api.Logger;
|
||||||
* local program connections.
|
* local program connections.
|
||||||
*
|
*
|
||||||
* @author Mirko Raner
|
* @author Mirko Raner
|
||||||
* @version $Revision: 1.4 $
|
* @version $Revision: 1.1 $
|
||||||
*/
|
*/
|
||||||
public class LocalTerminalSettingsPage
|
public class LocalTerminalSettingsPage
|
||||||
implements ISettingsPage, ISelectionChangedListener, SelectionListener {
|
implements ISettingsPage, ISelectionChangedListener, SelectionListener {
|
||||||
|
@ -78,6 +79,8 @@ implements ISettingsPage, ISelectionChangedListener, SelectionListener {
|
||||||
*/
|
*/
|
||||||
public void createControl(Composite parent) {
|
public void createControl(Composite parent) {
|
||||||
|
|
||||||
|
ILaunchConfiguration defaultConfiguration;
|
||||||
|
defaultConfiguration = LocalTerminalLaunchUtilities.createDefaultLaunchConfiguration();
|
||||||
Composite enclosing = parent.getParent();
|
Composite enclosing = parent.getParent();
|
||||||
Layout enclosingLayout = enclosing.getLayout();
|
Layout enclosingLayout = enclosing.getLayout();
|
||||||
int extra = 0;
|
int extra = 0;
|
||||||
|
@ -127,6 +130,13 @@ implements ISettingsPage, ISelectionChangedListener, SelectionListener {
|
||||||
// in having it be a part of the ISettingsPage interface
|
// in having it be a part of the ISettingsPage interface
|
||||||
//
|
//
|
||||||
loadSettings();
|
loadSettings();
|
||||||
|
if (defaultConfiguration != null) {
|
||||||
|
|
||||||
|
// If there is only one configuration (the default one), then make sure it gets
|
||||||
|
// selected:
|
||||||
|
//
|
||||||
|
viewer.setSelection(new StructuredSelection(defaultConfiguration), true);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -229,8 +239,8 @@ implements ISettingsPage, ISelectionChangedListener, SelectionListener {
|
||||||
ILaunchConfigurationWorkingCopy newlyCreatedConfiguration;
|
ILaunchConfigurationWorkingCopy newlyCreatedConfiguration;
|
||||||
ILaunchManager launchManager = DebugPlugin.getDefault().getLaunchManager();
|
ILaunchManager launchManager = DebugPlugin.getDefault().getLaunchManager();
|
||||||
String baseName = LocalTerminalMessages.newTerminalLaunchName;
|
String baseName = LocalTerminalMessages.newTerminalLaunchName;
|
||||||
String uniqueName = launchManager.generateUniqueLaunchConfigurationNameFrom(baseName);
|
String uniqueName = launchManager.generateLaunchConfigurationName(baseName);
|
||||||
ILaunchConfigurationType type = LocalTerminalUtilities.PROGRAM_LAUNCH_TYPE;
|
ILaunchConfigurationType type = LocalTerminalUtilities.TERMINAL_LAUNCH_TYPE;
|
||||||
try {
|
try {
|
||||||
|
|
||||||
newlyCreatedConfiguration = type.newInstance(null, uniqueName);
|
newlyCreatedConfiguration = type.newInstance(null, uniqueName);
|
||||||
|
|
|
@ -28,7 +28,7 @@ import org.eclipse.tm.internal.terminal.provisional.api.Logger;
|
||||||
* methods.
|
* methods.
|
||||||
*
|
*
|
||||||
* @author Mirko Raner
|
* @author Mirko Raner
|
||||||
* @version $Revision: 1.3 $
|
* @version $Revision: 1.1 $
|
||||||
*/
|
*/
|
||||||
public class LocalTerminalUtilities {
|
public class LocalTerminalUtilities {
|
||||||
|
|
||||||
|
@ -56,10 +56,10 @@ public class LocalTerminalUtilities {
|
||||||
public final static ILaunchManager LAUNCH_MANAGER = DebugPlugin.getDefault().getLaunchManager();
|
public final static ILaunchManager LAUNCH_MANAGER = DebugPlugin.getDefault().getLaunchManager();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The {@link ILaunchConfigurationType} for "Program" launches (in the "External Tools"
|
* The {@link ILaunchConfigurationType} for "Terminal" launches (in the "External Tools"
|
||||||
* category).
|
* category).
|
||||||
*/
|
*/
|
||||||
public final static ILaunchConfigurationType PROGRAM_LAUNCH_TYPE =
|
public final static ILaunchConfigurationType TERMINAL_LAUNCH_TYPE =
|
||||||
LAUNCH_MANAGER.getLaunchConfigurationType(LOCAL_TERMINAL);
|
LAUNCH_MANAGER.getLaunchConfigurationType(LOCAL_TERMINAL);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -74,7 +74,7 @@ public class LocalTerminalUtilities {
|
||||||
|
|
||||||
ILaunchConfiguration[] configuration;
|
ILaunchConfiguration[] configuration;
|
||||||
ILaunchManager manager = DebugPlugin.getDefault().getLaunchManager();
|
ILaunchManager manager = DebugPlugin.getDefault().getLaunchManager();
|
||||||
configuration = manager.getLaunchConfigurations(LocalTerminalUtilities.PROGRAM_LAUNCH_TYPE);
|
configuration = manager.getLaunchConfigurations(LocalTerminalUtilities.TERMINAL_LAUNCH_TYPE);
|
||||||
int numberOfConfigurations = configuration.length;
|
int numberOfConfigurations = configuration.length;
|
||||||
for (int index = 0; index < numberOfConfigurations; index++) {
|
for (int index = 0; index < numberOfConfigurations; index++) {
|
||||||
|
|
||||||
|
|
|
@ -32,6 +32,7 @@ import org.eclipse.osgi.util.NLS;
|
||||||
import org.eclipse.tm.internal.terminal.local.LocalTerminalActivator;
|
import org.eclipse.tm.internal.terminal.local.LocalTerminalActivator;
|
||||||
import org.eclipse.tm.internal.terminal.local.LocalTerminalMessages;
|
import org.eclipse.tm.internal.terminal.local.LocalTerminalMessages;
|
||||||
import org.eclipse.tm.internal.terminal.local.LocalTerminalUtilities;
|
import org.eclipse.tm.internal.terminal.local.LocalTerminalUtilities;
|
||||||
|
import org.eclipse.tm.internal.terminal.local.process.LocalTerminalProcessFactory;
|
||||||
import org.eclipse.tm.internal.terminal.provisional.api.Logger;
|
import org.eclipse.tm.internal.terminal.provisional.api.Logger;
|
||||||
import org.eclipse.ui.PlatformUI;
|
import org.eclipse.ui.PlatformUI;
|
||||||
|
|
||||||
|
@ -43,7 +44,7 @@ import org.eclipse.ui.PlatformUI;
|
||||||
* {@link ProcessFactory}, which allows the process to run with a pseudo-terminal ({@link PTY}).
|
* {@link ProcessFactory}, which allows the process to run with a pseudo-terminal ({@link PTY}).
|
||||||
*
|
*
|
||||||
* @author Mirko Raner and others
|
* @author Mirko Raner and others
|
||||||
* @version $Revision: 1.1 $
|
* @version $Revision: 1.2 $
|
||||||
*/
|
*/
|
||||||
public class LocalTerminalLaunchDelegate extends LaunchConfigurationDelegate {
|
public class LocalTerminalLaunchDelegate extends LaunchConfigurationDelegate {
|
||||||
|
|
||||||
|
@ -80,6 +81,20 @@ public class LocalTerminalLaunchDelegate extends LaunchConfigurationDelegate {
|
||||||
public void launch(ILaunchConfiguration configuration, String mode, ILaunch launch,
|
public void launch(ILaunchConfiguration configuration, String mode, ILaunch launch,
|
||||||
IProgressMonitor progressMonitor) throws CoreException {
|
IProgressMonitor progressMonitor) throws CoreException {
|
||||||
|
|
||||||
|
String processFactoryID;
|
||||||
|
processFactoryID = configuration.getAttribute(DebugPlugin.ATTR_PROCESS_FACTORY_ID, EMPTY);
|
||||||
|
if (!LocalTerminalProcessFactory.ID.equals(processFactoryID)) {
|
||||||
|
|
||||||
|
// This launch was not launched via the terminal connector UI but via the launch dialog;
|
||||||
|
// the launch needs to be explicitly connected to a terminal (otherwise it will appear
|
||||||
|
// in the regular console), so launching from the launch dialog or from the launch
|
||||||
|
// history is not supported right now.
|
||||||
|
//
|
||||||
|
String message = LocalTerminalMessages.errorDirectLaunch;
|
||||||
|
IStatus status = new Status(IStatus.ERROR, LocalTerminalActivator.PLUGIN_ID, message);
|
||||||
|
throw new CoreException(status);
|
||||||
|
}
|
||||||
|
|
||||||
// Extract all relevant information from the ILaunchConfiguration; the original
|
// Extract all relevant information from the ILaunchConfiguration; the original
|
||||||
// ProgramLaunchDelegate class checks for cancellation again and again after each step,
|
// ProgramLaunchDelegate class checks for cancellation again and again after each step,
|
||||||
// which is a somewhat suspect pattern; however, for now, LocalTerminalLaunchDelegate
|
// which is a somewhat suspect pattern; however, for now, LocalTerminalLaunchDelegate
|
||||||
|
|
|
@ -16,16 +16,20 @@ import org.eclipse.core.runtime.CoreException;
|
||||||
import org.eclipse.core.runtime.IPath;
|
import org.eclipse.core.runtime.IPath;
|
||||||
import org.eclipse.core.runtime.IStatus;
|
import org.eclipse.core.runtime.IStatus;
|
||||||
import org.eclipse.core.runtime.Path;
|
import org.eclipse.core.runtime.Path;
|
||||||
|
import org.eclipse.core.runtime.Platform;
|
||||||
import org.eclipse.core.runtime.Status;
|
import org.eclipse.core.runtime.Status;
|
||||||
import org.eclipse.core.variables.IStringVariableManager;
|
import org.eclipse.core.variables.IStringVariableManager;
|
||||||
import org.eclipse.core.variables.VariablesPlugin;
|
import org.eclipse.core.variables.VariablesPlugin;
|
||||||
import org.eclipse.debug.core.DebugPlugin;
|
import org.eclipse.debug.core.DebugPlugin;
|
||||||
import org.eclipse.debug.core.ILaunchConfiguration;
|
import org.eclipse.debug.core.ILaunchConfiguration;
|
||||||
|
import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
|
||||||
|
import org.eclipse.debug.core.ILaunchManager;
|
||||||
import org.eclipse.debug.ui.DebugUITools;
|
import org.eclipse.debug.ui.DebugUITools;
|
||||||
import org.eclipse.osgi.util.NLS;
|
import org.eclipse.osgi.util.NLS;
|
||||||
import org.eclipse.swt.graphics.Image;
|
import org.eclipse.swt.graphics.Image;
|
||||||
import org.eclipse.tm.internal.terminal.local.LocalTerminalActivator;
|
import org.eclipse.tm.internal.terminal.local.LocalTerminalActivator;
|
||||||
import org.eclipse.tm.internal.terminal.local.LocalTerminalMessages;
|
import org.eclipse.tm.internal.terminal.local.LocalTerminalMessages;
|
||||||
|
import org.eclipse.tm.internal.terminal.local.LocalTerminalUtilities;
|
||||||
import org.eclipse.tm.internal.terminal.provisional.api.Logger;
|
import org.eclipse.tm.internal.terminal.provisional.api.Logger;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -35,7 +39,7 @@ import org.eclipse.tm.internal.terminal.provisional.api.Logger;
|
||||||
* because the original class is not part of the public API of its plug-in.
|
* because the original class is not part of the public API of its plug-in.
|
||||||
*
|
*
|
||||||
* @author Mirko Raner and others
|
* @author Mirko Raner and others
|
||||||
* @version $Revision: 1.2 $
|
* @version $Revision: 1.1 $
|
||||||
*/
|
*/
|
||||||
public class LocalTerminalLaunchUtilities {
|
public class LocalTerminalLaunchUtilities {
|
||||||
|
|
||||||
|
@ -176,6 +180,84 @@ public class LocalTerminalLaunchUtilities {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates an initial default launch configuration for starting a shell if no terminal/program
|
||||||
|
* launch configurations are defined yet.
|
||||||
|
*
|
||||||
|
* @return new {@link ILaunchConfiguration}, or {@code null} if there were already some
|
||||||
|
* terminal/program launch configurations defined
|
||||||
|
*/
|
||||||
|
public static ILaunchConfiguration createDefaultLaunchConfiguration() {
|
||||||
|
|
||||||
|
ILaunchConfiguration[] configs;
|
||||||
|
ILaunchManager manager = LocalTerminalUtilities.LAUNCH_MANAGER;
|
||||||
|
try {
|
||||||
|
|
||||||
|
configs = manager.getLaunchConfigurations(LocalTerminalUtilities.TERMINAL_LAUNCH_TYPE);
|
||||||
|
if (configs == null || configs.length == 0) {
|
||||||
|
|
||||||
|
// Create a default launch configuration only if there aren't any terminal launch
|
||||||
|
// configurations defined at all:
|
||||||
|
//
|
||||||
|
ILaunchConfigurationWorkingCopy workingCopy;
|
||||||
|
workingCopy = createNewLaunchConfigurationWorkingCopy();
|
||||||
|
return workingCopy.doSave();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (CoreException exception)
|
||||||
|
{
|
||||||
|
exception.printStackTrace(); // TODO: implement proper exception handling
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates an {@link ILaunchConfigurationWorkingCopy} that uses the default shell as its
|
||||||
|
* executable and the user's home directory as the working directory.
|
||||||
|
*
|
||||||
|
* @return an unsaved {@link ILaunchConfigurationWorkingCopy}
|
||||||
|
* @throws CoreException if the {@link ILaunchConfigurationWorkingCopy} could not be
|
||||||
|
* instantiated
|
||||||
|
* @see #getDefaultShell()
|
||||||
|
*/
|
||||||
|
public static ILaunchConfigurationWorkingCopy createNewLaunchConfigurationWorkingCopy()
|
||||||
|
throws CoreException {
|
||||||
|
|
||||||
|
ILaunchConfigurationWorkingCopy workingCopy;
|
||||||
|
ILaunchManager manager = LocalTerminalUtilities.LAUNCH_MANAGER;
|
||||||
|
String userHome = System.getProperty("user.home", "/"); //$NON-NLS-1$//$NON-NLS-2$
|
||||||
|
String name = manager.generateLaunchConfigurationName("Terminal"); //$NON-NLS-1$
|
||||||
|
workingCopy = LocalTerminalUtilities.TERMINAL_LAUNCH_TYPE.newInstance(null, name);
|
||||||
|
workingCopy.setAttribute(ATTR_LOCATION, getDefaultShell().getAbsolutePath());
|
||||||
|
workingCopy.setAttribute(ATTR_WORKING_DIRECTORY, userHome);
|
||||||
|
return workingCopy;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the system's default shell. First, this method will read the value of the environment
|
||||||
|
* variable {@code SHELL}. If that variable is not set, it will default to {@code cmd.exe} on
|
||||||
|
* Windows systems, and to {@code /bin/sh} on all other systems.
|
||||||
|
*
|
||||||
|
* @return a {@link File} pointing to the default shell (the underlying file is not guaranteed
|
||||||
|
* to exist in the file system)
|
||||||
|
*/
|
||||||
|
public static File getDefaultShell() {
|
||||||
|
|
||||||
|
String shell = System.getenv("SHELL"); //$NON-NLS-1$
|
||||||
|
if (shell == null) {
|
||||||
|
|
||||||
|
if (Platform.OS_WIN32.equals(Platform.getOS())) {
|
||||||
|
|
||||||
|
shell = "C:\\Windows\\System32\\cmd.exe"; //$NON-NLS-1$
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
|
||||||
|
shell = "/bin/sh"; //$NON-NLS-1$
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return new File(shell);
|
||||||
|
}
|
||||||
|
|
||||||
//------------------------------------- PRIVATE SECTION --------------------------------------//
|
//------------------------------------- PRIVATE SECTION --------------------------------------//
|
||||||
|
|
||||||
private static IStringVariableManager getStringVariableManager() {
|
private static IStringVariableManager getStringVariableManager() {
|
||||||
|
|
|
@ -34,12 +34,10 @@ import org.eclipse.tm.internal.terminal.provisional.api.Logger;
|
||||||
* @author Mirko Raner
|
* @author Mirko Raner
|
||||||
* @version $Revision: 1.1 $
|
* @version $Revision: 1.1 $
|
||||||
**/
|
**/
|
||||||
public class LocalTerminalLaunchTabGroup extends AbstractLaunchConfigurationTabGroup
|
public class LocalTerminalLaunchTabGroup extends AbstractLaunchConfigurationTabGroup {
|
||||||
implements IDebugUIConstants {
|
|
||||||
|
|
||||||
private final static String ID = "id"; //$NON-NLS-1$
|
private final static String ID = "id"; //$NON-NLS-1$
|
||||||
private final static String CLASS = "class"; //$NON-NLS-1$
|
private final static String CLASS = "class"; //$NON-NLS-1$
|
||||||
private final static String LC_TAB_GROUPS = EXTENSION_POINT_LAUNCH_CONFIGURATION_TAB_GROUPS;
|
|
||||||
private final static String PROGRAM_TAB_GROUP =
|
private final static String PROGRAM_TAB_GROUP =
|
||||||
"org.eclipse.ui.externaltools.launchConfigurationTabGroup.program"; //$NON-NLS-1$
|
"org.eclipse.ui.externaltools.launchConfigurationTabGroup.program"; //$NON-NLS-1$
|
||||||
|
|
||||||
|
@ -81,7 +79,8 @@ implements IDebugUIConstants {
|
||||||
//
|
//
|
||||||
IConfigurationElement[] element;
|
IConfigurationElement[] element;
|
||||||
IExtensionRegistry registry = Platform.getExtensionRegistry();
|
IExtensionRegistry registry = Platform.getExtensionRegistry();
|
||||||
element = registry.getConfigurationElementsFor(IDebugUIConstants.PLUGIN_ID, LC_TAB_GROUPS);
|
final String TAB_GROUPS = IDebugUIConstants.EXTENSION_POINT_LAUNCH_CONFIGURATION_TAB_GROUPS;
|
||||||
|
element = registry.getConfigurationElementsFor(IDebugUIConstants.PLUGIN_ID, TAB_GROUPS);
|
||||||
int numberOfElements = element.length;
|
int numberOfElements = element.length;
|
||||||
for (int index = 0; index < numberOfElements; index++) {
|
for (int index = 0; index < numberOfElements; index++) {
|
||||||
|
|
||||||
|
|
|
@ -38,7 +38,7 @@ import org.eclipse.tm.internal.terminal.provisional.api.Logger;
|
||||||
* and the line separator string.
|
* and the line separator string.
|
||||||
*
|
*
|
||||||
* @author Mirko Raner
|
* @author Mirko Raner
|
||||||
* @version $Revision: 1.2 $
|
* @version $Revision: 1.1 $
|
||||||
**/
|
**/
|
||||||
public class LocalTerminalSettingsTab extends AbstractLaunchConfigurationTab
|
public class LocalTerminalSettingsTab extends AbstractLaunchConfigurationTab
|
||||||
implements SelectionListener {
|
implements SelectionListener {
|
||||||
|
@ -230,6 +230,23 @@ implements SelectionListener {
|
||||||
configuration.setAttribute(LocalTerminalLaunchUtilities.ATTR_LINE_SEPARATOR, NULL);
|
configuration.setAttribute(LocalTerminalLaunchUtilities.ATTR_LINE_SEPARATOR, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Prevents Terminal launch configurations from being started directly from the launch
|
||||||
|
* configuration dialog. The <b>Run</b> button in the dialog will only be enabled if all tabs
|
||||||
|
* consider a launch configuration valid.
|
||||||
|
*
|
||||||
|
* TODO: previously used launches can still be launched via the launch history
|
||||||
|
* (see {@code ExternalToolMenuDelegate#fillMenu(Menu)})
|
||||||
|
*
|
||||||
|
* @param configuration the {@link ILaunchConfiguration}
|
||||||
|
* @return always {@code false}
|
||||||
|
* @see org.eclipse.debug.ui.ILaunchConfigurationTab#isValid(ILaunchConfiguration)
|
||||||
|
*/
|
||||||
|
public boolean isValid(ILaunchConfiguration configuration) {
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Handles selection of any of the buttons in the tab.
|
* Handles selection of any of the buttons in the tab.
|
||||||
*
|
*
|
||||||
|
|
Loading…
Add table
Reference in a new issue