/*******************************************************************************
* Copyright (c) 2013, 2014 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
* Red Hat Inc. - modified for use in Standalone Debugger
* Marc Khouzam (Ericsson) - Modified for remote launch (bug 450080)
*******************************************************************************/
package org.eclipse.cdt.debug.application;
import java.io.File;
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.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
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 RemoteExecutableDialog extends TitleAreaDialog {
private RemoteExecutableInfo fInfo = null;
private Text fHostBinaryText;
private Label fBinaryLabel;
private Text fBuildLogText;
private Text fAddressText;
private Text fPortText;
private Button fAttachButton;
private final String fHostBinary;
private final String fBuildLog;
private final String fAddress;
private final String fPort;
private final boolean fAttach;
public RemoteExecutableDialog (Shell parentShell) {
this(parentShell, null, null, null, null, false);
}
public RemoteExecutableDialog( Shell parentShell, String hostBinary, String buildLog, String address, String port, boolean attach) {
super( parentShell );
setShellStyle( getShellStyle() | SWT.RESIZE );
fHostBinary = hostBinary;
fBuildLog = buildLog;
fAddress = address;
fPort = port;
fAttach = attach;
}
@Override
protected Control createContents( Composite parent ) {
Control control = super.createContents( parent );
validate();
return control;
}
@Override
protected Control createDialogArea( Composite parent ) {
getShell().setText( Messages.GdbDebugRemoteExecutableCommand_Debug_Remote_Executable );
setTitle( Messages.GdbDebugRemoteExecutableCommand_Select_Remote_Options );
String message = Messages.GdbDebugRemoteExecutableCommand_Select_Remote_Options;
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 );
fBinaryLabel = new Label( comp, SWT.None );
fBinaryLabel.setText(fAttach ? Messages.GdbDebugExecutableCommand_Binary_Optional :
Messages.GdbDebugExecutableCommand_Binary );
fHostBinaryText = new Text( comp, SWT.BORDER );
if (fHostBinary != null)
fHostBinaryText.setText(fHostBinary);
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.GdbDebugExecutableCommand_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 );
}
}
} );
new Label( comp, SWT.None ).setText( Messages.GdbDebugExecutableCommand_BuildLog );
fBuildLogText = new Text( comp, SWT.BORDER );
if (fBuildLog != null)
fBuildLogText.setText(fBuildLog);
fBuildLogText.setLayoutData( new GridData( SWT.FILL, SWT.CENTER, true, false, 2, 1 ) );
fBuildLogText.addModifyListener( new ModifyListener() {
@Override
public void modifyText( ModifyEvent e ) {
validate();
}
} );
new Label( comp, SWT.None ).setText( Messages.GdbDebugRemoteExecutableCommand_Host_name_or_ip_address );
fAddressText = new Text( comp, SWT.BORDER );
if (fAddress != null)
fAddressText.setText(fAddress);
fAddressText.setLayoutData( new GridData( SWT.FILL, SWT.CENTER, true, false, 2, 1 ) );
fAddressText.addModifyListener( new ModifyListener() {
@Override
public void modifyText( ModifyEvent e ) {
validate();
}
} );
new Label( comp, SWT.None ).setText( Messages.GdbDebugRemoteExecutableCommand_Port_number );
fPortText = new Text( comp, SWT.BORDER );
if (fPort != null)
fPortText.setText(fPort);
fPortText.setLayoutData( new GridData( SWT.FILL, SWT.CENTER, true, false, 2, 1 ) );
fPortText.addModifyListener( new ModifyListener() {
@Override
public void modifyText( ModifyEvent e ) {
validate();
}
} );
fAttachButton = new Button( comp, SWT.CHECK);
fAttachButton.setText( Messages.GdbDebugRemoteExecutableCommand_Attach);
fAttachButton.setSelection(fAttach);
fAttachButton.addSelectionListener(new SelectionListener() {
@Override
public void widgetSelected(SelectionEvent e) {
fBinaryLabel.setText(fAttachButton.getSelection() ?
Messages.GdbDebugExecutableCommand_Binary_Optional :
Messages.GdbDebugExecutableCommand_Binary );
validate();
}
@Override
public void widgetDefaultSelected(SelectionEvent e) {
fBinaryLabel.setText(fAttachButton.getSelection() ?
Messages.GdbDebugExecutableCommand_Binary_Optional :
Messages.GdbDebugExecutableCommand_Binary );
validate();
}
});
return control;
}
@Override
protected void okPressed() {
fInfo = new RemoteExecutableInfo( fHostBinaryText.getText().trim(),
fBuildLogText.getText().trim(),
fAddressText.getText().trim(),
fPortText.getText().trim(),
fAttachButton.getSelection() );
super.okPressed();
}
public RemoteExecutableInfo getExecutableInfo() {
return fInfo;
}
private void validate() {
String error = null;
String hostBinary = fHostBinaryText.getText().trim();
if (hostBinary.isEmpty()) {
boolean attach = fAttachButton.getSelection();
if (!attach) error = Messages.GdbDebugNewExecutableCommand_Binary_must_be_specified;
}
else {
File file = new File(hostBinary);
if (!file.exists() ) {
error = Messages.GdbDebugNewExecutableCommand_Binary_file_does_not_exist;
}
else if (file.isDirectory()) {
error = Messages.GdbDebugNewExecutableCommand_Invalid_binary;
}
}
String buildLog = fBuildLogText.getText();
if (error == null && !buildLog.isEmpty()) {
File file = new File(buildLog);
if (!file.exists()) {
error = Messages.GdbDebugNewExecutableCommand_BuildLog_file_does_not_exist;
}
else if (file.isDirectory()) {
error = Messages.GdbDebugNewExecutableCommand_Invalid_buildLog;
}
}
String address = fAddressText.getText().trim();
if (error == null && address.isEmpty()) {
error = Messages.GdbDebugRemoteExecutableCommand_address_must_be_specified;
}
String port = fPortText.getText().trim();
if (error == null) {
if (port.isEmpty()) {
error = Messages.GdbDebugRemoteExecutableCommand_port_must_be_specified;
} else {
try {
Integer.parseInt(port);
} catch (NumberFormatException e) {
error = Messages.GdbDebugRemoteExecutableCommand_port_must_be_a_number;
}
}
}
setErrorMessage((error != null ) ? error : null);
getButton(IDialogConstants.OK_ID).setEnabled(getErrorMessage() == null);
}
}