Java tutorial
/******************************************************************************* * 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); } }