diff --git a/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/commands/GdbDebugNewExecutableCommand.java b/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/commands/GdbDebugNewExecutableCommand.java index 76fcbd54cd6..0951513f6a9 100644 --- a/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/commands/GdbDebugNewExecutableCommand.java +++ b/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/commands/GdbDebugNewExecutableCommand.java @@ -16,7 +16,6 @@ import java.util.concurrent.CancellationException; import java.util.concurrent.ExecutionException; import java.util.concurrent.RejectedExecutionException; -import org.eclipse.cdt.debug.core.ICDTLaunchConfigurationConstants; import org.eclipse.cdt.debug.core.model.IDebugNewExecutableHandler; import org.eclipse.cdt.dsf.concurrent.DataRequestMonitor; import org.eclipse.cdt.dsf.concurrent.DsfExecutor; @@ -27,7 +26,6 @@ import org.eclipse.cdt.dsf.concurrent.RequestMonitor; import org.eclipse.cdt.dsf.datamodel.IDMContext; import org.eclipse.cdt.dsf.debug.service.IProcesses; import org.eclipse.cdt.dsf.debug.service.command.ICommandControlService; -import org.eclipse.cdt.dsf.gdb.IGDBLaunchConfigurationConstants; import org.eclipse.cdt.dsf.gdb.internal.ui.GdbUIPlugin; import org.eclipse.cdt.dsf.gdb.internal.ui.launching.NewExecutableDialog; import org.eclipse.cdt.dsf.gdb.internal.ui.launching.NewExecutableInfo; @@ -53,20 +51,19 @@ public class GdbDebugNewExecutableCommand extends RefreshableDebugCommand implem private class PromptJob extends UIJob { private DataRequestMonitor fRequestMonitor; - private boolean fRemote = false; + final private SessionType fSessionType; - private PromptJob( boolean remote, DataRequestMonitor rm ) { + private PromptJob( SessionType sessionType, DataRequestMonitor rm ) { super( Messages.GdbDebugNewExecutableCommand_New_Executable_Prompt_Job ); - fRemote = remote; + fSessionType = sessionType; fRequestMonitor = rm; } @Override public IStatus runInUIThread( IProgressMonitor monitor ) { - int flags = ( fRemote ) ? NewExecutableDialog.REMOTE : 0; - NewExecutableDialog dialog = new NewExecutableDialog( GdbUIPlugin.getShell(), flags ); + final NewExecutableInfo info = new NewExecutableInfo(fSessionType); + NewExecutableDialog dialog = new NewExecutableDialog(GdbUIPlugin.getShell(), info); final boolean canceled = dialog.open() == Window.CANCEL; - final NewExecutableInfo info = dialog.getExecutableInfo(); fExecutor.execute( new DsfRunnable() { @Override @@ -134,7 +131,7 @@ public class GdbDebugNewExecutableCommand extends RefreshableDebugCommand implem } PromptJob job = new PromptJob( - backend.getSessionType() == SessionType.REMOTE, + backend.getSessionType(), new DataRequestMonitor( fExecutor, rm ){ @Override @@ -147,8 +144,7 @@ public class GdbDebugNewExecutableCommand extends RefreshableDebugCommand implem protected void handleSuccess() { try { Map attributes = getLaunchConfiguration().getAttributes(); - attributes.put( IGDBLaunchConfigurationConstants.ATTR_DEBUGGER_REMOTE_BINARY, getData().getTargetPath() ); - attributes.put( ICDTLaunchConfigurationConstants.ATTR_PROGRAM_ARGUMENTS, getData().getArguments() ); + attributes.putAll(getData().getAttributes()); procService.debugNewProcess( commandControl.getContext(), getData().getHostPath(), diff --git a/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/launching/CDebuggerTab.java b/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/launching/CDebuggerTab.java index 6a8b6d97201..6a1ad912aa0 100644 --- a/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/launching/CDebuggerTab.java +++ b/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/launching/CDebuggerTab.java @@ -190,6 +190,8 @@ public class CDebuggerTab extends CLaunchConfigurationTab { IPreferenceStore preferences = GdbUIPlugin.getDefault().getPreferenceStore(); config.setAttribute(ICDTLaunchConfigurationConstants.ATTR_DEBUGGER_STOP_AT_MAIN, preferences.getBoolean(IGdbDebugPreferenceConstants.PREF_DEFAULT_STOP_AT_MAIN)); + config.setAttribute(ICDTLaunchConfigurationConstants.ATTR_DEBUGGER_STOP_AT_MAIN_SYMBOL, + preferences.getString(IGdbDebugPreferenceConstants.PREF_DEFAULT_STOP_AT_MAIN_SYMBOL)); } } diff --git a/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/launching/NewExecutableDialog.java b/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/launching/NewExecutableDialog.java index 7c65e7be5eb..a0372455f8c 100644 --- a/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/launching/NewExecutableDialog.java +++ b/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/launching/NewExecutableDialog.java @@ -13,11 +13,17 @@ package org.eclipse.cdt.dsf.gdb.internal.ui.launching; import java.io.File; +import org.eclipse.cdt.debug.core.ICDTLaunchConfigurationConstants; +import org.eclipse.cdt.dsf.gdb.IGDBLaunchConfigurationConstants; import org.eclipse.cdt.dsf.gdb.internal.ui.commands.Messages; +import org.eclipse.cdt.dsf.gdb.launching.LaunchMessages; +import org.eclipse.cdt.dsf.gdb.service.SessionType; import org.eclipse.jface.dialogs.IDialogConstants; import org.eclipse.jface.dialogs.TitleAreaDialog; import org.eclipse.jface.resource.JFaceResources; import org.eclipse.swt.SWT; +import org.eclipse.swt.accessibility.AccessibleAdapter; +import org.eclipse.swt.accessibility.AccessibleEvent; import org.eclipse.swt.events.ModifyEvent; import org.eclipse.swt.events.ModifyListener; import org.eclipse.swt.events.SelectionAdapter; @@ -34,31 +40,33 @@ import org.eclipse.swt.widgets.Text; public class NewExecutableDialog extends TitleAreaDialog { - public static final int REMOTE = 0x1; - - private int fFlags = 0; private NewExecutableInfo fInfo = null; private Text fHostBinaryText; private Text fTargetBinaryText; private Text fArgumentsText; - public NewExecutableDialog( Shell parentShell, int flags ) { + private Button fStopInMain; + private Text fStopInMainSymbol; + + public NewExecutableDialog( Shell parentShell, NewExecutableInfo info ) { super( parentShell ); + assert info != null; setShellStyle( getShellStyle() | SWT.RESIZE ); - fFlags = flags; + fInfo = info; } @Override protected Control createContents( Composite parent ) { Control control = super.createContents( parent ); + initialize(); validate(); return control; } @Override protected Control createDialogArea( Composite parent ) { - boolean remote = (fFlags & REMOTE) > 0; + boolean remote = fInfo.getSessionType() == SessionType.REMOTE; getShell().setText( Messages.GdbDebugNewExecutableCommand_Debug_New_Executable ); setTitle( Messages.GdbDebugNewExecutableCommand_Select_Binary ); @@ -118,23 +126,74 @@ public class NewExecutableDialog extends TitleAreaDialog { fArgumentsText = new Text( comp, SWT.BORDER ); fArgumentsText.setLayoutData( new GridData( SWT.FILL, SWT.CENTER, true, false, 2, 1 ) ); + createOptionsArea(comp); + return control; } + protected void createOptionsArea(Composite parent) { + Composite optionsComp = new Composite(parent, SWT.NONE); + GridLayout layout = new GridLayout(3, false); + layout.marginWidth = layout.marginHeight = 0; + optionsComp.setLayout(layout); + optionsComp.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 3, 1)); + + fStopInMain = new Button(optionsComp, SWT.CHECK); + fStopInMain.setText(LaunchMessages.getString("CDebuggerTab.Stop_at_main_on_startup")); //$NON-NLS-1$ + fStopInMain.addSelectionListener(new SelectionAdapter() { + @Override + public void widgetSelected(SelectionEvent e) { + fStopInMainSymbol.setEnabled(fStopInMain.getSelection()); + validate(); + } + }); + fStopInMainSymbol = new Text(optionsComp, SWT.SINGLE | SWT.BORDER); + GridData gridData = new GridData(SWT.FILL, SWT.CENTER, false, false); + gridData.widthHint = 100; + fStopInMainSymbol.setLayoutData(gridData); + fStopInMainSymbol.addModifyListener(new ModifyListener() { + @Override + public void modifyText(ModifyEvent evt) { + validate(); + } + }); + fStopInMainSymbol.getAccessible().addAccessibleListener( + new AccessibleAdapter() { + @Override + public void getName(AccessibleEvent e) { + e.result = LaunchMessages.getString("CDebuggerTab.Stop_at_main_on_startup"); //$NON-NLS-1$ + } + } + ); + + } + @Override protected void okPressed() { - String targetPath = ( fTargetBinaryText != null ) ? fTargetBinaryText.getText().trim() : null; + fInfo.setHostPath(fHostBinaryText.getText().trim()); + String targetPath = fTargetBinaryText != null ? fTargetBinaryText.getText().trim() : null; + fInfo.setAttribute(IGDBLaunchConfigurationConstants.ATTR_DEBUGGER_REMOTE_BINARY, targetPath); String args = fArgumentsText.getText().trim(); - fInfo = new NewExecutableInfo( fHostBinaryText.getText().trim(), targetPath, args ); + fInfo.setAttribute(ICDTLaunchConfigurationConstants.ATTR_PROGRAM_ARGUMENTS, args); + saveOptions(); super.okPressed(); } - public NewExecutableInfo getExecutableInfo() { - return fInfo; + protected void initialize() { + fHostBinaryText.setText(fInfo.getHostPath()); + if (fTargetBinaryText != null) { + String targetPath = fInfo.getTargetPath(); + fTargetBinaryText.setText(targetPath != null ? targetPath : ""); //$NON-NLS-1$ + } + fArgumentsText.setText(fInfo.getArguments()); + if (fStopInMain != null && fStopInMainSymbol != null) { + fStopInMain.setSelection((Boolean)fInfo.getAttribute(ICDTLaunchConfigurationConstants.ATTR_DEBUGGER_STOP_AT_MAIN)); + fStopInMainSymbol.setText((String)fInfo.getAttribute(ICDTLaunchConfigurationConstants.ATTR_DEBUGGER_STOP_AT_MAIN_SYMBOL)); + } } - - private void validate() { - boolean remote = (fFlags & REMOTE) > 0; + + protected void validate() { + boolean remote = fInfo.getSessionType() == SessionType.REMOTE; StringBuilder sb = new StringBuilder(); String hostBinary = fHostBinaryText.getText().trim(); if ( hostBinary.isEmpty() ) { @@ -163,7 +222,25 @@ public class NewExecutableDialog extends TitleAreaDialog { sb.append( Messages.GdbDebugNewExecutableCommand_Binary_on_target_must_be_specified ); } } + if (fStopInMain != null && fStopInMainSymbol != null) { + // The "Stop on startup at" field must not be empty + String mainSymbol = fStopInMainSymbol.getText().trim(); + if (fStopInMain.getSelection() && mainSymbol.length() == 0) { + if (sb.length() > 0) { + sb.append("\n "); //$NON-NLS-1$ + } + sb.append(LaunchMessages.getString("CDebuggerTab.Stop_on_startup_at_can_not_be_empty")); //$NON-NLS-1$ + } + } + setErrorMessage( ( sb.length() != 0 ) ? sb.toString() : null ); getButton( IDialogConstants.OK_ID ).setEnabled( getErrorMessage() == null ); } + + protected void saveOptions() { + if (fStopInMain != null && fStopInMainSymbol != null) { + fInfo.setAttribute(ICDTLaunchConfigurationConstants.ATTR_DEBUGGER_STOP_AT_MAIN, Boolean.valueOf(fStopInMain.getSelection())); + fInfo.setAttribute(ICDTLaunchConfigurationConstants.ATTR_DEBUGGER_STOP_AT_MAIN_SYMBOL, fStopInMainSymbol.getText().trim()); + } + } } \ No newline at end of file diff --git a/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/launching/NewExecutableInfo.java b/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/launching/NewExecutableInfo.java index 1f88a279bde..38244a6ba00 100644 --- a/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/launching/NewExecutableInfo.java +++ b/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/launching/NewExecutableInfo.java @@ -11,20 +11,39 @@ package org.eclipse.cdt.dsf.gdb.internal.ui.launching; +import java.util.HashMap; +import java.util.Map; + +import org.eclipse.cdt.debug.core.ICDTLaunchConfigurationConstants; +import org.eclipse.cdt.dsf.gdb.IGDBLaunchConfigurationConstants; +import org.eclipse.cdt.dsf.gdb.IGdbDebugPreferenceConstants; +import org.eclipse.cdt.dsf.gdb.internal.ui.GdbUIPlugin; +import org.eclipse.cdt.dsf.gdb.service.SessionType; +import org.eclipse.jface.preference.IPreferenceStore; + /** * This class provides information required to start * debugging an executable. */ public class NewExecutableInfo { - private String fHostPath; - private String fTargetPath; - private String fArguments; + + public static final String ATTR_SESSION_TYPE = "sessionType"; //$NON-NLS-1$ - public NewExecutableInfo(String hostPath, String targetPath, String args) { + final private SessionType fSessionType; + private String fHostPath = ""; //$NON-NLS-1$ + + private Map fAttributes = new HashMap(); + + public NewExecutableInfo(SessionType sessionType) { super(); - fHostPath = hostPath; - fTargetPath = targetPath; - fArguments = args; + fSessionType = sessionType; + setAttribute(IGDBLaunchConfigurationConstants.ATTR_DEBUGGER_REMOTE_BINARY, ""); //$NON-NLS-1$ + setAttribute(ICDTLaunchConfigurationConstants.ATTR_PROGRAM_ARGUMENTS, ""); //$NON-NLS-1$ + IPreferenceStore preferences = GdbUIPlugin.getDefault().getPreferenceStore(); + setAttribute(ICDTLaunchConfigurationConstants.ATTR_DEBUGGER_STOP_AT_MAIN, + preferences.getBoolean(IGdbDebugPreferenceConstants.PREF_DEFAULT_STOP_AT_MAIN)); + setAttribute(ICDTLaunchConfigurationConstants.ATTR_DEBUGGER_STOP_AT_MAIN_SYMBOL, + preferences.getString(IGdbDebugPreferenceConstants.PREF_DEFAULT_STOP_AT_MAIN_SYMBOL)); } /** @@ -33,19 +52,48 @@ public class NewExecutableInfo { public String getHostPath() { return fHostPath; } - + + /** + * Sets the host path + */ + public void setHostPath(String hostPath) { + fHostPath = hostPath; + } + /** * For remote sessions returns the path of the executable * on the target. Otherwise returns null. */ public String getTargetPath() { - return fTargetPath; + return (String)fAttributes.get(IGDBLaunchConfigurationConstants.ATTR_DEBUGGER_REMOTE_BINARY); } /** * Returns the arguments to pass to the executable, or null */ public String getArguments() { - return fArguments; + return (String)fAttributes.get(ICDTLaunchConfigurationConstants.ATTR_PROGRAM_ARGUMENTS); + } + + /** + * Returns the attribute map + */ + public Map getAttributes() { + return fAttributes; + } + + /** + * Returns the session type + */ + public SessionType getSessionType() { + return fSessionType; + } + + public Object getAttribute(String name) { + return fAttributes.get(name); + } + + public void setAttribute(String name, Object value) { + fAttributes.put(name, value); } } \ No newline at end of file