    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 COPYING file, which can be found  *
    009 * at the root of the source code distribution tree,                         *
    010 * or in https://www.hdfgroup.org/licenses.                                  *
    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 java.util.Iterator;
    018import java.util.List;
    019import java.util.Vector;
    020
    021import org.eclipse.swt.SWT;
    022import org.eclipse.swt.events.DisposeEvent;
    023import org.eclipse.swt.events.DisposeListener;
    024import org.eclipse.swt.events.SelectionAdapter;
    025import org.eclipse.swt.events.SelectionEvent;
    026import org.eclipse.swt.events.TraverseEvent;
    027import org.eclipse.swt.events.TraverseListener;
    028import org.eclipse.swt.graphics.Point;
    029import org.eclipse.swt.graphics.Rectangle;
    030import org.eclipse.swt.layout.GridData;
    031import org.eclipse.swt.layout.GridLayout;
    032import org.eclipse.swt.widgets.Button;
    033import org.eclipse.swt.widgets.Combo;
    034import org.eclipse.swt.widgets.Composite;
    035import org.eclipse.swt.widgets.Display;
    036import org.eclipse.swt.widgets.Label;
    037import org.eclipse.swt.widgets.Shell;
    038import org.eclipse.swt.widgets.Text;
    039
    040import hdf.object.Datatype;
    041import hdf.object.Group;
    042import hdf.object.HObject;
    043import hdf.view.Tools;
    044import hdf.view.ViewProperties;
    045
    046/**
    047 * NewDatatypeDialog shows a message dialog requesting user input for creating a
    048 * new HDF5 datatype.
    049 *
    050 * @author Jordan T. Henderson
    051 * @version 2.4 1/1/2016
    052 */
    053public class NewDatatypeDialog extends NewDataObjectDialog {
    054
    055    private Combo             parentChoice;
    056
    057    /** TextField for entering the name of the object */
    058    protected Text            nameField;
    059
    060    /** a list of current groups */
    061    private List<Group>       groupList;
    062
    063    /**
    064     * Constructs a NewDatatypeDialog with specified list of possible parent
    065     * groups.
    066     *
    067     * @param parent
    068     *            the parent shell of the dialog
    069     * @param pGroup
    070     *            the parent group which the new group is added to.
    071     * @param objs
    072     *            the list of all objects.
    073     */
    074    public NewDatatypeDialog(Shell parent, Group pGroup, List<?> objs) {
    075        super(parent, pGroup, objs);
    076    }
    077
    078    /**
    079     * Open the NewDatatypeDialog for adding a new datatype.
    080     */
    081    public void open() {
    082        Shell parent = getParent();
    083        shell = new Shell(parent, SWT.SHELL_TRIM | SWT.APPLICATION_MODAL);
    084        shell.setFont(curFont);
    085        shell.setText("New Datatype...");
    086        shell.setImages(ViewProperties.getHdfIcons());
    087        shell.setLayout(new GridLayout(1, false));
    088
    089
    090        // Create Datatype name / Parent group region
    091        Composite fieldComposite = new Composite(shell, SWT.NONE);
    092        fieldComposite.setLayout(new GridLayout(2, false));
    093        fieldComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
    094
    095        Label label = new Label(fieldComposite, SWT.LEFT);
    096        label.setFont(curFont);
    097        label.setText("Datatype name: ");
    098
    099        nameField = new Text(fieldComposite, SWT.SINGLE | SWT.BORDER);
    100        nameField.setFont(curFont);
    101        nameField.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
    102        nameField.addTraverseListener(new TraverseListener() {
    103            @Override
    104            public void keyTraversed(TraverseEvent e) {
    105                if (e.detail == SWT.TRAVERSE_TAB_NEXT || e.detail == SWT.TRAVERSE_TAB_PREVIOUS) {
    106                    e.doit = true;
    107                }
    108            }
    109        });
    110
    111        label = new Label(fieldComposite, SWT.LEFT);
    112        label.setFont(curFont);
    113        label.setText("Parent Group: ");
    114
    115        parentChoice = new Combo(fieldComposite, SWT.DROP_DOWN | SWT.BORDER | SWT.READ_ONLY);
    116        parentChoice.setFont(curFont);
    117        parentChoice.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
    118        parentChoice.addSelectionListener(new SelectionAdapter() {
    119            @Override
    120            public void widgetSelected(SelectionEvent e) {
    121                parentObj = groupList.get(parentChoice.getSelectionIndex());
    122            }
    123        });
    124
    125        groupList = new Vector<>(objList.size());
    126        Object obj = null;
    127        Iterator<?> iterator = objList.iterator();
    128        while (iterator.hasNext()) {
    129            obj = iterator.next();
    130            if (obj instanceof Group) {
    131                Group g = (Group) obj;
    132                groupList.add(g);
    133                if (g.isRoot()) {
    134                    parentChoice.add(HObject.SEPARATOR);
    135                }
    136                else {
    137                    parentChoice.add(g.getPath() + g.getName() + HObject.SEPARATOR);
    138                }
    139            }
    140        }
    141
    142        if (((Group) parentObj).isRoot()) {
    143            parentChoice.select(parentChoice.indexOf(HObject.SEPARATOR));
    144        }
    145        else {
    146            parentChoice.select(parentChoice.indexOf(parentObj.getPath() + parentObj.getName() + HObject.SEPARATOR));
    147        }
    148
    149        // Create Datatype settings region
    150        createDatatypeWidget();
    151
    152        // Create Ok/Cancel button region
    153        Composite buttonComposite = new Composite(shell, SWT.NONE);
    154        buttonComposite.setLayout(new GridLayout(2, true));
    155        buttonComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
    156
    157        Button okButton = new Button(buttonComposite, SWT.PUSH);
    158        okButton.setFont(curFont);
    159        okButton.setText("   &OK   ");
    160        okButton.setLayoutData(new GridData(SWT.END, SWT.FILL, true, false));
    161        okButton.addSelectionListener(new SelectionAdapter() {
    162            @Override
    163            public void widgetSelected(SelectionEvent e) {
    164                newObject = createNewDatatype();
    165
    166                if (newObject != null) {
    167                    shell.dispose();
    168                }
    169            }
    170        });
    171
    172        Button cancelButton = new Button(buttonComposite, SWT.PUSH);
    173        cancelButton.setFont(curFont);
    174        cancelButton.setText(" &Cancel ");
    175        cancelButton.setLayoutData(new GridData(SWT.BEGINNING, SWT.FILL, true, false));
    176        cancelButton.addSelectionListener(new SelectionAdapter() {
    177            @Override
    178            public void widgetSelected(SelectionEvent e) {
    179                newObject = null;
    180                shell.dispose();
    181            }
    182        });
    183
    184        //Control[] controls = new Control[] { okButton, cancelButton };
    185        //shell.setTabList(controls);
    186        shell.pack();
    187
    188        shell.addDisposeListener(new DisposeListener() {
    189            @Override
    190            public void widgetDisposed(DisposeEvent e) {
    191                if (curFont != null) curFont.dispose();
    192            }
    193        });
    194
    195        shell.setMinimumSize(shell.computeSize(SWT.DEFAULT, SWT.DEFAULT));
    196
    197        Rectangle parentBounds = parent.getBounds();
    198        Point shellSize = shell.getSize();
    199        shell.setLocation((parentBounds.x + (parentBounds.width / 2)) - (shellSize.x / 2),
    200                          (parentBounds.y + (parentBounds.height / 2)) - (shellSize.y / 2));
    201
    202        shell.open();
    203
    204        Display display = shell.getDisplay();
    205        while (!shell.isDisposed())
    206            if (!display.readAndDispatch())
    207                display.sleep();
    208    }
    209
    210    /**
    211     * Create the datatype specified by the settings.
    212     *
    213     * @return the new object created.
    214     */
    215    public Datatype createNewDatatype() {
    216        String name = null;
    217        Group pgroup = null;
    218
    219        name = nameField.getText().trim();
    220        if ((name == null) || (name.length() < 1)) {
    221            shell.getDisplay().beep();
    222            Tools.showError(shell, "Create", "Datatype name is not specified.");
    223            return null;
    224        }
    225
    226        if (name.indexOf(HObject.SEPARATOR) >= 0) {
    227            shell.getDisplay().beep();
    228            Tools.showError(shell, "Create", "Datatype name cannot contain path.");
    229            return null;
    230        }
    231
    232        pgroup = groupList.get(parentChoice.getSelectionIndex());
    233
    234        if (pgroup == null) {
    235            shell.getDisplay().beep();
    236            Tools.showError(shell, "Create", "Parent group is null.");
    237            return null;
    238        }
    239
    240        Datatype datatype = null;
    241        try {
    242            String fullPath = HObject.SEPARATOR;
    243            if (pgroup.isRoot()) {
    244                fullPath += name;
    245            }
    246            else {
    247                fullPath = pgroup.getPath() + HObject.SEPARATOR + pgroup.getName() + HObject.SEPARATOR + name;
    248            }
    249            datatype = super.createNewDatatype(fullPath);
    250        }
    251        catch (Exception ex) {
    252            shell.getDisplay().beep();
    253            Tools.showError(shell, "Create", ex.getMessage());
    254            return null;
    255        }
    256
    257        return datatype;
    258    }
    259}