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;
016
017import java.io.File;
018import java.io.IOException;
019import java.io.InputStream;
020import java.net.MalformedURLException;
021import java.net.URL;
022import java.net.URLClassLoader;
023import java.util.Arrays;
024import java.util.Enumeration;
025import java.util.Vector;
026import java.util.jar.JarEntry;
027import java.util.jar.JarFile;
028
029import org.eclipse.jface.preference.PreferenceStore;
030import org.eclipse.swt.graphics.Image;
031
032import hdf.HDFVersions;
033import hdf.object.FileFormat;
034
035public class ViewProperties extends PreferenceStore {
036    private static final long   serialVersionUID     = -6411465283887959066L;
037
038    private final static org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(ViewProperties.class);
039
040    /** the version of the HDFViewer */
041    public static final String  VERSION              = HDFVersions.HDFVIEW_VERSION;
042
043    /** the local property file name */
044    private static final String USER_PROPERTY_FILE   = ".hdfview" + VERSION;
045
046    /** the maximum number of most recent files */
047    public static final int     MAX_RECENT_FILES     = 15;
048
049    /** name of the tab delimiter */
050    public static final String  DELIMITER_TAB        = "Tab";
051
052    /** name of the tab delimiter */
053    public static final String  DELIMITER_COMMA      = "Comma";
054
055    /** name of the tab delimiter */
056    public static final String  DELIMITER_SPACE      = "Space";
057
058    /** name of the tab delimiter */
059    public static final String  DELIMITER_COLON      = "Colon";
060
061    /** image origin: UpperLeft */
062    public static final String  ORIGIN_UL            = "UpperLeft";
063
064    /** image origin: LowerLeft */
065    public static final String  ORIGIN_LL            = "LowerLeft";
066
067    /** image origin: UpperRight */
068    public static final String  ORIGIN_UR            = "UpperRight";
069
070    /** image origin: LowerRight */
071    public static final String  ORIGIN_LR            = "LowerRight";
072
073    /** name of the tab delimiter */
074    public static final String  DELIMITER_SEMI_COLON = "Semi-Colon";
075
076    /**
077     * The names of the various default classes for each HDFView module interface
078     */
079
080    /** Default TreeView class names */
081    public static final String DEFAULT_TREEVIEW_NAME = "hdf.view.TreeView.DefaultTreeView";
082
083    /** Default TableView class names */
084    public static final String DEFAULT_SCALAR_DATASET_TABLEVIEW_NAME = "hdf.view.TableView.DefaultScalarDSTableView";
085    public static final String DEFAULT_SCALAR_ATTRIBUTE_TABLEVIEW_NAME = "hdf.view.TableView.DefaultScalarAttributeTableView";
086    public static final String DEFAULT_COMPOUND_DATASET_TABLEVIEW_NAME = "hdf.view.TableView.DefaultCompoundDSTableView";
087    public static final String DEFAULT_COMPOUND_ATTRIBUTE_TABLEVIEW_NAME = "hdf.view.TableView.DefaultCompoundAttributeTableView";
088
089    /** Default MetaDataView class names */
090    public static final String DEFAULT_GROUP_METADATAVIEW_NAME = "hdf.view.MetaDataView.DefaultGroupMetaDataView";
091    public static final String DEFAULT_DATASET_METADATAVIEW_NAME = "hdf.view.MetaDataView.DefaultDatasetMetaDataView";
092    public static final String DEFAULT_DATATYPE_METADATAVIEW_NAME = "hdf.view.MetaDataView.DefaultDatatypeMetaDataView";
093    public static final String DEFAULT_LINK_METADATAVIEW_NAME = "hdf.view.MetaDataView.DefaultLinkMetaDataView";
094
095    /** Default ImageView class names */
096    public static final String DEFAULT_IMAGEVIEW_NAME = "hdf.view.ImageView.DefaultImageView";
097
098    /** Default PaletteView class names */
099    public static final String DEFAULT_PALETTEVIEW_NAME = "hdf.view.PaletteView.DefaultPaletteView";
100
101    /**
102     * Used to create different DataViews for a given HObject.
103     */
104    public static enum DataViewType {
105        TABLE, IMAGE, PALETTE, METADATA, TREEVIEW
106    }
107
108    /**
109     * Property keys control how the data is displayed.
110     */
111    public static enum DATA_VIEW_KEY {
112        CHAR, CONVERTBYTE, TRANSPOSED, READONLY, OBJECT, BITMASK, BITMASKOP, BORDER, INFO, INDEXBASE1, VIEW_NAME
113    }
114
115    /**
116     * Property keys control how the data is displayed.
117     */
118    public static enum BITMASK_OP {
119        AND, EXTRACT
120    }
121
122    /** the root directory of the HDFView */
123    private static String           rootDir                = System.getProperty("user.dir");
124
125    /** user's guide */
126    private static String           usersGuide             = rootDir + "/UsersGuide/index.html";
127
128    /** the font size */
129    private static int              fontSize               = 12;
130
131    /** the font type */
132    private static String           fontType               = "Serif";
133
134    /** the full path of H4toH5 converter */
135    private static String           h4toh5                 = "";
136
137    /** data delimiter */
138    private static String           delimiter              = DELIMITER_TAB;
139
140    /** image origin */
141    private static String           origin                 = ORIGIN_UL;
142
143    /** default index type */
144    private static String           indexType              = "H5_INDEX_NAME";
145
146    /** default index order */
147    private static String           indexOrder             = "H5_ITER_INC";
148
149    /** a list of most recent files */
150    private static Vector<String>   recentFiles;
151
152    /** default starting file directory */
153    private static String           workDir                = "user.home";
154
155    /** default HDF file extensions */
156    private static String           fileExt                = "hdf, h4, hdf4, h5, hdf5, he2, he5";
157
158    private static ClassLoader      extClassLoader         = null;
159
160    /** a list of srb accounts */
161    private static Vector<String[]> srbAccountList = new Vector<>(5);
162
163    /**
164     * flag to indicate if auto contrast is used in image processing. Do not use
165     * autocontrast by default (2.6 change).
166     */
167    private static boolean          isAutoContrast         = false;
168
169    private static boolean          showImageValues        = false;
170
171    private static boolean          showRegRefValues       = false;
172
173    /**
174     * flag to indicate if default open file mode is read only. By default, use read
175     * only to prevent accidental modifications to the file.
176     */
177    private static boolean          isReadOnly             = true;
178
179    private static String EarlyLib = "Latest";
180
181    private static String LateLib = "Latest";
182
183    /** a list of palette files */
184    private static Vector<String>   paletteList            = new Vector<>(5);
185
186    /** flag to indicate if enum data is converted to strings */
187    private static boolean          convertEnum            = true;
188
189    /** flag to indicate if data is 1-based index */
190    private static boolean          isIndexBase1           = false;
191
192    /**
193     * Current Java applications such as HDFView cannot handle files with a large
194     * number of objects such as 1,000,000 objects. max_members defines the maximum
195     * number of objects that will be loaded into memory.
196     */
197    private static int              max_members            = Integer.MAX_VALUE;   // load all by default
198    /**
199     * Current Java applications such as HDFView cannot handle files with a large
200     * number of objects such 1,000,000 objects. start_members defines the
201     * starting index of objects that will be loaded into memory.
202     */
203    private static int              start_members          = 0;
204
205    private static Image        hdfIcon, h4Icon, h4IconR, h5Icon, h5IconR, largeHdfIcon, blankIcon, helpIcon, fileopenIcon,
206    filesaveIcon, filenewIcon, filecloseIcon, foldercloseIcon, folderopenIcon, foldercloseIconA,
207    folderopenIconA, datasetIcon, imageIcon, tableIcon, textIcon, datasetIconA, imageIconA, tableIconA,
208    textIconA, zoominIcon, zoomoutIcon, paletteIcon, chartIcon, brightIcon, autocontrastIcon, copyIcon,
209    cutIcon, pasteIcon, previousIcon, nextIcon, firstIcon, lastIcon, animationIcon, datatypeIcon,
210    datatypeIconA, linkIcon, iconAPPS, iconURL, iconVIDEO, iconXLS, iconPDF, iconAUDIO, questionIcon;
211
212    private static String           propertyFile;
213
214    /** a list of treeview modules */
215    private static Vector<String>   moduleListTreeView     = new Vector<>(5);
216
217    /** a list of metaview modules */
218    private static Vector<String>   moduleListMetaDataView = new Vector<>(5);
219
220    /** a list of tableview modules */
221    private static Vector<String>   moduleListTableView    = new Vector<>(5);
222
223    /** a list of imageview modules */
224    private static Vector<String>   moduleListImageView    = new Vector<>(5);
225
226    /** a list of paletteview modules */
227    private static Vector<String>   moduleListPaletteView  = new Vector<>(5);
228
229    /** a list of helpview modules */
230    private static Vector<String>   moduleListHelpView     = new Vector<>(5);
231
232    /**
233     * Creates a property list with given root directory of the HDFView.
234     *
235     * @param viewRoot
236     *            the root directory of the HDFView
237     */
238    public ViewProperties(String viewRoot) {
239        super();
240        // find the property file
241        String userHome, userDir, propertyFileName, h5v;
242
243        // look for the property file in the user's home directory
244        propertyFileName = USER_PROPERTY_FILE;
245        userHome = System.getProperty("user.home") + File.separator + propertyFileName;
246        userDir = System.getProperty("user.dir") + File.separator + propertyFileName;
247        h5v = workDir + File.separator + propertyFileName;
248
249        if ((new File(userHome)).exists()) {
250            propertyFile = userHome;
251            log.trace("userHome propertyFile is {}", propertyFile);
252        }
253        else if ((new File(userDir)).exists()) {
254            propertyFile = userDir;
255            log.trace("userDir propertyFile is {}", propertyFile);
256        }
257        else {
258            propertyFile = h5v;
259            File pFile = new File(h5v);
260            try {
261                pFile.createNewFile();
262            }
263            catch (Exception ex) {
264                // Last resort: create new property file at user home directory
265                propertyFile = userHome;
266                try {
267                    pFile = new File(userHome);
268                    pFile.createNewFile();
269                }
270                catch (Exception ex2) {
271                    propertyFile = null;
272                }
273            }
274        }
275        setFilename(propertyFile);
276        log.trace("propertyFile is {}", propertyFile);
277
278        rootDir = viewRoot;
279        log.trace("rootDir is {}", rootDir);
280        String workPath = System.getProperty("hdfview.workdir");
281        log.trace("hdfview.workdir={}", workPath);
282        if (workPath != null) {
283            workDir = workPath;
284        }
285
286        recentFiles = new Vector<>(MAX_RECENT_FILES + 5);
287
288        setDefault("users.guide", System.getProperty("user.dir") + "/UsersGuide/index.html");
289        setDefault("image.contrast", false);
290        setDefault("image.showvalues", false);
291        setDefault("file.mode", "r");
292        setDefault("lib.lowversion", "Earliest");
293        setDefault("lib.highversion", "Latest");
294        setDefault("enum.conversion", false);
295        setDefault("regref.showvalues", false);
296        setDefault("index.base1", false);
297        setDefault("image.origin", ORIGIN_UL);
298        setDefault("h5file.indexType", "H5_INDEX_NAME");
299        setDefault("h5file.indexOrder", "H5_ITER_INC");
300        setDefault("h4toh5.converter", "");
301        setDefault("work.dir", "user.home");
302        setDefault("file.extension", "hdf, h4, hdf4, h5, hdf5, he2, he5");
303        setDefault("font.size", 12);
304        setDefault("font.type", "Serif");
305        setDefault("max.members", Integer.MAX_VALUE);
306        setDefault("recent.file", "");
307        setDefault("palette.file", "");
308        setDefault("data.delimiter", DELIMITER_TAB);
309    }
310
311    /**
312     * load module classes
313     *
314     * @return the ClassLoader
315     */
316    public static ClassLoader loadExtClass() {
317        log.trace("loadExtClass: start");
318        if (extClassLoader != null) {
319            return extClassLoader;
320        }
321        else {
322            // default classloader
323            extClassLoader = ClassLoader.getSystemClassLoader();
324        }
325        log.trace("loadExtClass: default classloader is {}", extClassLoader);
326
327        String rootPath = System.getProperty("hdfview.root");
328        if (rootPath == null) {
329            rootPath = rootDir;
330            log.debug("loadExtClass: rootDir rootPath is {}", rootPath);
331        }
332        log.debug("loadExtClass: rootPath is {}", rootPath);
333
334        String dirname = rootPath + File.separator + "lib" + File.separator + "ext" + File.separator;
335        String[] jars = null;
336        File extdir = null;
337        try {
338            extdir = new File(dirname);
339            jars = extdir.list();
340            log.trace("loadExtClass: dirname is {} with {} jars", dirname, jars.length);
341        }
342        catch (Exception ex0) {
343            log.debug("loadExtClass: load dirname: {}+lib/ext failed", rootPath, ex0);
344        }
345
346        if ((jars == null) || (jars.length <= 0)) {
347            return extClassLoader;
348        }
349
350        Vector<String> jarList = new Vector<>(50);
351        Vector<String> classList = new Vector<>(50);
352        for (int i = 0; i < jars.length; i++) {
353            log.trace("loadExtClass: load jar[{}]", i);
354            if (jars[i].endsWith(".jar")) {
355                jarList.add(jars[i]);
356                // add class names to the list of classes
357                File tmpFile = new File(extdir, jars[i]);
358                try {
359                    JarFile jarFile = new JarFile(tmpFile, false, JarFile.OPEN_READ);
360                    Enumeration<?> emu = jarFile.entries();
361                    while (emu.hasMoreElements()) {
362                        JarEntry jarEntry = (JarEntry) emu.nextElement();
363                        String entryName = jarEntry.getName();
364                        log.trace("loadExtClass: reading jar[{}] class={}", i, entryName);
365                        int idx = entryName.indexOf(".class");
366                        if ((idx > 0) && (entryName.indexOf('$') <= 0)) {
367                            entryName = entryName.replace('/', '.');
368                            classList.add(entryName.substring(0, idx));
369                        }
370                    }
371
372                    jarFile.close();
373                }
374                catch (Exception ex) {
375                    log.debug("loadExtClass: load jar[{}] failed", i, ex);
376                }
377            } // if (jars[i].endsWith(".jar")) {
378        } // for (int i=0; i<jars.length; i++) {
379
380        int n = jarList.size();
381        if (n <= 0) {
382            log.debug("loadExtClass: jarList empty");
383            return extClassLoader;
384        }
385
386        URL[] urls = new URL[n];
387        for (int i = 0; i < n; i++) {
388            try {
389                urls[i] = new URL("file:///" + rootPath + "/lib/ext/" + jarList.get(i));
390                log.trace("loadExtClass: load urls[{}] is {}", i, urls[i]);
391            }
392            catch (MalformedURLException mfu) {
393                log.debug("loadExtClass: load urls[{}] failed", i, mfu);
394            }
395        }
396
397        // try { extClassLoader = new URLClassLoader(urls); }
398        try {
399            extClassLoader = URLClassLoader.newInstance(urls);
400        }
401        catch (Exception ex) {
402            ex.printStackTrace();
403        }
404
405        // load user modules into their list
406        n = classList.size();
407        for (int i = 0; i < n; i++) {
408            String theName = classList.get(i);
409            log.trace("loadExtClass: load classList[{}] is {}", i, theName);
410            try {
411                // enables use of JHDF5 in JNLP (Web Start) applications, the
412                // system class loader with reflection first.
413                Class<?> theClass = null;
414                try {
415                    theClass = Class.forName(theName);
416                }
417                catch (Exception ex) {
418                    try {
419                        theClass = extClassLoader.loadClass(theName);
420                    }
421                    catch (Exception exc) {
422                        log.debug("load: loadClass({}) failed", theName, ex);
423                    }
424                }
425
426                if(theClass != null) {
427                    Class<?>[] interfaces = theClass.getInterfaces();
428                    if (interfaces != null) {
429                        for (int j = 0; j < interfaces.length; j++) {
430                            String interfaceName = interfaces[j].getName();
431                            log.trace("loadExtClass: load interfaces[{}] is {}", j, interfaceName);
432
433                            if ("hdf.view.TreeView.TreeView".equals(interfaceName)
434                                    && !moduleListTreeView.contains(theName)) {
435                                moduleListTreeView.add(theName);
436                                break;
437                            }
438                            else if ("hdf.view.MetaDataView.MetaDataView".equals(interfaceName)
439                                    && !moduleListMetaDataView.contains(theName)) {
440                                moduleListMetaDataView.add(theName);
441                                break;
442                            }
443                            else if ("hdf.view.TableView.TableView".equals(interfaceName)
444                                    && !moduleListTableView.contains(theName)) {
445                                moduleListTableView.add(theName);
446                                break;
447                            }
448                            else if ("hdf.view.ImageView.ImageView".equals(interfaceName)
449                                    && !moduleListImageView.contains(theName)) {
450                                moduleListImageView.add(theName);
451                                break;
452                            }
453                            else if ("hdf.view.PaletteView.PaletteView".equals(interfaceName)
454                                    && !moduleListPaletteView.contains(theName)) {
455                                moduleListPaletteView.add(theName);
456                                break;
457                            }
458                            else if ("hdf.view.HelpView.HelpView".equals(interfaceName)
459                                    && !moduleListHelpView.contains(theName)) {
460                                moduleListHelpView.add(theName);
461                                break;
462                            }
463                        } // for (int j=0; j<interfaces.length; j++) {
464                    } // if (interfaces != null) {
465                }
466            }
467            catch (Exception ex) {
468                log.debug("loadExtClass: load classList[{}] of {} failed", i, theName, ex);
469            }
470        } // for (int i=0; i<n; i++)
471        log.trace("loadExtClass: finished");
472
473        return extClassLoader;
474    }
475
476    /** @return the root directory where the HDFView is installed. */
477    public static String getViewRoot() {
478        return rootDir;
479    }
480
481    public static Image getFoldercloseIcon() {
482        return foldercloseIcon;
483    }
484
485    public static Image getFoldercloseIconA() {
486        return foldercloseIconA;
487    }
488
489    public static Image getFolderopenIcon() {
490        return folderopenIcon;
491    }
492
493    public static Image getFolderopenIconA() {
494        return folderopenIconA;
495    }
496
497    public static Image getHdfIcon() {
498        return hdfIcon;
499    }
500
501    public static Image getH4Icon() {
502        return h4Icon;
503    }
504
505    public static Image getH4IconR() {
506        return h4IconR;
507    }
508
509    public static Image getH5Icon() {
510        return h5Icon;
511    }
512
513    public static Image getH5IconR() {
514        return h5IconR;
515    }
516
517    public static Image getDatasetIcon() {
518        return datasetIcon;
519    }
520
521    public static Image getDatasetIconA() {
522        return datasetIconA;
523    }
524
525    public static Image getDatatypeIcon() {
526        return datatypeIcon;
527    }
528
529    public static Image getDatatypeIconA() {
530        return datatypeIconA;
531    }
532
533    public static Image getLinkIcon() {
534        return linkIcon;
535    }
536
537    public static Image getFileopenIcon() {
538        return fileopenIcon;
539    }
540
541    public static Image getFilesaveIcon() {
542        return filesaveIcon;
543    }
544
545    public static Image getFilenewIcon() {
546        return filenewIcon;
547    }
548
549    public static Image getFilecloseIcon() {
550        return filecloseIcon;
551    }
552
553    public static Image getPaletteIcon() {
554        return paletteIcon;
555    }
556
557    public static Image getBrightIcon() {
558        return brightIcon;
559    }
560
561    public static Image getAutocontrastIcon() {
562        return autocontrastIcon;
563    }
564
565    public static Image getImageIcon() {
566        return imageIcon;
567    }
568
569    public static Image getTableIcon() {
570        return tableIcon;
571    }
572
573    public static Image getTextIcon() {
574        return textIcon;
575    }
576
577    public static Image getImageIconA() {
578        return imageIconA;
579    }
580
581    public static Image getTableIconA() {
582        return tableIconA;
583    }
584
585    public static Image getTextIconA() {
586        return textIconA;
587    }
588
589    public static Image getZoominIcon() {
590        return zoominIcon;
591    }
592
593    public static Image getZoomoutIcon() {
594        return zoomoutIcon;
595    }
596
597    public static Image getBlankIcon() {
598        return blankIcon;
599    }
600
601    public static Image getHelpIcon() {
602        return helpIcon;
603    }
604
605    public static Image getCopyIcon() {
606        return copyIcon;
607    }
608
609    public static Image getCutIcon() {
610        return cutIcon;
611    }
612
613    public static Image getPasteIcon() {
614        return pasteIcon;
615    }
616
617    public static Image getLargeHdfIcon() {
618        return largeHdfIcon;
619    }
620
621    public static Image getPreviousIcon() {
622        return previousIcon;
623    }
624
625    public static Image getNextIcon() {
626        return nextIcon;
627    }
628
629    public static Image getFirstIcon() {
630        return firstIcon;
631    }
632
633    public static Image getLastIcon() {
634        return lastIcon;
635    }
636
637    public static Image getChartIcon() {
638        return chartIcon;
639    }
640
641    public static Image getAnimationIcon() {
642        return animationIcon;
643    }
644
645    public static Image getAppsIcon() {
646        return iconAPPS;
647    }
648
649    public static Image getUrlIcon() {
650        return iconURL;
651    }
652
653    public static Image getVideoIcon() {
654        return iconVIDEO;
655    }
656
657    public static Image getXlsIcon() {
658        return iconXLS;
659    }
660
661    public static Image getPdfIcon() {
662        return iconPDF;
663    }
664
665    public static Image getAudioIcon() {
666        return iconAUDIO;
667    }
668
669    public static Image getQuestionIcon() {
670        return questionIcon;
671    }
672
673    public static void loadIcons() {
674        InputStream s = null;
675        log.trace("loadIcons: start");
676
677        // load icon images
678
679        try {
680            s = ViewProperties.class.getResourceAsStream("icons/hdf.gif");
681            hdfIcon = new Image(null, s);
682        }
683        catch (Exception ex) {
684            hdfIcon = null;
685            log.trace("hdfIcon: null");
686        }
687
688        try {
689            s = ViewProperties.class.getResourceAsStream("icons/hdf4.gif");
690            h4Icon = new Image(null, s);
691        }
692        catch (Exception ex) {
693            h4Icon = null;
694            log.trace("h4Icon: null");
695        }
696
697        try {
698            s = ViewProperties.class.getResourceAsStream("icons/hdf4R.gif");
699            h4IconR = new Image(null, s);
700        }
701        catch (Exception ex) {
702            h4IconR = null;
703            log.trace("h4IconR: null");
704        }
705
706        try {
707            s = ViewProperties.class.getResourceAsStream("icons/hdf5.gif");
708            h5Icon = new Image(null, s);
709        }
710        catch (Exception ex) {
711            h5Icon = null;
712            log.trace("h5Icon: null");
713        }
714
715        try {
716            s = ViewProperties.class.getResourceAsStream("icons/hdf5R.gif");
717            h5IconR = new Image(null, s);
718        }
719        catch (Exception ex) {
720            h5IconR = null;
721            log.trace("h5IconR: null");
722        }
723
724        try {
725            s = ViewProperties.class.getResourceAsStream("icons/folderclose.gif");
726            foldercloseIcon = new Image(null, s);
727        }
728        catch (Exception ex) {
729            foldercloseIcon = null;
730            log.trace("foldercloseIcon: null");
731        }
732
733        try {
734            s = ViewProperties.class.getResourceAsStream("icons/foldercloseA.gif");
735            foldercloseIconA = new Image(null, s);
736        }
737        catch (Exception ex) {
738            foldercloseIconA = null;
739            log.trace("foldercloseIconA: null");
740        }
741
742        try {
743            s = ViewProperties.class.getResourceAsStream("icons/folderopen.gif");
744            folderopenIcon = new Image(null, s);
745        }
746        catch (Exception ex) {
747            folderopenIcon = null;
748            log.trace("folderopenIcon: null");
749        }
750
751        try {
752            s = ViewProperties.class.getResourceAsStream("icons/folderopenA.gif");
753            folderopenIconA = new Image(null, s);
754        }
755        catch (Exception ex) {
756            folderopenIconA = null;
757            log.trace("folderopenIconA: null");
758        }
759
760        try {
761            s = ViewProperties.class.getResourceAsStream("icons/dataset.gif");
762            datasetIcon = new Image(null, s);
763        }
764        catch (Exception ex) {
765            datasetIcon = null;
766            log.trace("datasetIcon: null");
767        }
768
769        try {
770            s = ViewProperties.class.getResourceAsStream("icons/datasetA.gif");
771            datasetIconA = new Image(null, s);
772        }
773        catch (Exception ex) {
774            datasetIconA = null;
775            log.trace("datasetIconA: null");
776        }
777
778        try {
779            s = ViewProperties.class.getResourceAsStream("icons/datatype.gif");
780            datatypeIcon = new Image(null, s);
781        }
782        catch (Exception ex) {
783            datatypeIcon = null;
784            log.trace("datatypeIcon: null");
785        }
786
787        try {
788            s = ViewProperties.class.getResourceAsStream("icons/datatypeA.gif");
789            datatypeIconA = new Image(null, s);
790        }
791        catch (Exception ex) {
792            datatypeIconA = null;
793            log.trace("datatypeIconA: null");
794        }
795
796        try {
797            s = ViewProperties.class.getResourceAsStream("icons/link.gif");
798            linkIcon = new Image(null, s);
799        }
800        catch (Exception ex) {
801            linkIcon = null;
802            log.trace("linkIcon: null");
803        }
804
805        try {
806            s = ViewProperties.class.getResourceAsStream("icons/fileopen.gif");
807            fileopenIcon = new Image(null, s);
808        }
809        catch (Exception ex) {
810            fileopenIcon = null;
811            log.trace("fileopenIcon: null");
812        }
813
814        try {
815            s = ViewProperties.class.getResourceAsStream("icons/filesave.gif");
816            filesaveIcon = new Image(null, s);
817        }
818        catch (Exception ex) {
819            filesaveIcon = null;
820            log.trace("filesaveIcon: null");
821        }
822
823        try {
824            s = ViewProperties.class.getResourceAsStream("icons/filenew.gif");
825            filenewIcon = new Image(null, s);
826        }
827        catch (Exception ex) {
828            filenewIcon = null;
829            log.trace("filenewIcon: null");
830        }
831
832        try {
833            s = ViewProperties.class.getResourceAsStream("icons/fileclose.gif");
834            filecloseIcon = new Image(null, s);
835        }
836        catch (Exception ex) {
837            filecloseIcon = null;
838            log.trace("filecloseIcon: null");
839        }
840
841        try {
842            s = ViewProperties.class.getResourceAsStream("icons/palette.gif");
843            paletteIcon = new Image(null, s);
844        }
845        catch (Exception ex) {
846            paletteIcon = null;
847            log.trace("paletteIcon: null");
848        }
849
850        try {
851            s = ViewProperties.class.getResourceAsStream("icons/brightness.gif");
852            brightIcon = new Image(null, s);
853        }
854        catch (Exception ex) {
855            brightIcon = null;
856            log.trace("brightIcon: null");
857        }
858
859        try {
860            s = ViewProperties.class.getResourceAsStream("icons/autocontrast.gif");
861            autocontrastIcon = new Image(null, s);
862        }
863        catch (Exception ex) {
864            autocontrastIcon = null;
865            log.trace("autocontrastIcon: null");
866        }
867
868        try {
869            s = ViewProperties.class.getResourceAsStream("icons/image.gif");
870            imageIcon = new Image(null, s);
871        }
872        catch (Exception ex) {
873            imageIcon = null;
874            log.trace("imageIcon: null");
875        }
876
877        try {
878            s = ViewProperties.class.getResourceAsStream("icons/imageA.gif");
879            imageIconA = new Image(null, s);
880        }
881        catch (Exception ex) {
882            imageIconA = null;
883            log.trace("imageIconA: null");
884        }
885
886        try {
887            s = ViewProperties.class.getResourceAsStream("icons/table.gif");
888            tableIcon = new Image(null, s);
889        }
890        catch (Exception ex) {
891            tableIcon = null;
892            log.trace("tableIcon: null");
893        }
894
895        try {
896            s = ViewProperties.class.getResourceAsStream("icons/tableA.gif");
897            tableIconA = new Image(null, s);
898        }
899        catch (Exception ex) {
900            tableIconA = null;
901            log.trace("tableIconA: null");
902        }
903
904        try {
905            s = ViewProperties.class.getResourceAsStream("icons/text.gif");
906            textIcon = new Image(null, s);
907        }
908        catch (Exception ex) {
909            textIcon = null;
910            log.trace("textIcon: null");
911        }
912
913        try {
914            s = ViewProperties.class.getResourceAsStream("icons/textA.gif");
915            textIconA = new Image(null, s);
916        }
917        catch (Exception ex) {
918            textIconA = null;
919            log.trace("textIconA: null");
920        }
921
922        try {
923            s = ViewProperties.class.getResourceAsStream("icons/zoomin.gif");
924            zoominIcon = new Image(null, s);
925        }
926        catch (Exception ex) {
927            zoominIcon = null;
928            log.trace("iconAUzoominIconDIO: null");
929        }
930
931        try {
932            s = ViewProperties.class.getResourceAsStream("icons/zoomout.gif");
933            zoomoutIcon = new Image(null, s);
934        }
935        catch (Exception ex) {
936            zoomoutIcon = null;
937            log.trace("zoomoutIcon: null");
938        }
939
940        try {
941            s = ViewProperties.class.getResourceAsStream("icons/blank.gif");
942            blankIcon = new Image(null, s);
943        }
944        catch (Exception ex) {
945            blankIcon = null;
946            log.trace("blankIcon: null");
947        }
948
949        try {
950            s = ViewProperties.class.getResourceAsStream("icons/help.gif");
951            helpIcon = new Image(null, s);
952        }
953        catch (Exception ex) {
954            helpIcon = null;
955            log.trace("helpIcon: null");
956        }
957
958        try {
959            s = ViewProperties.class.getResourceAsStream("icons/copy.gif");
960            copyIcon = new Image(null, s);
961        }
962        catch (Exception ex) {
963            copyIcon = null;
964            log.trace("copyIcon: null");
965        }
966
967        try {
968            s = ViewProperties.class.getResourceAsStream("icons/cut.gif");
969            cutIcon = new Image(null, s);
970        }
971        catch (Exception ex) {
972            cutIcon = null;
973            log.trace("cutIcon: null");
974        }
975
976        try {
977            s = ViewProperties.class.getResourceAsStream("icons/paste.gif");
978            pasteIcon = new Image(null, s);
979        }
980        catch (Exception ex) {
981            pasteIcon = null;
982            log.trace("pasteIcon: null");
983        }
984
985        try {
986            s = ViewProperties.class.getResourceAsStream("icons/hdf_large.gif");
987            largeHdfIcon = new Image(null, s);
988        }
989        catch (Exception ex) {
990            largeHdfIcon = null;
991            log.trace("largeHdfIcon: null");
992        }
993
994        try {
995            s = ViewProperties.class.getResourceAsStream("icons/previous.gif");
996            previousIcon = new Image(null, s);
997        }
998        catch (Exception ex) {
999            previousIcon = null;
1000            log.trace("previousIcon: null");
1001        }
1002
1003        try {
1004            s = ViewProperties.class.getResourceAsStream("icons/next.gif");
1005            nextIcon = new Image(null, s);
1006        }
1007        catch (Exception ex) {
1008            nextIcon = null;
1009            log.trace("nextIcon: null");
1010        }
1011
1012        try {
1013            s = ViewProperties.class.getResourceAsStream("icons/first.gif");
1014            firstIcon = new Image(null, s);
1015        }
1016        catch (Exception ex) {
1017            firstIcon = null;
1018            log.trace("firstIcon: null");
1019        }
1020
1021        try {
1022            s = ViewProperties.class.getResourceAsStream("icons/last.gif");
1023            lastIcon = new Image(null, s);
1024        }
1025        catch (Exception ex) {
1026            lastIcon = null;
1027            log.trace("lastIcon: null");
1028        }
1029
1030        try {
1031            s = ViewProperties.class.getResourceAsStream("icons/chart.gif");
1032            chartIcon = new Image(null, s);
1033        }
1034        catch (Exception ex) {
1035            chartIcon = null;
1036            log.trace("chartIcon: null");
1037        }
1038
1039        try {
1040            s = ViewProperties.class.getResourceAsStream("icons/animation.gif");
1041            animationIcon = new Image(null, s);
1042        }
1043        catch (Exception ex) {
1044            animationIcon = null;
1045            log.trace("animationIcon: null");
1046        }
1047
1048        try {
1049            s = ViewProperties.class.getResourceAsStream("icons/question.gif");
1050            questionIcon = new Image(null, s);
1051        }
1052        catch (Exception ex) {
1053            questionIcon = null;
1054            log.trace("questionIcon: null");
1055        }
1056
1057        try {
1058            s = ViewProperties.class.getResourceAsStream("icons/audio.gif");
1059            iconAUDIO = new Image(null, s);
1060        }
1061        catch (Exception ex) {
1062            iconAUDIO = null;
1063            log.trace("iconAUDIO: null");
1064        }
1065
1066        try {
1067            s = ViewProperties.class.getResourceAsStream("icons/xls.gif");
1068            iconXLS = new Image(null, s);
1069        }
1070        catch (Exception ex) {
1071            iconXLS = null;
1072            log.trace("iconXLS: null");
1073        }
1074
1075        try {
1076            s = ViewProperties.class.getResourceAsStream("icons/pdf.gif");
1077            iconPDF = new Image(null, s);
1078        }
1079        catch (Exception ex) {
1080            iconPDF = null;
1081            log.trace("iconPDF: null");
1082        }
1083
1084        try {
1085            s = ViewProperties.class.getResourceAsStream("icons/apps.gif");
1086            iconAPPS = new Image(null, s);
1087        }
1088        catch (Exception ex) {
1089            iconAPPS = null;
1090            log.trace("iconAPPS: null");
1091        }
1092
1093        try {
1094            s = ViewProperties.class.getResourceAsStream("icons/url.gif");
1095            iconURL = new Image(null, s);
1096        }
1097        catch (Exception ex) {
1098            iconURL = null;
1099            log.trace("iconURL: null");
1100        }
1101
1102        try {
1103            s = ViewProperties.class.getResourceAsStream("icons/video.gif");
1104            iconVIDEO = new Image(null, s);
1105        }
1106        catch (Exception ex) {
1107            iconVIDEO = null;
1108            log.trace("iconVIDEO: null");
1109        }
1110        log.trace("loadIcons: finish");
1111    }
1112
1113    /**
1114     * Load user properties from property file
1115     *
1116     * @throws IOException
1117     *             if a failure occurred
1118     */
1119    @Override
1120    @SuppressWarnings({ "rawtypes", "unchecked" })
1121    public void load() throws IOException {
1122        super.load();
1123
1124        log.trace("load user properties: begin");
1125
1126        if (propertyFile == null)
1127            return;
1128
1129        String propVal = null;
1130
1131        // add default module.
1132        log.trace("load user properties: add default module");
1133        String[] moduleKeys = { "module.treeview", "module.metadataview", "module.tableview",
1134                "module.imageview", "module.paletteview" };
1135        Vector[] moduleList = { moduleListTreeView, moduleListMetaDataView, moduleListTableView,
1136                moduleListImageView, moduleListPaletteView };
1137        String[] moduleNames = { DEFAULT_TREEVIEW_NAME, "hdf.view.DefaultMetaDataView", "hdf.view.DefaultTableView",
1138                DEFAULT_IMAGEVIEW_NAME, DEFAULT_PALETTEVIEW_NAME };
1139
1140        // add default implementation of modules
1141        log.trace("load user properties: modules");
1142        for (int i = 0; i < moduleNames.length; i++) {
1143            if (!moduleList[i].contains(moduleNames[i])) moduleList[i].addElement(moduleNames[i]);
1144            log.trace("load: add default moduleList[{}] is {}", i, moduleNames[i]);
1145        }
1146        log.trace("load Ext Class modules");
1147        if (extClassLoader == null) loadExtClass();
1148
1149        // set default selection of data views
1150        log.trace("load user properties: set default selection of data views");
1151        for (int i = 0; i < moduleNames.length; i++) {
1152            Vector<String> theList = moduleList[i];
1153            propVal = getString(moduleKeys[i]);
1154            log.trace("load: default theList is {}", Arrays.toString(theList.toArray()));
1155
1156            if (propVal != null) {
1157                // set default to the module specified in property file
1158                if (theList.size() > 1) {
1159                    if (theList.contains(propVal)) theList.remove(propVal);
1160                    theList.add(0, propVal);
1161                }
1162                log.trace("load user properties: module[{}]={}", i, propVal);
1163            }
1164            else {
1165                // use default module
1166                if (theList.size() > 1) {
1167                    if (theList.contains(moduleNames[i])) theList.remove(moduleNames[i]);
1168                    theList.add(0, moduleNames[i]);
1169                }
1170                log.trace("load user properties: default module[{}]={}", i, moduleNames[i]);
1171            }
1172            log.trace("load: final theList is {}", Arrays.toString(theList.toArray()));
1173        }
1174
1175        // set default modules from user property files
1176        log.trace("load user properties: default modules");
1177        for (int i = 0; i < moduleNames.length; i++) {
1178            String moduleName = getString(moduleKeys[i]);
1179            log.trace("load: default modules from user property is {}", moduleName);
1180            if ((moduleName != null) && (moduleName.length() > 0)) {
1181                if (moduleList[i].contains(moduleName))
1182                    moduleList[i].remove(moduleName);
1183                moduleList[i].add(0, moduleName);
1184            }
1185        }
1186
1187        // add fileformat modules
1188        log.trace("load user properties: fileformat modules");
1189        String[] local_enum = this.preferenceNames();
1190        String fExt = null;
1191        for (String theKey : local_enum) {
1192            log.trace("load: add prop {}", theKey);
1193            if (theKey.startsWith("module.fileformat")) {
1194                fExt = theKey.substring(18);
1195                try {
1196                    // enables use of JHDF5 in JNLP (Web Start) applications,
1197                    // the system class loader with reflection first.
1198                    String className = getString(theKey);
1199                    Class theClass = null;
1200                    try {
1201                        theClass = Class.forName(className);
1202                    }
1203                    catch (Exception ex) {
1204                        try {
1205                            theClass = extClassLoader.loadClass(className);
1206                        }
1207                        catch (Exception ex2) {
1208                            log.debug("load: extClassLoader.loadClass({}) failed", className, ex2);
1209                        }
1210                    }
1211
1212                    Object theObject = theClass.newInstance();
1213                    if (theObject instanceof FileFormat) {
1214                        FileFormat.addFileFormat(fExt, (FileFormat) theObject);
1215                    }
1216                }
1217                catch (Throwable err) {
1218                    log.debug("load: load file format failed", err);
1219                }
1220            }
1221        }
1222
1223        propVal = getString("users.guide");
1224        if (!isDefault("users.guide"))
1225            usersGuide = propVal;
1226
1227        propVal = getString("image.contrast");
1228        if (!isDefault("image.contrast"))
1229            isAutoContrast = ("auto".equalsIgnoreCase(propVal));
1230
1231        showImageValues = getBoolean("image.showvalues");
1232
1233        propVal = getString("file.mode");
1234        if (!isDefault("file.mode"))
1235            isReadOnly = ("r".equalsIgnoreCase(propVal));
1236
1237        EarlyLib = getString("lib.lowversion");
1238
1239        LateLib = getString("lib.highversion");
1240
1241        convertEnum = getBoolean("enum.conversion");
1242
1243        showRegRefValues = getBoolean("regref.showvalues");
1244
1245        isIndexBase1 = getBoolean("index.base1");
1246
1247        propVal = getString("data.delimiter");
1248        if (!isDefault("data.delimiter"))
1249            delimiter = propVal;
1250
1251        propVal = getString("image.origin");
1252        if (!isDefault("image.origin"))
1253            origin = propVal;
1254
1255        propVal = getString("h5file.indexType");
1256        if (!isDefault("h5file.indexType"))
1257            indexType = propVal;
1258
1259        propVal = getString("h5file.indexOrder");
1260        if (!isDefault("h5file.indexOrder"))
1261            indexOrder = propVal;
1262
1263        propVal = getString("h4toh5.converter");
1264        if (!isDefault("h4toh5.converter"))
1265            h4toh5 = propVal;
1266
1267        propVal = getString("work.dir");
1268        if (!isDefault("work.dir"))
1269            workDir = propVal;
1270
1271        propVal = getString("file.extension");
1272        if (!isDefault("file.extension")) {
1273            fileExt = propVal;
1274            FileFormat.addFileExtension(fileExt);
1275        }
1276
1277        fontSize = getInt("font.size");
1278
1279        propVal = getString("font.type");
1280        if (!isDefault("font.type"))
1281            fontType = propVal.trim();
1282
1283        max_members = getInt("max.members");
1284
1285        // load the most recent file list from the property file
1286        log.trace("load user properties: most recent file list");
1287        String theFile = null;
1288        for (int i = 0; i < MAX_RECENT_FILES; i++) {
1289            theFile = getString("recent.file" + i);
1290            if ((theFile != null) && !recentFiles.contains(theFile)) {
1291                if (theFile.startsWith("http://") || theFile.startsWith("ftp://") || (new File(theFile)).exists()) {
1292                    recentFiles.addElement(theFile);
1293                }
1294            }
1295            // else {
1296            // this.remove("recent.file" + i);
1297            // }
1298        }
1299
1300        // load the most recent palette file list from the property file
1301        log.trace("load user properties: most recent palette file list");
1302        theFile = null;
1303        for (int i = 0; i < MAX_RECENT_FILES; i++) {
1304            theFile = getString("palette.file" + i);
1305            if (theFile != null) theFile = theFile.trim();
1306
1307            if ((theFile != null && theFile.length() > 0) && !paletteList.contains(theFile)) {
1308                if ((new File(theFile)).exists()) {
1309                    paletteList.addElement(theFile);
1310                }
1311            }
1312            // else {
1313            // this.remove("palette.file" + i);
1314            // }
1315        }
1316
1317        // load srb account
1318        // log.trace("load user properties: srb account");
1319        // propVal = null;
1320        // String srbaccount[] = new String[7];
1321        // for (int i = 0; i < MAX_RECENT_FILES; i++) {
1322        // if (null == (srbaccount[0] = getString("srbaccount" + i + ".host")))
1323        // continue;
1324        //
1325        // if (null == (srbaccount[1] = getString("srbaccount" + i + ".port")))
1326        // continue;
1327        //
1328        // if (null == (srbaccount[2] = getString("srbaccount" + i + ".user")))
1329        // continue;
1330        //
1331        // if (null == (srbaccount[3] = getString("srbaccount" + i + ".password")))
1332        // continue;
1333        //
1334        // if (null == (srbaccount[4] = getString("srbaccount" + i + ".home")))
1335        // continue;
1336        //
1337        // if (null == (srbaccount[5] = getString("srbaccount" + i + ".domain")))
1338        // continue;
1339        //
1340        // if (null == (srbaccount[6] = getString("srbaccount" + i + ".resource")))
1341        // continue;
1342        //
1343        // srbAccountList.add(srbaccount);
1344        // srbaccount = new String[7];
1345        // }
1346        log.trace("load: finish");
1347    }
1348
1349    /**
1350     * Save user properties into property file
1351     *
1352     * @throws IOException
1353     *             if a failure occurred
1354     */
1355    @Override
1356    public void save() throws IOException {
1357        log.trace("save user properties: begin");
1358        if (propertyFile == null)
1359            return;
1360
1361        // update data saving options
1362        log.trace("save user properties: update data saving options");
1363        if (delimiter == null)
1364            setDefault("data.delimiter", DELIMITER_TAB);
1365        else
1366            setValue("data.delimiter", delimiter);
1367
1368        if (origin == null)
1369            setDefault("image.origin", ORIGIN_UL);
1370        else
1371            setValue("image.origin", origin);
1372
1373        if (indexType != null) setValue("h5file.indexType", indexType);
1374
1375        if (indexOrder != null) setValue("h5file.indexOrder", indexOrder);
1376
1377        if (usersGuide != null) setValue("users.guide", usersGuide);
1378
1379        if (workDir != null) setValue("work.dir", workDir);
1380
1381        if (fileExt != null) setValue("file.extension", fileExt);
1382
1383        if (h4toh5 != null) setValue("h4toh5.converter", h4toh5);
1384
1385        setValue("font.size", fontSize);
1386
1387        if (fontType != null) setValue("font.type", fontType);
1388
1389        setValue("max.members", max_members);
1390
1391        if (isAutoContrast)
1392            setValue("image.contrast", "auto");
1393        else
1394            setValue("image.contrast", "general");
1395
1396        setValue("image.showvalues", showImageValues);
1397
1398        if (isReadOnly)
1399            setValue("file.mode", "r");
1400        else
1401            setValue("file.mode", "rw");
1402
1403        log.trace("save user properties: lib.lowversion={}", EarlyLib);
1404        setValue("lib.lowversion", EarlyLib);
1405        log.trace("save user properties: lib.highversion={}", LateLib);
1406        setValue("lib.highversion", LateLib);
1407
1408        setValue("enum.conversion", convertEnum);
1409        setValue("regref.showvalues", showRegRefValues);
1410        setValue("index.base1", isIndexBase1);
1411
1412        // save the list of most recent files
1413        log.trace("save user properties: most recent files");
1414        String theFile;
1415        int size = recentFiles.size();
1416        int minSize = Math.min(size, MAX_RECENT_FILES);
1417        log.trace("save user properties: most recent files size={}", size);
1418        for (int i = 0; i < minSize; i++) {
1419            theFile = recentFiles.elementAt(i);
1420            if ((theFile != null) && (theFile.length() > 0)) setValue("recent.file" + i, theFile);
1421        }
1422
1423        // save the list of most recent palette files
1424        log.trace("save user properties: most recent palette files");
1425        size = paletteList.size();
1426        minSize = Math.min(size, MAX_RECENT_FILES);
1427        for (int i = 0; i < minSize; i++) {
1428            theFile = paletteList.elementAt(i);
1429            if ((theFile != null) && (theFile.length() > 0)) setValue("palette.file" + i, theFile);
1430        }
1431
1432        // save srb account
1433        // log.trace("save user properties: srb account");
1434        // String srbaccount[] = null;
1435        // size = srbAccountList.size();
1436        // minSize = Math.min(size, MAX_RECENT_FILES);
1437        // for (int i = 0; i < minSize; i++) {
1438        // srbaccount = srbAccountList.get(i);
1439        // if ((srbaccount[0] != null) && (srbaccount[1] != null) && (srbaccount[2] !=
1440        // null)
1441        // && (srbaccount[3] != null) && (srbaccount[4] != null) && (srbaccount[5] !=
1442        // null)
1443        // && (srbaccount[6] != null)) {
1444        // setValue("srbaccount" + i + ".host", srbaccount[0]);
1445        // setValue("srbaccount" + i + ".port", srbaccount[1]);
1446        // setValue("srbaccount" + i + ".user", srbaccount[2]);
1447        // setValue("srbaccount" + i + ".password", srbaccount[3]);
1448        // setValue("srbaccount" + i + ".home", srbaccount[4]);
1449        // setValue("srbaccount" + i + ".domain", srbaccount[5]);
1450        // setValue("srbaccount" + i + ".resource", srbaccount[6]);
1451        // }
1452        // }
1453
1454        // save default modules
1455        log.trace("save user properties: default modules");
1456        String moduleName = moduleListTreeView.elementAt(0);
1457        if ((moduleName != null) && (moduleName.length() > 0)) setValue("module.treeview", moduleName);
1458        log.trace("save user properties: module.treeview={}", moduleName);
1459
1460        moduleName = moduleListMetaDataView.elementAt(0);
1461        if ((moduleName != null) && (moduleName.length() > 0)) setValue("module.metadataview", moduleName);
1462        log.trace("save user properties: module.metadataview={}", moduleName);
1463
1464        moduleName = moduleListTableView.elementAt(0);
1465        if ((moduleName != null) && (moduleName.length() > 0)) setValue("module.tableview", moduleName);
1466        log.trace("save user properties: module.tableview={}", moduleName);
1467
1468        moduleName = moduleListImageView.elementAt(0);
1469        if ((moduleName != null) && (moduleName.length() > 0)) setValue("module.imageview", moduleName);
1470        log.trace("save user properties: module.imageview={}", moduleName);
1471
1472        moduleName = moduleListPaletteView.elementAt(0);
1473        if ((moduleName != null) && (moduleName.length() > 0)) setValue("module.paletteview", moduleName);
1474        log.trace("save user properties: module.paletteview={}", moduleName);
1475
1476        // save the current supported fileformat
1477        log.trace("save user properties: supported fileformat");
1478        Enumeration<?> keys = FileFormat.getFileFormatKeys();
1479        String theKey = null;
1480        while (keys.hasMoreElements()) {
1481            theKey = (String) keys.nextElement();
1482            FileFormat theformat = FileFormat.getFileFormat(theKey);
1483            setValue("module.fileformat." + theKey, theformat.getClass().getName());
1484        }
1485
1486        super.save();
1487        log.trace("save user properties: end");
1488    }
1489
1490    /** @return the name of the user property file */
1491    public static String getPropertyFile() {
1492        return propertyFile;
1493    }
1494
1495    /** @return the default work directory, where the open file starts. */
1496    public static String getWorkDir() {
1497        String workPath = workDir;
1498        log.trace("getWorkDir: workDir={}", workDir);
1499        if (workPath == null) {
1500            workPath = System.getProperty("hdfview.workdir");
1501            log.trace("getWorkDir: hdfview.workdir={}", workPath);
1502            if (workPath == null) {
1503                workPath = System.getProperty("user.home");
1504            }
1505        }
1506        log.trace("getWorkDir: final workPath={}", workPath);
1507        return workPath;
1508    }
1509
1510    /** @return the maximum number of the most recent file */
1511    public static int getMaxRecentFiles() {
1512        return MAX_RECENT_FILES;
1513    }
1514
1515    /** @return the path of the HDFView users guide */
1516    public static String getUsersGuide() {
1517        return usersGuide;
1518    };
1519
1520    /** @return the delimiter of data values */
1521    public static String getDataDelimiter() {
1522        return delimiter;
1523    }
1524
1525    /** @return the image origin */
1526    public static String getImageOrigin() {
1527        return origin;
1528    }
1529
1530    /** @return the default index type for display */
1531    public static String getIndexType() {
1532        return indexType;
1533    }
1534
1535    /** @return the default index order for display */
1536    public static String getIndexOrder() {
1537        return indexOrder;
1538    }
1539
1540    /** @return the font size */
1541    public static int getFontSize() {
1542        return fontSize;
1543    }
1544
1545    /** @return the font type */
1546    public static String getFontType() {
1547        return fontType;
1548    }
1549
1550    /** @return the file extensions of supported file formats */
1551    public static String getFileExtension() {
1552        return fileExt;
1553    }
1554
1555    /** sets the font size
1556     *
1557     * @param fsize
1558     *            the font size
1559     */
1560    public static void setFontSize(int fsize) {
1561        fontSize = (fsize / 2) * 2;
1562
1563        if (fontSize < 8) {
1564            fontSize = 8;
1565        }
1566    }
1567
1568    /** sets the font type
1569     *
1570     * @param ftype
1571     *            the font type
1572     */
1573    public static void setFontType(String ftype) {
1574        if (ftype != null) {
1575            fontType = ftype.trim();
1576        }
1577    }
1578
1579    /** @return the path of the H5toH5 converter */
1580    public static String getH4toH5() {
1581        return h4toh5;
1582    }
1583
1584    /** @return the list of most recent files */
1585    public static Vector<String> getMRF() {
1586        return recentFiles;
1587    }
1588
1589    /** @return the list of palette files */
1590    public static Vector<String> getPaletteList() {
1591        return paletteList;
1592    }
1593
1594    public static Vector<String[]> getSrbAccount() {
1595        return srbAccountList;
1596    }
1597
1598    /** @return a list of treeview modules */
1599    public static Vector<String> getTreeViewList() {
1600        return moduleListTreeView;
1601    }
1602
1603    /** @return a list of metadataview modules */
1604    public static Vector<String> getMetaDataViewList() {
1605        return moduleListMetaDataView;
1606    }
1607
1608    /** @return a list of tableview modules */
1609    public static Vector<String> getTableViewList() {
1610        return moduleListTableView;
1611    }
1612
1613    /** @return a list of imageview modules */
1614    public static Vector<String> getImageViewList() {
1615        return moduleListImageView;
1616    }
1617
1618    /** @return a list of paletteview modules */
1619    public static Vector<String> getPaletteViewList() {
1620        return moduleListPaletteView;
1621    }
1622
1623    /** @return a list of helpview modules */
1624    public static Vector<String> getHelpViewList() {
1625        return moduleListHelpView;
1626    }
1627
1628    /** set the path of H5View User's guide
1629     *
1630     * @param str
1631     *            the path
1632     */
1633    public static void setUsersGuide(String str) {
1634        if ((str == null) || (str.length() <= 0)) {
1635            return;
1636        }
1637        usersGuide = str;
1638    }
1639
1640    /** set the path of the H4 to H5 converter
1641     *
1642     * @param tool
1643     *            the path of the H4 to H5 converter
1644     */
1645    public static void setH4toH5(String tool) {
1646        h4toh5 = tool;
1647    }
1648
1649    /** set the path of the default work directory
1650     *
1651     * @param wDir
1652     *            the default work directory
1653     */
1654    public static void setWorkDir(String wDir) {
1655        log.trace("ViewProperties:setWorkDir wDir={}", wDir);
1656        workDir = wDir;
1657    }
1658
1659    /** set the file extension
1660     *
1661     * @param ext
1662     *            the file extension
1663     */
1664    public static void setFileExtension(String ext) {
1665        fileExt = ext;
1666    }
1667
1668    /** set the delimiter of data values
1669     *
1670     * @param delim
1671     *            the delimiter of data values
1672     */
1673    public static void setDataDelimiter(String delim) {
1674        delimiter = delim;
1675    }
1676
1677    /** set the image origin
1678     *
1679     * @param o
1680     *            the image origin
1681     */
1682    public static void setImageOrigin(String o) {
1683        origin = o;
1684    }
1685
1686    /** set the index type
1687     *
1688     * @param idxType
1689     *            the index type
1690     */
1691    public static void setIndexType(String idxType) {
1692        indexType = idxType;
1693    }
1694
1695    /** set the index order
1696     *
1697     * @param idxOrder
1698     *            the index order
1699     */
1700    public static void setIndexOrder(String idxOrder) {
1701        indexOrder = idxOrder;
1702    }
1703
1704    /**
1705     * Current Java applications such as HDFView cannot handle files with large
1706     * number of objects such as 1,000,000 objects. setMaxMembers() sets the
1707     * maximum number of objects that will be loaded into memory.
1708     *
1709     * @param n
1710     *            the maximum number of objects to load into memory
1711     */
1712    public static void setMaxMembers(int n) {
1713        max_members = n;
1714    }
1715
1716    /**
1717     * Current Java applications such as HDFView cannot handle files with large
1718     * number of objects such as 1,000,000 objects. setStartMember() sets the
1719     * starting index of objects that will be loaded into memory.
1720     *
1721     * @param idx
1722     *            the maximum number of objects to load into memory
1723     */
1724    public static void setStartMembers(int idx) {
1725        if (idx < 0) {
1726            idx = 0;
1727        }
1728
1729        start_members = idx;
1730    }
1731
1732    /**
1733     * Current Java applications such as HDFView cannot handle files with large
1734     * number of objects such as 1,000,000 objects. getMaxMembers() returns the
1735     * maximum number of objects that will be loaded into memory.
1736     *
1737     * @return the maximum members
1738     */
1739    public static int getMaxMembers() {
1740        if (max_members < 0)
1741            return Integer.MAX_VALUE; // load the whole file
1742
1743        return max_members;
1744    }
1745
1746    /**
1747     * Current Java applications such as HDFView cannot handle files with large
1748     * number of objects such as 1,000,000 objects. getStartMembers() returns the
1749     * starting index of objects that will be loaded into memory.
1750     *
1751     * @return the start members
1752     */
1753    public static int getStartMembers() {
1754        return start_members;
1755    }
1756
1757    /**
1758     * Returns true if auto contrast is used in image processing.
1759     *
1760     * @return true if auto contrast is used in image processing; otherwise,
1761     *         returns false.
1762     */
1763    public static boolean isAutoContrast() {
1764        return isAutoContrast;
1765    }
1766
1767    /**
1768     * Returns true if "show image values" is set.
1769     *
1770     * @return true if "show image values" is set; otherwise, returns false.
1771     */
1772    public static boolean showImageValues() {
1773        return showImageValues;
1774    }
1775
1776    /**
1777     * Set the flag to indicate if auto contrast is used in image process.
1778     *
1779     * @param b
1780     *            the flag to indicate if auto contrast is used in image
1781     *            process.
1782     */
1783    public static void setAutoContrast(boolean b) {
1784        isAutoContrast = b;
1785    }
1786
1787    /**
1788     * Set the flag to indicate if "show image values" is set.
1789     *
1790     * @param b
1791     *            the flag to indicate if if "show image values" is set.
1792     */
1793    public static void setShowImageValue(boolean b) {
1794        showImageValues = b;
1795    }
1796
1797    /**
1798     * Returns true if default file access is read only.
1799     *
1800     * @return true if default file access is read only; otherwise, returns
1801     *         false.
1802     */
1803    public static boolean isReadOnly() {
1804        return isReadOnly;
1805    }
1806
1807    /**
1808     * Set the flag to indicate if default file access is read only.
1809     *
1810     * @param b
1811     *            the flag to indicate if default file access is read only.
1812     */
1813    public static void setReadOnly(boolean b) {
1814        isReadOnly = b;
1815    }
1816
1817    /**
1818     * Returns value of default lib version for the earliest.
1819     *
1820     * @return value of default lib version for the earliest.
1821     */
1822    public static String getEarlyLib() {
1823        return EarlyLib;
1824    }
1825
1826    /**
1827     * Set the value of default lib version for the earliest.
1828     *
1829     * @param vers
1830     *            the value of default lib version for the earliest.
1831     */
1832    public static void setEarlyLib(String vers) {
1833        EarlyLib = vers;
1834    }
1835
1836    /**
1837     * Returns value of default lib version for the latest.
1838     *
1839     * @return value of default lib version for the latest.
1840     */
1841    public static String getLateLib() {
1842        return LateLib;
1843    }
1844
1845    /**
1846     * Set the value of default lib version for the latest.
1847     *
1848     * @param vers
1849     *            the value of default lib version for the latest.
1850     */
1851    public static void setLateLib(String vers) {
1852        LateLib = vers;
1853    }
1854
1855    /**
1856     * @return the convertEnum
1857     */
1858    public static boolean isConvertEnum() {
1859        return convertEnum;
1860    }
1861
1862    /**
1863     * Returns true if "show regref values" is set.
1864     *
1865     * @return true if "show regref values" is set; otherwise, returns false.
1866     */
1867    public static boolean showRegRefValues() {
1868        return showRegRefValues;
1869    }
1870
1871    /**
1872     * @return the isIndexBase1
1873     */
1874    public static boolean isIndexBase1() {
1875        return isIndexBase1;
1876    }
1877
1878    /**
1879     * @param convertEnum
1880     *            the convertEnum to set
1881     */
1882    public static void setConvertEnum(boolean convertEnum) {
1883        ViewProperties.convertEnum = convertEnum;
1884    }
1885
1886    /**
1887     * Set the flag to indicate if "show RegRef values" is set.
1888     *
1889     * @param b
1890     *            the flag to indicate if if "show RegRef values" is set.
1891     */
1892    public static void setShowRegRefValue(boolean b) {
1893        showRegRefValues = b;
1894    }
1895
1896    /**
1897     * Set the flag to indicate if IndexBase should start at 1.
1898     *
1899     * @param b
1900     *            the flag to indicate if IndexBase should start at 1.
1901     */
1902    public static void setIndexBase1(boolean b) {
1903        ViewProperties.isIndexBase1 = b;
1904    }
1905
1906    /**
1907     * Sets the list of most recently accessed files.
1908     *
1909     * @param recentFilesList
1910     *               The list of most recently accessed files.
1911     */
1912    public static void setRecentFiles(Vector<String> recentFilesList) {
1913        recentFiles = recentFilesList;
1914    }
1915}