diff --git a/launch/org.eclipse.cdt.launch/src/org/eclipse/cdt/launch/internal/LocalRunLaunchDelegate.java b/launch/org.eclipse.cdt.launch/src/org/eclipse/cdt/launch/internal/LocalRunLaunchDelegate.java index ffa492fe798..3b224b4af6a 100644 --- a/launch/org.eclipse.cdt.launch/src/org/eclipse/cdt/launch/internal/LocalRunLaunchDelegate.java +++ b/launch/org.eclipse.cdt.launch/src/org/eclipse/cdt/launch/internal/LocalRunLaunchDelegate.java @@ -25,6 +25,7 @@ import org.eclipse.cdt.debug.core.cdi.model.ICDITarget; import org.eclipse.cdt.launch.AbstractCLaunchDelegate; import org.eclipse.cdt.launch.internal.ui.LaunchMessages; import org.eclipse.cdt.launch.internal.ui.LaunchUIPlugin; +import org.eclipse.cdt.utils.pty.PTY; import org.eclipse.cdt.utils.spawner.ProcessFactory; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IPath; @@ -119,8 +120,9 @@ public class LocalRunLaunchDelegate extends AbstractCLaunchDelegate { command.add(exePath.toOSString()); command.addAll(Arrays.asList(arguments)); String[] commandArray = (String[]) command.toArray(new String[command.size()]); + boolean usePty = config.getAttribute(ICDTLaunchConfigurationConstants.ATTR_USE_TERMINAL, false); monitor.worked(5); - Process process = exec(commandArray, getEnvironment(config), wd); + Process process = exec(commandArray, getEnvironment(config), wd, usePty); monitor.worked(3); DebugPlugin.newProcess(launch, process, renderProcessLabel(commandArray[0])); } @@ -145,14 +147,17 @@ public class LocalRunLaunchDelegate extends AbstractCLaunchDelegate { * cancelled * @see Runtime */ - protected Process exec(String[] cmdLine, String[] environ, File workingDirectory) throws CoreException { + protected Process exec(String[] cmdLine, String[] environ, File workingDirectory, boolean usePty) throws CoreException { Process p = null; try { - if (workingDirectory == null) { p = ProcessFactory.getFactory().exec(cmdLine, environ); } else { - p = ProcessFactory.getFactory().exec(cmdLine, environ, workingDirectory); + if (usePty && PTY.isSupported()) { + p = ProcessFactory.getFactory().exec(cmdLine, environ, workingDirectory, new PTY()); + } else { + p = ProcessFactory.getFactory().exec(cmdLine, environ, workingDirectory); + } } } catch (IOException e) { if (p != null) { @@ -173,7 +178,7 @@ public class LocalRunLaunchDelegate extends AbstractCLaunchDelegate { if (handler != null) { Object result = handler.handleStatus(status, this); if (result instanceof Boolean && ((Boolean) result).booleanValue()) { - p = exec(cmdLine, environ, null); + p = exec(cmdLine, environ, null, usePty); } } } diff --git a/launch/org.eclipse.cdt.launch/src/org/eclipse/cdt/launch/internal/ui/LaunchMessages.properties b/launch/org.eclipse.cdt.launch/src/org/eclipse/cdt/launch/internal/ui/LaunchMessages.properties index 52e477de846..54edf796da0 100644 --- a/launch/org.eclipse.cdt.launch/src/org/eclipse/cdt/launch/internal/ui/LaunchMessages.properties +++ b/launch/org.eclipse.cdt.launch/src/org/eclipse/cdt/launch/internal/ui/LaunchMessages.properties @@ -90,6 +90,7 @@ CMainTab.C/C++_Application=C/C++ Application: CMainTab.Search...=Searc&h... CMainTab.Choose_program_to_run=Choose a &program to run: CMainTab.Choose_program_to_run_from_NAME=Choose a program to run from {0}: +CMainTab.UseTerminal=Connect process input && output to a terminal. CDebuggerTab.Advanced_Options_Dialog_Title=Advanced Options CDebuggerTab.Stop_at_main_on_startup=Stop at main() on startup diff --git a/launch/org.eclipse.cdt.launch/src/org/eclipse/cdt/launch/internal/ui/LocalRunLaunchConfigurationTabGroup.java b/launch/org.eclipse.cdt.launch/src/org/eclipse/cdt/launch/internal/ui/LocalRunLaunchConfigurationTabGroup.java index ea687389af8..f6a3463dfd0 100644 --- a/launch/org.eclipse.cdt.launch/src/org/eclipse/cdt/launch/internal/ui/LocalRunLaunchConfigurationTabGroup.java +++ b/launch/org.eclipse.cdt.launch/src/org/eclipse/cdt/launch/internal/ui/LocalRunLaunchConfigurationTabGroup.java @@ -26,7 +26,7 @@ public class LocalRunLaunchConfigurationTabGroup extends AbstractLaunchConfigura */ public void createTabs(ILaunchConfigurationDialog dialog, String mode) { ILaunchConfigurationTab[] tabs = new ILaunchConfigurationTab[] { - new CMainTab(), + new CMainTab(true), new CArgumentsTab(), new MigratingCEnvironmentTab(), new CDebuggerTab(false), diff --git a/launch/org.eclipse.cdt.launch/src/org/eclipse/cdt/launch/ui/CMainTab.java b/launch/org.eclipse.cdt.launch/src/org/eclipse/cdt/launch/ui/CMainTab.java index c23af760e14..51dfde79f71 100644 --- a/launch/org.eclipse.cdt.launch/src/org/eclipse/cdt/launch/ui/CMainTab.java +++ b/launch/org.eclipse.cdt.launch/src/org/eclipse/cdt/launch/ui/CMainTab.java @@ -1,13 +1,11 @@ -/********************************************************************** - * Copyright (c) 2002 - 2004 QNX Software Systems and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Common Public License v1.0 +/*************************************************************************************************** + * Copyright (c) 2002 - 2004 QNX Software Systems and others. All rights reserved. This program and + * the accompanying materials are made available under the terms of the Common Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/cpl-v10.html * - * Contributors: - * QNX Software Systems - Initial API and implementation -***********************************************************************/ + * Contributors: QNX Software Systems - Initial API and implementation + **************************************************************************************************/ package org.eclipse.cdt.launch.ui; import java.util.ArrayList; @@ -28,6 +26,7 @@ import org.eclipse.cdt.launch.internal.ui.LaunchUIPlugin; import org.eclipse.cdt.ui.CElementImageDescriptor; import org.eclipse.cdt.ui.CElementLabelProvider; import org.eclipse.cdt.ui.CUIPlugin; +import org.eclipse.cdt.utils.pty.PTY; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IResource; @@ -64,8 +63,8 @@ import org.eclipse.ui.model.WorkbenchContentProvider; import org.eclipse.ui.model.WorkbenchLabelProvider; /** - * A launch configuration tab that displays and edits project and main type name - * launch configuration attributes. + * A launch configuration tab that displays and edits project and main type name launch + * configuration attributes. *
* This class may be instantiated. This class is not intended to be subclassed. *
@@ -85,32 +84,54 @@ public class CMainTab extends CLaunchConfigurationTab { protected Text fProgText; protected Button fSearchButton; + private final boolean fWantsTerminalOption; + protected Button fTerminalButton; + protected static final String EMPTY_STRING = ""; //$NON-NLS-1$ private String filterPlatform = EMPTY_STRING; - /* (non-Javadoc) + + + public CMainTab() { + this(false); + } + + public CMainTab(boolean terminalOption) { + fWantsTerminalOption = terminalOption; + } + + /* + * (non-Javadoc) + * * @see org.eclipse.debug.ui.ILaunchConfigurationTab#createControl(org.eclipse.swt.widgets.Composite) */ public void createControl(Composite parent) { - Composite comp = new Composite(parent, SWT.NONE); setControl(comp); - WorkbenchHelp.setHelp(getControl(), ICDTLaunchHelpContextIds.LAUNCH_CONFIGURATION_DIALOG_MAIN_TAB); - GridLayout topLayout = new GridLayout(); comp.setLayout(topLayout); createVerticalSpacer(comp, 1); + createProjectGroup(comp, 1); + createExeFileGroup(comp, 1); + createVerticalSpacer(comp, 1); + if (wantsTerminalOption() /*&& ProcessFactory.supportesTerminal()*/) { + createTerminalOption(comp, 1); + } + LaunchUIPlugin.setDialogShell(parent.getShell()); + } - Composite projComp = new Composite(comp, SWT.NONE); + protected void createProjectGroup(Composite parent, int colSpan) { + Composite projComp = new Composite(parent, SWT.NONE); GridLayout projLayout = new GridLayout(); projLayout.numColumns = 2; projLayout.marginHeight = 0; projLayout.marginWidth = 0; projComp.setLayout(projLayout); GridData gd = new GridData(GridData.FILL_HORIZONTAL); + gd.horizontalSpan = colSpan; projComp.setLayoutData(gd); fProjLabel = new Label(projComp, SWT.NONE); @@ -137,16 +158,17 @@ public class CMainTab extends CLaunchConfigurationTab { updateLaunchConfigurationDialog(); } }); + } - createVerticalSpacer(comp, 1); - - Composite mainComp = new Composite(comp, SWT.NONE); + protected void createExeFileGroup(Composite parent, int colSpan) { + Composite mainComp = new Composite(parent, SWT.NONE); GridLayout mainLayout = new GridLayout(); mainLayout.numColumns = 3; mainLayout.marginHeight = 0; mainLayout.marginWidth = 0; mainComp.setLayout(mainLayout); - gd = new GridData(GridData.FILL_HORIZONTAL); + GridData gd = new GridData(GridData.FILL_HORIZONTAL); + gd.horizontalSpan = colSpan; mainComp.setLayoutData(gd); fProgLabel = new Label(mainComp, SWT.NONE); fProgLabel.setText(LaunchMessages.getString("CMainTab.C/C++_Application")); //$NON-NLS-1$ @@ -181,18 +203,54 @@ public class CMainTab extends CLaunchConfigurationTab { updateLaunchConfigurationDialog(); } }); - - LaunchUIPlugin.setDialogShell(parent.getShell()); } - /* (non-Javadoc) + protected boolean wantsTerminalOption() { + return fWantsTerminalOption; + } + + protected void createTerminalOption(Composite parent, int colSpan) { + Composite mainComp = new Composite(parent, SWT.NONE); + GridLayout mainLayout = new GridLayout(); + mainLayout.numColumns = 1; + mainLayout.marginHeight = 0; + mainLayout.marginWidth = 0; + mainComp.setLayout(mainLayout); + GridData gd = new GridData(GridData.FILL_HORIZONTAL); + gd.horizontalSpan = colSpan; + mainComp.setLayoutData(gd); + + fTerminalButton = createCheckButton(mainComp, LaunchMessages.getString("CMainTab.UseTerminal")); //$NON-NLS-1$ + fTerminalButton.addSelectionListener(new SelectionAdapter() { + + public void widgetSelected(SelectionEvent evt) { + updateLaunchConfigurationDialog(); + } + }); + fTerminalButton.setEnabled(PTY.isSupported()); + } + + /* + * (non-Javadoc) + * * @see org.eclipse.debug.ui.ILaunchConfigurationTab#initializeFrom(org.eclipse.debug.core.ILaunchConfiguration) */ public void initializeFrom(ILaunchConfiguration config) { filterPlatform = getPlatform(config); updateProjectFromConfig(config); updateProgramFromConfig(config); - + } + + protected void updateTerminalFromConfig(ILaunchConfiguration config) { + if (fTerminalButton != null) { + boolean useTerminal = true; + try { + useTerminal = config.getAttribute(ICDTLaunchConfigurationConstants.ATTR_USE_TERMINAL, true); + } catch (CoreException e) { + LaunchUIPlugin.log(e); + } + fTerminalButton.setSelection(useTerminal); + } } protected void updateProjectFromConfig(ILaunchConfiguration config) { @@ -215,12 +273,17 @@ public class CMainTab extends CLaunchConfigurationTab { fProgText.setText(programName); } - /* (non-Javadoc) + /* + * (non-Javadoc) + * * @see org.eclipse.debug.ui.ILaunchConfigurationTab#performApply(org.eclipse.debug.core.ILaunchConfigurationWorkingCopy) */ public void performApply(ILaunchConfigurationWorkingCopy config) { config.setAttribute(ICDTLaunchConfigurationConstants.ATTR_PROJECT_NAME, fProjText.getText()); config.setAttribute(ICDTLaunchConfigurationConstants.ATTR_PROGRAM_NAME, fProgText.getText()); + if (fTerminalButton != null) { + config.setAttribute(ICDTLaunchConfigurationConstants.ATTR_USE_TERMINAL, fTerminalButton.getSelection()); + } } /** @@ -240,7 +303,7 @@ public class CMainTab extends CLaunchConfigurationTab { public String getText(Object element) { if (element instanceof IBinary) { - IBinary bin = (IBinary)element; + IBinary bin = (IBinary) element; StringBuffer name = new StringBuffer(); name.append(bin.getPath().lastSegment()); return name.toString(); @@ -249,13 +312,13 @@ public class CMainTab extends CLaunchConfigurationTab { } public Image getImage(Object element) { - if (! (element instanceof ICElement)) { + if (!(element instanceof ICElement)) { return super.getImage(element); } - ICElement celement = (ICElement)element; + ICElement celement = (ICElement) element; if (celement.getElementType() == ICElement.C_BINARY) { - IBinary belement = (IBinary)celement; + IBinary belement = (IBinary) celement; if (belement.isExecutable()) { Image image = super.getImage(element); Point size = new Point(image.getBounds().width, image.getBounds().height); @@ -272,7 +335,7 @@ public class CMainTab extends CLaunchConfigurationTab { public String getText(Object element) { if (element instanceof IBinary) { - IBinary bin = (IBinary)element; + IBinary bin = (IBinary) element; StringBuffer name = new StringBuffer(); name.append(bin.getCPU() + (bin.isLittleEndian() ? "le" : "be")); //$NON-NLS-1$ //$NON-NLS-2$ name.append(" - "); //$NON-NLS-1$ @@ -292,16 +355,16 @@ public class CMainTab extends CLaunchConfigurationTab { dialog.setMultipleSelection(false); //dialog.set if (dialog.open() == Window.OK) { - IBinary binary = (IBinary)dialog.getFirstResult(); + IBinary binary = (IBinary) dialog.getFirstResult(); fProgText.setText(binary.getResource().getProjectRelativePath().toString()); } } /** - * 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. + * 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 handleBinaryBrowseButtonSelected() { final ICProject cproject = getCProject(); @@ -324,23 +387,23 @@ public class CMainTab extends CLaunchConfigurationTab { dialog.setValidator(new ISelectionStatusValidator() { public IStatus validate(Object[] selection) { - if (selection.length == 0 || ! (selection[0] instanceof IFile)) { - return new Status(IStatus.ERROR, LaunchUIPlugin.getUniqueIdentifier(), 1, - LaunchMessages.getString("CMainTab.Selection_must_be_file"), null); //$NON-NLS-1$ + if (selection.length == 0 || !(selection[0] instanceof IFile)) { + return new Status(IStatus.ERROR, LaunchUIPlugin.getUniqueIdentifier(), 1, LaunchMessages + .getString("CMainTab.Selection_must_be_file"), null); //$NON-NLS-1$ } try { - ICElement celement = cproject.findElement( ((IFile)selection[0]).getProjectRelativePath()); + ICElement celement = cproject.findElement(((IFile) selection[0]).getProjectRelativePath()); if (celement == null || (celement.getElementType() != ICElement.C_BINARY && celement.getElementType() != ICElement.C_ARCHIVE)) { - return new Status(IStatus.ERROR, LaunchUIPlugin.getUniqueIdentifier(), 1, - LaunchMessages.getString("CMainTab.Selection_must_be_binary_file"), null); //$NON-NLS-1$ + return new Status(IStatus.ERROR, LaunchUIPlugin.getUniqueIdentifier(), 1, LaunchMessages + .getString("CMainTab.Selection_must_be_binary_file"), null); //$NON-NLS-1$ } - return new Status(IStatus.OK, LaunchUIPlugin.getUniqueIdentifier(), IStatus.OK, - celement.getResource().getName(), null); + return new Status(IStatus.OK, LaunchUIPlugin.getUniqueIdentifier(), IStatus.OK, celement.getResource() + .getName(), null); } catch (Exception ex) { - return new Status(IStatus.ERROR, LaunchUIPlugin.PLUGIN_ID, 1, - LaunchMessages.getString("CMainTab.Selection_must_be_binary_file"), null); //$NON-NLS-1$ + return new Status(IStatus.ERROR, LaunchUIPlugin.PLUGIN_ID, 1, LaunchMessages + .getString("CMainTab.Selection_must_be_binary_file"), null); //$NON-NLS-1$ } } }); @@ -352,7 +415,7 @@ public class CMainTab extends CLaunchConfigurationTab { Object[] results = dialog.getResult(); try { - fProgText.setText( ((IResource)results[0]).getProjectRelativePath().toString()); + fProgText.setText(((IResource) results[0]).getProjectRelativePath().toString()); } catch (Exception ex) { /* Make sure it is a file */ } @@ -384,13 +447,13 @@ public class CMainTab extends CLaunchConfigurationTab { } }); - return (IBinary[])ret[0]; + return (IBinary[]) ret[0]; } /** - * 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. + * 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() { ICProject project = chooseCProject(); @@ -403,8 +466,8 @@ public class CMainTab extends CLaunchConfigurationTab { } /** - * Realize a C Project selection dialog and return the first selected - * project, or null if there was none. + * Realize a C Project selection dialog and return the first selected project, or null if there + * was none. */ protected ICProject chooseCProject() { try { @@ -418,10 +481,10 @@ public class CMainTab extends CLaunchConfigurationTab { ICProject cProject = getCProject(); if (cProject != null) { - dialog.setInitialSelections(new Object[]{cProject}); + dialog.setInitialSelections(new Object[] { cProject}); } if (dialog.open() == Window.OK) { - return (ICProject)dialog.getFirstResult(); + return (ICProject) dialog.getFirstResult(); } } catch (CModelException e) { LaunchUIPlugin.errorDialog("Launch UI internal error", e); //$NON-NLS-1$ @@ -432,7 +495,6 @@ public class CMainTab extends CLaunchConfigurationTab { /** * Return an array a ICProject whose platform match that of the runtime env. */ - protected ICProject[] getCProjects() throws CModelException { ICProject cproject[] = CoreModel.getDefault().getCModel().getCProjects(); ArrayList list = new ArrayList(cproject.length); @@ -440,7 +502,7 @@ public class CMainTab extends CLaunchConfigurationTab { for (int i = 0; i < cproject.length; i++) { ICDescriptor cdesciptor = null; try { - cdesciptor = CCorePlugin.getDefault().getCProjectDescription((IProject)cproject[i].getResource(), false); + cdesciptor = CCorePlugin.getDefault().getCProjectDescription((IProject) cproject[i].getResource(), false); if (cdesciptor != null) { String projectPlatform = cdesciptor.getPlatform(); if (filterPlatform.equals("*") //$NON-NLS-1$ @@ -455,11 +517,12 @@ public class CMainTab extends CLaunchConfigurationTab { list.add(cproject[i]); } } - return (ICProject[])list.toArray(new ICProject[list.size()]); + return (ICProject[]) list.toArray(new ICProject[list.size()]); } + /** - * Return the ICProject corresponding to the project name in the project - * name text field, or null if the text does not match a project name. + * Return the ICProject corresponding to the project name in the project name text field, or + * null if the text does not match a project name. */ protected ICProject getCProject() { String projectName = fProjText.getText().trim(); @@ -469,7 +532,9 @@ public class CMainTab extends CLaunchConfigurationTab { return CoreModel.getDefault().getCModel().getCProject(projectName); } - /* (non-Javadoc) + /* + * (non-Javadoc) + * * @see org.eclipse.debug.ui.ILaunchConfigurationTab#isValid(org.eclipse.debug.core.ILaunchConfiguration) */ public boolean isValid(ILaunchConfiguration config) { @@ -508,7 +573,9 @@ public class CMainTab extends CLaunchConfigurationTab { return true; } - /* (non-Javadoc) + /* + * (non-Javadoc) + * * @see org.eclipse.debug.ui.ILaunchConfigurationTab#setDefaults(org.eclipse.debug.core.ILaunchConfigurationWorkingCopy) */ public void setDefaults(ILaunchConfigurationWorkingCopy config) { @@ -528,16 +595,18 @@ public class CMainTab extends CLaunchConfigurationTab { initializeCProject(cElement, config); initializeProgramName(cElement, config); } + if (wantsTerminalOption()) { + config.setAttribute(ICDTLaunchConfigurationConstants.ATTR_USE_TERMINAL, true); + } } /** - * Set the program name attributes on the working copy based on the - * ICElement + * Set the program name attributes on the working copy based on the ICElement */ protected void initializeProgramName(ICElement cElement, ILaunchConfigurationWorkingCopy config) { IBinary binary = null; if (cElement instanceof ICProject) { - IBinary[] bins = getBinaryFiles((ICProject)cElement); + IBinary[] bins = getBinaryFiles((ICProject) cElement); if (bins != null && bins.length == 1) { binary = bins[0]; } @@ -560,25 +629,30 @@ public class CMainTab extends CLaunchConfigurationTab { } } - /* (non-Javadoc) + /* + * (non-Javadoc) + * * @see org.eclipse.debug.ui.ILaunchConfigurationTab#getName() */ public String getName() { return LaunchMessages.getString("CMainTab.Main"); //$NON-NLS-1$ } - /* (non-Javadoc) + /* + * (non-Javadoc) + * * @see org.eclipse.debug.ui.ILaunchConfigurationTab#getImage() */ public Image getImage() { return LaunchImages.get(LaunchImages.IMG_VIEW_MAIN_TAB); } - /* (non-Javadoc) + /* + * (non-Javadoc) + * * @see org.eclipse.debug.ui.AbstractLaunchConfigurationTab#updateLaunchConfigurationDialog() */ protected void updateLaunchConfigurationDialog() { super.updateLaunchConfigurationDialog(); } - } \ No newline at end of file