001    /*
002     * This file is part of McIDAS-V
003     *
004     * Copyright 2007-2013
005     * Space Science and Engineering Center (SSEC)
006     * University of Wisconsin - Madison
007     * 1225 W. Dayton Street, Madison, WI 53706, USA
008     * https://www.ssec.wisc.edu/mcidas
009     * 
010     * All Rights Reserved
011     * 
012     * McIDAS-V is built on Unidata's IDV and SSEC's VisAD libraries, and
013     * some McIDAS-V source code is based on IDV and VisAD source code.  
014     * 
015     * McIDAS-V is free software; you can redistribute it and/or modify
016     * it under the terms of the GNU Lesser Public License as published by
017     * the Free Software Foundation; either version 3 of the License, or
018     * (at your option) any later version.
019     * 
020     * McIDAS-V is distributed in the hope that it will be useful,
021     * but WITHOUT ANY WARRANTY; without even the implied warranty of
022     * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
023     * GNU Lesser Public License for more details.
024     * 
025     * You should have received a copy of the GNU Lesser Public License
026     * along with this program.  If not, see http://www.gnu.org/licenses.
027     */
028    
029    package edu.wisc.ssec.mcidasv.chooser.adde;
030    
031    import static javax.swing.GroupLayout.DEFAULT_SIZE;
032    import static javax.swing.GroupLayout.PREFERRED_SIZE;
033    import static javax.swing.GroupLayout.Alignment.BASELINE;
034    import static javax.swing.GroupLayout.Alignment.LEADING;
035    import static javax.swing.LayoutStyle.ComponentPlacement.RELATED;
036    
037    import java.awt.event.ItemEvent;
038    import java.awt.event.ItemListener;
039    import java.util.Hashtable;
040    import java.util.List;
041    
042    import javax.swing.GroupLayout;
043    import javax.swing.JCheckBox;
044    import javax.swing.JComponent;
045    import javax.swing.JLabel;
046    import javax.swing.JPanel;
047    
048    import org.w3c.dom.Element;
049    
050    import edu.wisc.ssec.mcidas.AreaDirectory;
051    
052    import ucar.unidata.data.imagery.BandInfo;
053    import ucar.unidata.idv.chooser.IdvChooserManager;
054    import ucar.unidata.util.TwoFacedObject;
055    import ucar.unidata.xml.XmlObjectStore;
056    
057    import edu.wisc.ssec.mcidasv.Constants;
058    import edu.wisc.ssec.mcidasv.util.McVGuiUtils;
059    
060    
061    /**
062     * Widget to select images from a remote ADDE server
063     * Displays a list of the descriptors (names) of the image datasets
064     * available for a particular ADDE group on the remote server.
065     *
066     * @author Don Murray
067     */
068    public class AddeImageParameterChooser extends AddeImageChooser implements Constants {
069    
070        /**
071         * Public keys for server, group, dataset, user, project.
072         */
073        public final static String SIZE_KEY = "size";
074        public final static String BAND_KEY = "band";
075        public final static String PLACE_KEY = "place";
076        public final static String LATLON_KEY = "latlon";
077        public final static String LINELE_KEY = "linele";
078        public final static String MAG_KEY = "mag";
079        public final static String UNIT_KEY = "unit";
080        public final static String PREVIEW_KEY = "preview";
081        public final static String NAVIGATION_KEY = "navigation";
082    
083        /** Property for image default value unit */
084        protected static final String PROP_NAV = "NAV";
085    
086        /** Property for image default value unit */
087        protected static final String PROP_UNIT = "UNIT";
088    
089        /** Property for image default value band */
090        protected static final String PROP_BAND = "BAND";
091    
092        /** Xml attr name for the defaults */
093        private static final String ATTR_NAV = "NAV";
094        private static final String ATTR_UNIT = "UNIT";
095        private static final String ATTR_BAND = "BAND";
096        private static final String ATTR_PLACE = "PLACE";
097        private static final String ATTR_SIZE = "SIZE";
098        private static final String ATTR_MAG = "MAG";
099        private static final String ATTR_LATLON = "LATLON";
100        private static final String ATTR_LINELE = "LINELE";
101    
102        /** string for ALL */
103        private static final String ALL = "ALL";
104    
105        private static JCheckBox previewBox = null;
106    
107        /**
108         * Construct an Adde image selection widget
109         *
110         *
111         * @param mgr The chooser manager
112         * @param root The chooser.xml node
113         */
114        public AddeImageParameterChooser(IdvChooserManager mgr, Element root) {
115            super(mgr, root);
116            //DAVEP: Hiding parameter set picker for now... revisit after 1.0
117    //        showParameterButton();
118        }
119        
120        /**
121         * Return the parameter type associated with this chooser.  Override!
122         */
123        @Override
124        protected String getParameterSetType() {
125            return "addeimagery";
126        }
127        
128        /**
129         * Return the data source ID.  Used by extending classes.
130         */
131        @Override
132        protected String getDataSourceId() {
133            return "ADDE.IMAGE.V";
134        }
135        
136        /**
137         * Restore the selected parameter set using element attributes
138         * 
139         * @param restoreElement
140         * @return
141         */
142        @Override
143        protected boolean restoreParameterSet(Element restoreElement) {
144            boolean okay = super.restoreParameterSet(restoreElement);
145            if (!okay) return okay;
146            
147            // Imagery specific restore
148            
149            // Restore nav
150            if (restoreElement.hasAttribute(ATTR_NAV)) {
151                String nav = restoreElement.getAttribute(ATTR_NAV);
152                TwoFacedObject tfo = new TwoFacedObject("Default", "X");
153                navComboBox.setSelectedItem((Object)tfo);
154                if (nav.toUpperCase().equals("LALO")) {
155                    tfo = new TwoFacedObject("Lat/Lon", "LALO");
156                }
157                navComboBox.setSelectedItem((Object)tfo);
158            }
159            return true;
160        }
161        
162        /**
163         * Get the list of BandInfos for the current selected images
164         * @return list of BandInfos
165         */
166        public List<BandInfo> getSelectedBandInfos() {
167            return super.getBandInfos();
168        }
169    
170        /**
171         * Get the value for the given property. This can either be the value
172         * supplied by the end user through the advanced GUI or is the default
173         *
174         * @param prop The property
175         * @param ad The AreaDirectory
176         *
177         * @return The value of the property to use in the request string
178         */
179        @Override
180        protected String getPropValue(String prop, AreaDirectory ad) {
181            String propValue = super.getPropValue(prop, ad);
182            if (prop.equals(PROP_NAV)) {
183                propValue = TwoFacedObject.getIdString(navComboBox.getSelectedItem());
184            }
185            return propValue;
186        }
187        
188        /**
189         * Optionally override any defaults per parameter chooser
190         * @param property
191         * @return
192         */
193        @Override
194        protected String getDefault(String property, String dflt) {
195            String paramDefault = super.getDefault(property, dflt);
196            if (property.equals(PROP_NAV)) {
197                if (restoreElement != null) {
198                    paramDefault = restoreElement.getAttribute(ATTR_NAV);
199                }
200            } else if (property.equals(PROP_UNIT)) {
201                paramDefault = "";
202            } else if (property.equals(PROP_BAND)) {
203                paramDefault = ALL;
204            } else if (property.equals(PROP_PLACE)) {
205                paramDefault = "";
206            }
207            return paramDefault;
208        }
209        
210        /**
211         * Get the DataSource properties
212         * 
213         * @param ht
214         *            Hashtable of properties
215         */
216        @Override
217        protected void getDataSourceProperties(Hashtable ht) {
218            super.getDataSourceProperties(ht);
219            if (restoreElement != null) {
220                if (restoreElement.hasAttribute(ATTR_BAND)) {
221                    ht.put(BAND_KEY, (Object)(restoreElement.getAttribute(ATTR_BAND)));
222                }
223                if (restoreElement.hasAttribute(ATTR_LATLON)) {
224                    ht.put(LATLON_KEY, (Object)(restoreElement.getAttribute(ATTR_LATLON)));
225                }
226                if (restoreElement.hasAttribute(ATTR_LINELE)) {
227                    ht.put(LINELE_KEY, (Object)(restoreElement.getAttribute(ATTR_LINELE)));
228                }
229                if (restoreElement.hasAttribute(ATTR_MAG)) {
230                    ht.put(MAG_KEY, (Object)(restoreElement.getAttribute(ATTR_MAG)));
231                }
232                if (restoreElement.hasAttribute(ATTR_PLACE)) {
233                    ht.put(PLACE_KEY, (Object)(restoreElement.getAttribute(ATTR_PLACE)));
234                }
235                if (restoreElement.hasAttribute(ATTR_SIZE)) {
236                    ht.put(SIZE_KEY, (Object)(restoreElement.getAttribute(ATTR_SIZE)));
237                }
238                if (restoreElement.hasAttribute(ATTR_UNIT)) {
239                    ht.put(UNIT_KEY, (Object)(restoreElement.getAttribute(ATTR_UNIT)));
240                }
241            } else {
242                ht.put(NAVIGATION_KEY, (Object)getPropValue(PROP_NAV, null));
243            }
244            ht.put(PREVIEW_KEY, (Object)previewBox.isSelected());
245        }
246        
247        /**
248         * Should we use the user supplied property
249         * 
250         * @param propId
251         *            The property
252         * 
253         * @return Should use the value from the advanced widget
254         */
255        protected boolean usePropFromUser(String propId) {
256            boolean fromSuper = super.usePropFromUser(propId);
257            if (propId.equals(PROP_UNIT)) fromSuper = false;
258            else if (propId.equals(PROP_BAND)) fromSuper = false;
259            return fromSuper;
260        }
261        
262        /**
263         * Make the UI for this selector.
264         *
265         * @return The gui
266         */
267        @Override
268        public JComponent doMakeContents() {
269            JPanel myPanel = new JPanel();
270    
271            JLabel timesLabel = McVGuiUtils.makeLabelRight("Times:");
272            addDescComp(timesLabel);
273    
274            JPanel timesPanel = makeTimesPanel();
275            timesPanel.setBorder(javax.swing.BorderFactory.createEtchedBorder());
276            addDescComp(timesPanel);
277    
278            JLabel navigationLabel = McVGuiUtils.makeLabelRight("Navigation:");
279            addDescComp(navigationLabel);
280    
281            // Use processPropertyComponents to build combo boxes that we rely on
282            processPropertyComponents();
283            addDescComp(navComboBox);
284            McVGuiUtils.setComponentWidth(navComboBox, McVGuiUtils.Width.DOUBLE);
285    
286            // Preview checkbox
287            JLabel previewLabel = McVGuiUtils.makeLabelRight("Preview:");
288            addDescComp(previewLabel);
289            XmlObjectStore store = getIdv().getStore();
290            previewBox = new JCheckBox("Create preview image", store.get(Constants.PREF_IMAGE_PREVIEW, true));
291            previewBox.setToolTipText("Creating preview images takes extra time and network bandwidth");
292            previewBox.addItemListener(new ItemListener() {
293                public void itemStateChanged(ItemEvent e) {
294                    XmlObjectStore store = getIdv().getStore();
295                    store.put(Constants.PREF_IMAGE_PREVIEW, e.getStateChange());
296                    store.save();
297                }
298            });
299            addDescComp(previewBox);
300    
301            GroupLayout layout = new GroupLayout(myPanel);
302            myPanel.setLayout(layout);
303            layout.setHorizontalGroup(
304                    layout.createParallelGroup(LEADING)
305                    .addGroup(layout.createSequentialGroup()
306                            .addGroup(layout.createParallelGroup(LEADING)
307                                    .addGroup(layout.createSequentialGroup()
308                                            .addComponent(descriptorLabel)
309                                            .addGap(GAP_RELATED)
310                                            .addComponent(descriptorComboBox))
311                                            .addGroup(layout.createSequentialGroup()
312                                                    .addComponent(timesLabel)
313                                                    .addGap(GAP_RELATED)
314                                                    .addComponent(timesPanel, PREFERRED_SIZE, DEFAULT_SIZE, Short.MAX_VALUE))
315                                                    .addGroup(layout.createSequentialGroup()
316                                                            .addComponent(navigationLabel)
317                                                            .addGap(GAP_RELATED)
318                                                            .addComponent(navComboBox))
319                                                            .addGroup(layout.createSequentialGroup()
320                                                                    .addComponent(previewLabel)
321                                                                    .addGap(GAP_RELATED)
322                                                                    .addComponent(previewBox))))
323            );
324            layout.setVerticalGroup(
325                    layout.createParallelGroup(LEADING)
326                    .addGroup(layout.createSequentialGroup()
327                            .addGroup(layout.createParallelGroup(BASELINE)
328                                    .addComponent(descriptorLabel)
329                                    .addComponent(descriptorComboBox))
330                                    .addPreferredGap(RELATED)
331                                    .addGroup(layout.createParallelGroup(LEADING)
332                                            .addComponent(timesLabel)
333                                            .addComponent(timesPanel, PREFERRED_SIZE, DEFAULT_SIZE, Short.MAX_VALUE))
334                                            .addPreferredGap(RELATED)
335                                            .addGroup(layout.createParallelGroup(LEADING)
336                                                    .addComponent(navigationLabel)
337                                                    .addComponent(navComboBox))
338                                                    .addGroup(layout.createParallelGroup(LEADING)
339                                                            .addComponent(previewLabel)
340                                                            .addComponent(previewBox)))
341            );
342            
343            setInnerPanel(myPanel);
344            return super.doMakeContents(true);
345        }
346    
347    }