org.eclipse.cdt.dsf.gdb.internal.ui.launching.NewExecutableDialog.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.cdt.dsf.gdb.internal.ui.launching.NewExecutableDialog.java

Source

/*******************************************************************************
 * 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.dsf.gdb.internal.ui.commands.Messages;
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.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 {

    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) {
        super(parentShell);
        setShellStyle(getShellStyle() | SWT.RESIZE);
        fFlags = flags;
    }

    @Override
    protected Control createContents(Composite parent) {
        Control control = super.createContents(parent);
        validate();
        return control;
    }

    @Override
    protected Control createDialogArea(Composite parent) {
        boolean remote = (fFlags & REMOTE) > 0;

        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));

        return control;
    }

    @Override
    protected void okPressed() {
        String targetPath = (fTargetBinaryText != null) ? fTargetBinaryText.getText().trim() : null;
        String args = fArgumentsText.getText().trim();
        fInfo = new NewExecutableInfo(fHostBinaryText.getText().trim(), targetPath, args);
        super.okPressed();
    }

    public NewExecutableInfo getExecutableInfo() {
        return fInfo;
    }

    private void validate() {
        boolean remote = (fFlags & REMOTE) > 0;
        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);
            }
        }
        setErrorMessage((sb.length() != 0) ? sb.toString() : null);
        getButton(IDialogConstants.OK_ID).setEnabled(getErrorMessage() == null);
    }
}