    001/*****************************************************************************
    002 * Copyright by The HDF Group.                                               *
    003 * Copyright by the Board of Trustees of the University of Illinois.         *
    004 * All rights reserved.                                                      *
    005 *                                                                           *
    006 * This file is part of the HDF Java Products distribution.                  *
    007 * The full copyright notice, including terms governing use, modification,   *
    008 * and redistribution, is contained in the files COPYING and Copyright.html. *
    009 * COPYING can be found at the root of the source code distribution tree.    *
    010 * Or, see https://support.hdfgroup.org/products/licenses.html               *
    011 * If you do not have access to either file, you may request a copy from     *
    012 * help@hdfgroup.org.                                                        *
    013 ****************************************************************************/
    014
    015package hdf.view.dialog;
    016
    017import org.eclipse.swt.SWT;
    018import org.eclipse.swt.events.DisposeEvent;
    019import org.eclipse.swt.events.DisposeListener;
    020import org.eclipse.swt.events.SelectionAdapter;
    021import org.eclipse.swt.events.SelectionEvent;
    022import org.eclipse.swt.graphics.Font;
    023import org.eclipse.swt.graphics.Point;
    024import org.eclipse.swt.graphics.Rectangle;
    025import org.eclipse.swt.layout.GridData;
    026import org.eclipse.swt.layout.GridLayout;
    027import org.eclipse.swt.widgets.Button;
    028import org.eclipse.swt.widgets.Composite;
    029import org.eclipse.swt.widgets.Dialog;
    030import org.eclipse.swt.widgets.Display;
    031import org.eclipse.swt.widgets.Event;
    032import org.eclipse.swt.widgets.Label;
    033import org.eclipse.swt.widgets.Listener;
    034import org.eclipse.swt.widgets.Shell;
    035import org.eclipse.swt.widgets.Text;
    036
    037import hdf.HDFVersions;
    038import hdf.view.ViewProperties;
    039
    040/**
    041 * Custom SWT dialog to allow the user to input strings
    042 * for various uses.
    043 */
    044//TODO: Add ability to have custom HDF icons
    045public class InputDialog extends Dialog {
    046    private Text            inputField;
    047    private final String    title;
    048    private final String    message;
    049    private final String    initialText;
    050    private String          result;
    051    private Font            curFont;
    052
    053    public InputDialog(Shell parent) {
    054        this(parent, "HDFView " + HDFVersions.getPropertyVersionView(), "");
    055    }
    056
    057    public InputDialog(Shell parent, String title, String message) {
    058        this(parent, title, message, "");
    059    }
    060
    061    public InputDialog(Shell parent, String title, String message, int style) {
    062        this(parent, title, message, "", style);
    063    }
    064
    065    public InputDialog(Shell parent, String title, String message, String initialText) {
    066        this(parent, title, message, initialText, SWT.NONE);
    067    }
    068
    069    public InputDialog(Shell parent, String title, String message, String initialText, int style) {
    070        super(parent, style);
    071        this.title = title;
    072        this.message = message;
    073        this.initialText = initialText;
    074
    075        try {
    076            curFont = new Font(
    077                    Display.getCurrent(),
    078                    ViewProperties.getFontType(),
    079                    ViewProperties.getFontSize(),
    080                    SWT.NORMAL);
    081        }
    082        catch (Exception ex) {
    083            curFont = null;
    084        }
    085    }
    086
    087    /**
    088     * Opens the InputDialog and returns the user's input
    089     * when the dialog closes.
    090     *
    091     * @return the user input data
    092     */
    093    public String open() {
    094        Shell parent = getParent();
    095        final Shell shell = new Shell(parent, SWT.TITLE | SWT.BORDER | SWT.APPLICATION_MODAL | SWT.RESIZE);
    096        shell.setFont(curFont);
    097        shell.setText(title);
    098        shell.setLayout(new GridLayout(1, true));
    099
    100        Label label = new Label(shell, SWT.NULL);
    101        label.setFont(curFont);
    102        label.setText(message);
    103
    104        inputField = new Text(shell, SWT.SINGLE | SWT.BORDER);
    105        inputField.setFont(curFont);
    106        inputField.setText(initialText);
    107        GridData fieldData = new GridData(SWT.FILL, SWT.FILL, true, false);
    108        fieldData.minimumWidth = 300;
    109        inputField.setLayoutData(fieldData);
    110
    111        // Dummy label to fill space as dialog is resized
    112        new Label(shell, SWT.NONE).setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
    113
    114        Composite buttonComposite = new Composite(shell, SWT.NONE);
    115        buttonComposite.setLayout(new GridLayout(2, true));
    116        buttonComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false, 2, 1));
    117
    118        Button okButton = new Button(buttonComposite, SWT.PUSH);
    119        okButton.setFont(curFont);
    120        okButton.setText("   &OK   ");
    121        okButton.setLayoutData(new GridData(SWT.END, SWT.FILL, true, false));
    122        okButton.addSelectionListener(new SelectionAdapter() {
    123            public void widgetSelected(SelectionEvent e) {
    124                shell.dispose();
    125            }
    126        });
    127
    128        Button cancelButton = new Button(buttonComposite, SWT.PUSH);
    129        cancelButton.setFont(curFont);
    130        cancelButton.setText(" &Cancel ");
    131        cancelButton.setLayoutData(new GridData(SWT.BEGINNING, SWT.FILL, true, false));
    132        cancelButton.addSelectionListener(new SelectionAdapter() {
    133            public void widgetSelected(SelectionEvent e) {
    134                result = null;
    135                shell.dispose();
    136            }
    137        });
    138
    139        inputField.addListener(SWT.Modify, new Listener() {
    140            public void handleEvent(Event event) {
    141                try {
    142                    result = inputField.getText();
    143                }
    144                catch (Exception ex) {
    145                    System.err.println("Error retrieving input value.");
    146                }
    147            }
    148        });
    149
    150        shell.addListener(SWT.Traverse, new Listener() {
    151            public void handleEvent(Event event) {
    152                if(event.detail == SWT.TRAVERSE_ESCAPE)
    153                    event.doit = false;
    154            }
    155        });
    156
    157        shell.pack();
    158
    159        shell.addDisposeListener(new DisposeListener() {
    160            public void widgetDisposed(DisposeEvent e) {
    161                if (curFont != null) curFont.dispose();
    162            }
    163        });
    164
    165        shell.setMinimumSize(shell.computeSize(SWT.DEFAULT, SWT.DEFAULT));
    166
    167        Rectangle parentBounds = parent.getBounds();
    168        Point shellSize = shell.getSize();
    169        shell.setLocation((parentBounds.x + (parentBounds.width / 2)) - (shellSize.x / 2),
    170                          (parentBounds.y + (parentBounds.height / 2)) - (shellSize.y / 2));
    171
    172        shell.open();
    173
    174        Display display = parent.getDisplay();
    175        while(!shell.isDisposed()) {
    176            if (!display.readAndDispatch())
    177                display.sleep();
    178        }
    179
    180        // TODO: Display loop should not wait here, but we must wait until
    181        // an input is given before returning
    182        return result;
    183    }
    184}