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