/******************************************************************************* * Copyright (c) 2013 Mentor Graphics 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: * Mentor Graphics - Initial API and implementation *******************************************************************************/ 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; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.FileDialog; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.Text; public class NewExecutableDialog extends TitleAreaDialog { private NewExecutableInfo fInfo = null; private Text fHostBinaryText; private Text fTargetBinaryText; private Text fArgumentsText; private Button fStopInMain; private Text fStopInMainSymbol; public NewExecutableDialog( Shell parentShell, NewExecutableInfo info ) { super( parentShell ); assert info != null; setShellStyle( getShellStyle() | SWT.RESIZE ); 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 = fInfo.getSessionType() == SessionType.REMOTE; getShell().setText( Messages.GdbDebugNewExecutableCommand_Debug_New_Executable ); setTitle( Messages.GdbDebugNewExecutableCommand_Select_Binary ); String message = ( remote ) ? Messages.GdbDebugNewExecutableCommand_Select_binaries_on_host_and_target : Messages.GdbDebugNewExecutableCommand_Select_binary_and_specify_arguments; setMessage( message ); Composite control = (Composite)super.createDialogArea( parent ); Composite comp = new Composite( control, SWT.NONE ); GridData gd = new GridData( SWT.FILL, SWT.FILL, true, true ); GridLayout layout = new GridLayout( 3, false ); comp.setLayout( layout ); comp.setLayoutData( gd ); new Label( comp, SWT.None ).setText( remote ? Messages.GdbDebugNewExecutableCommand_Binary_on_host : Messages.GdbDebugNewExecutableCommand_Binary ); fHostBinaryText = new Text( comp, SWT.BORDER ); fHostBinaryText.setLayoutData( new GridData( SWT.FILL, SWT.CENTER, true, false ) ); fHostBinaryText.addModifyListener( new ModifyListener() { @Override public void modifyText( ModifyEvent e ) { validate(); } } ); Button browseButton = new Button( comp, SWT.PUSH ); browseButton.setText( Messages.GdbDebugNewExecutableCommand_Browse ); browseButton.setFont( JFaceResources.getDialogFont() ); setButtonLayoutData( browseButton ); browseButton.addSelectionListener( new SelectionAdapter() { @Override public void widgetSelected( SelectionEvent e ) { FileDialog dialog = new FileDialog( getShell() ); dialog.setFileName( fHostBinaryText.getText() ); String result = dialog.open(); if ( result != null ) { fHostBinaryText.setText( result ); } } } ); if ( remote ) { new Label( comp, SWT.None ).setText( Messages.GdbDebugNewExecutableCommand_Binary_on_target ); fTargetBinaryText = new Text( comp, SWT.BORDER ); fTargetBinaryText.setLayoutData( new GridData( SWT.FILL, SWT.CENTER, true, false, 2, 1 ) ); fTargetBinaryText.addModifyListener( new ModifyListener() { @Override public void modifyText( ModifyEvent e ) { validate(); } } ); } new Label( comp, SWT.None ).setText( Messages.GdbDebugNewExecutableCommand_Arguments ); 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() { 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.setAttribute(ICDTLaunchConfigurationConstants.ATTR_PROGRAM_ARGUMENTS, args); saveOptions(); super.okPressed(); } 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)); } } protected void validate() { boolean remote = fInfo.getSessionType() == SessionType.REMOTE; StringBuilder sb = new StringBuilder(); String hostBinary = fHostBinaryText.getText().trim(); if ( hostBinary.isEmpty() ) { sb.append( ( remote ) ? Messages.GdbDebugNewExecutableCommand_Host_binary_must_be_specified : Messages.GdbDebugNewExecutableCommand_Binary_must_be_specified ); } else { File file = new File( hostBinary ); if ( !file.exists() ) { sb.append( ( remote ) ? Messages.GdbDebugNewExecutableCommand_Host_binary_file_does_not_exist : Messages.GdbDebugNewExecutableCommand_Binary_file_does_not_exist ); } else if ( file.isDirectory() ) { sb.append( ( remote ) ? Messages.GdbDebugNewExecutableCommand_Invalid_host_binary : Messages.GdbDebugNewExecutableCommand_Invalid_binary ); } } if ( fTargetBinaryText != null ) { if ( fTargetBinaryText.getText().trim().length() == 0 ) { if ( sb.length() != 0 ) { sb.append( "\n " ); //$NON-NLS-1$ } 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()); } } }