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 java.util.ArrayList;
018import java.util.Iterator;
019import java.util.List;
020import java.util.Vector;
021
022import org.eclipse.swt.SWT;
023import org.eclipse.swt.events.DisposeEvent;
024import org.eclipse.swt.events.DisposeListener;
025import org.eclipse.swt.events.SelectionAdapter;
026import org.eclipse.swt.events.SelectionEvent;
027import org.eclipse.swt.graphics.Point;
028import org.eclipse.swt.graphics.Rectangle;
029import org.eclipse.swt.layout.GridData;
030import org.eclipse.swt.layout.GridLayout;
031import org.eclipse.swt.widgets.Button;
032import org.eclipse.swt.widgets.Combo;
033import org.eclipse.swt.widgets.Composite;
034import org.eclipse.swt.widgets.Display;
035import org.eclipse.swt.widgets.Label;
036import org.eclipse.swt.widgets.Shell;
037import org.eclipse.swt.widgets.Text;
038
039import hdf.object.Dataset;
040import hdf.object.Datatype;
041import hdf.object.Group;
042import hdf.object.HObject;
043import hdf.object.ScalarDS;
044import hdf.view.Tools;
045import hdf.view.ViewProperties;
046
047/**
048 * NewImageDialog shows a message dialog requesting user input for creating a
049 * new HDF4/5 Image.
050 *
051 * @author Jordan T. Henderson
052 * @version 2.4 1/1/2016
053 */
054public class NewImageDialog extends NewDataObjectDialog {
055
056    private Text        nameField, widthField, heightField;
057
058    private Combo       parentChoice;
059
060    private Button      checkIndex, checkTrueColor, checkInterlacePixel,
061                        checkInterlacePlane;
062
063    /** A list of current groups */
064    private List<Group> groupList;
065
066    /**
067     * Constructs a NewImageDialog with specified list of possible parent groups.
068     *
069     * @param parent
070     *            the parent shell of the dialog
071     * @param pGroup
072     *            the parent group which the new group is added to.
073     * @param objs
074     *            the list of all objects.
075     */
076    public NewImageDialog(Shell parent, Group pGroup, List<?> objs) {
077        super(parent, pGroup, objs);
078    }
079
080    public void open() {
081        Shell parent = getParent();
082        shell = new Shell(parent, SWT.SHELL_TRIM | SWT.APPLICATION_MODAL);
083        shell.setFont(curFont);
084        shell.setText("New HDF Image...");
085        shell.setImage(ViewProperties.getHdfIcon());
086        shell.setLayout(new GridLayout(1, true));
087
088
089        // Create main content region
090        Composite content = new Composite(shell, SWT.BORDER);
091        content.setLayout(new GridLayout(2, false));
092        content.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
093
094        Label label = new Label(content, SWT.LEFT);
095        label.setFont(curFont);
096        label.setText("Image name: ");
097
098        nameField = new Text(content, SWT.SINGLE | SWT.BORDER);
099        nameField.setFont(curFont);
100        GridData fieldData = new GridData(SWT.FILL, SWT.FILL, true, false);
101        fieldData.minimumWidth = 300;
102        nameField.setLayoutData(fieldData);
103
104        label = new Label(content, SWT.LEFT);
105        label.setFont(curFont);
106        label.setText("Parent Group: ");
107
108        parentChoice = new Combo(content, SWT.DROP_DOWN | SWT.READ_ONLY);
109        parentChoice.setFont(curFont);
110        parentChoice.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
111        parentChoice.addSelectionListener(new SelectionAdapter() {
112            @Override
113            public void widgetSelected(SelectionEvent e) {
114                parentObj = groupList.get(parentChoice.getSelectionIndex());
115            }
116        });
117
118        groupList = new ArrayList<>();
119        Object obj = null;
120        Iterator<?> iterator = objList.iterator();
121        while (iterator.hasNext()) {
122            obj = iterator.next();
123            if (obj instanceof Group) {
124                Group g = (Group) obj;
125                groupList.add(g);
126                if (g.isRoot()) {
127                    parentChoice.add(HObject.SEPARATOR);
128                }
129                else {
130                    parentChoice.add(g.getPath() + g.getName()
131                            + HObject.SEPARATOR);
132                }
133            }
134        }
135
136        if (((Group) parentObj).isRoot()) {
137            parentChoice.select(parentChoice.indexOf(HObject.SEPARATOR));
138        }
139        else {
140            parentChoice.select(parentChoice.indexOf(parentObj.getPath() + parentObj.getName()
141                    + HObject.SEPARATOR));
142        }
143
144        label = new Label(content, SWT.LEFT);
145        label.setFont(curFont);
146        label.setText("Height: ");
147
148        heightField = new Text(content, SWT.SINGLE | SWT.BORDER);
149        heightField.setFont(curFont);
150        heightField.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
151
152        label = new Label(content, SWT.LEFT);
153        label.setFont(curFont);
154        label.setText("Width: ");
155
156        widthField = new Text(content, SWT.SINGLE | SWT.BORDER);
157        widthField.setFont(curFont);
158        widthField.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
159
160        label = new Label(content, SWT.LEFT);
161        label.setFont(curFont);
162        label.setText("Image type: ");
163
164        Composite typeComposite = new Composite(content, SWT.BORDER);
165        typeComposite.setLayout(new GridLayout(2, true));
166        typeComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
167
168        checkIndex = new Button(typeComposite, SWT.RADIO);
169        checkIndex.setFont(curFont);
170        checkIndex.setText("Indexed colormap");
171        checkIndex.setLayoutData(new GridData(SWT.CENTER, SWT.FILL, true, false));
172        checkIndex.addSelectionListener(new SelectionAdapter() {
173            @Override
174            public void widgetSelected(SelectionEvent e) {
175                checkInterlacePixel.setSelection(true);
176                checkInterlacePlane.setSelection(false);
177                checkInterlacePixel.setEnabled(false);
178                checkInterlacePlane.setEnabled(false);
179            }
180        });
181
182        checkTrueColor = new Button(typeComposite, SWT.RADIO);
183        checkTrueColor.setFont(curFont);
184        checkTrueColor.setText("24-bit truecolor");
185        checkTrueColor.setLayoutData(new GridData(SWT.CENTER, SWT.FILL, true, false));
186        checkTrueColor.addSelectionListener(new SelectionAdapter() {
187            @Override
188            public void widgetSelected(SelectionEvent e) {
189                checkInterlacePixel.setEnabled(true);
190                checkInterlacePlane.setEnabled(true);
191            }
192        });
193
194        label = new Label(content, SWT.LEFT);
195        label.setFont(curFont);
196        label.setText("Data layout: ");
197
198        Composite layoutComposite = new Composite(content, SWT.BORDER);
199        layoutComposite.setLayout(new GridLayout(2, true));
200        layoutComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
201
202        checkInterlacePixel = new Button(layoutComposite, SWT.RADIO);
203        checkInterlacePixel.setFont(curFont);
204        checkInterlacePixel.setText("Pixel interlace");
205        checkInterlacePixel.setLayoutData(new GridData(SWT.CENTER, SWT.FILL, true, false));
206
207        checkInterlacePlane = new Button(layoutComposite, SWT.RADIO);
208        checkInterlacePlane.setFont(curFont);
209        checkInterlacePlane.setText("Plane interlace");
210        checkInterlacePlane.setLayoutData(new GridData(SWT.CENTER, SWT.FILL, true, false));
211
212
213        // Create Ok/Cancel button region
214        Composite buttonComposite = new Composite(shell, SWT.NONE);
215        buttonComposite.setLayout(new GridLayout(2, true));
216        buttonComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
217
218        Button okButton = new Button(buttonComposite, SWT.PUSH);
219        okButton.setFont(curFont);
220        okButton.setText("   &OK   ");
221        okButton.setLayoutData(new GridData(SWT.END, SWT.FILL, true, false));
222        okButton.addSelectionListener(new SelectionAdapter() {
223            @Override
224            public void widgetSelected(SelectionEvent e) {
225                newObject = createHDFimage();
226                if (newObject != null) {
227                    shell.dispose();
228                }
229            }
230        });
231
232        Button cancelButton = new Button(buttonComposite, SWT.PUSH);
233        cancelButton.setFont(curFont);
234        cancelButton.setText(" &Cancel ");
235        cancelButton.setLayoutData(new GridData(SWT.BEGINNING, SWT.FILL, true, false));
236        cancelButton.addSelectionListener(new SelectionAdapter() {
237            @Override
238            public void widgetSelected(SelectionEvent e) {
239                newObject = null;
240                shell.dispose();
241                ((Vector<Group>) groupList).setSize(0);
242            }
243        });
244
245        checkIndex.setSelection(true);
246        checkInterlacePixel.setSelection(true);
247        checkInterlacePixel.setEnabled(false);
248        checkInterlacePlane.setEnabled(false);
249
250        shell.pack();
251
252        shell.addDisposeListener(new DisposeListener() {
253            @Override
254            public void widgetDisposed(DisposeEvent e) {
255                if (curFont != null) curFont.dispose();
256            }
257        });
258
259        shell.setMinimumSize(shell.computeSize(SWT.DEFAULT, SWT.DEFAULT));
260
261        Rectangle parentBounds = parent.getBounds();
262        Point shellSize = shell.getSize();
263        shell.setLocation((parentBounds.x + (parentBounds.width / 2)) - (shellSize.x / 2),
264                          (parentBounds.y + (parentBounds.height / 2)) - (shellSize.y / 2));
265
266        shell.open();
267
268        Display display = shell.getDisplay();
269        while (!shell.isDisposed())
270            if (!display.readAndDispatch())
271                display.sleep();
272    }
273
274    private Dataset createHDFimage() {
275        Dataset dataset = null;
276
277        String name = nameField.getText();
278        if (name != null) {
279            name = name.trim();
280        }
281        if ((name == null) || (name.length() <= 0)) {
282            shell.getDisplay().beep();
283            Tools.showError(shell, "Create", "Image name is not specified.");
284            return null;
285        }
286
287        if (name.indexOf(HObject.SEPARATOR) >= 0) {
288            shell.getDisplay().beep();
289            Tools.showError(shell, "Create", "Image name cannot contain path.");
290            return null;
291        }
292
293        Group pgroup = groupList.get(parentChoice.getSelectionIndex());
294
295        if (pgroup == null) {
296            shell.getDisplay().beep();
297            Tools.showError(shell, "Create", "Select a parent group.");
298            return null;
299        }
300
301        int w = 0, h = 0;
302        try {
303            w = Integer.parseInt(widthField.getText());
304            h = Integer.parseInt(heightField.getText());
305        }
306        catch (Exception ex) {
307            shell.getDisplay().beep();
308            Tools.showError(shell, "Create", ex.getMessage());
309            return null;
310        }
311
312        long[] dims = null;
313        int tclass = Datatype.CLASS_CHAR;
314        int tsign = Datatype.SIGN_NONE;
315        int tsize = 1;
316        int torder = Datatype.NATIVE;
317        int interlace = ScalarDS.INTERLACE_PIXEL;
318        int ncomp = 2;
319
320        if (checkIndex.getSelection()) {
321            // indexed colormap
322            if (isH5) {
323                long[] tmpdims = { h, w };
324                dims = tmpdims;
325            }
326            else {
327                long[] tmpdims = { w, h };
328                dims = tmpdims;
329            }
330        }
331        else {
332            // true color image
333            if (isH5) {
334                // HDF5 true color image
335                if (checkInterlacePixel.getSelection()) {
336                    long[] tmpdims = { h, w, 3 };
337                    dims = tmpdims;
338                }
339                else {
340                    interlace = ScalarDS.INTERLACE_PLANE;
341                    long[] tmpdims = { 3, h, w };
342                    dims = tmpdims;
343                }
344            }
345            else {
346                // HDF4 true color image
347                ncomp = 3;
348                long[] tmpdims = { w, h };
349                dims = tmpdims;
350                if (checkInterlacePlane.getSelection()) {
351                    interlace = ScalarDS.INTERLACE_PLANE;
352                }
353            }
354        }
355
356        try {
357            Datatype datatype = fileFormat.createDatatype(tclass, tsize, torder, tsign);
358            dataset = fileFormat.createImage(name, pgroup, datatype, dims, dims, null, -1, ncomp, interlace, null);
359            dataset.init();
360        }
361        catch (Exception ex) {
362            shell.getDisplay().beep();
363            Tools.showError(shell, "Create", ex.getMessage());
364            return null;
365        }
366
367        return dataset;
368    }
369}