001 /*
002 * $Id: AddeImageParameterChooser.java,v 1.14 2012/02/19 17:35:35 davep Exp $
003 *
004 * This file is part of McIDAS-V
005 *
006 * Copyright 2007-2012
007 * Space Science and Engineering Center (SSEC)
008 * University of Wisconsin - Madison
009 * 1225 W. Dayton Street, Madison, WI 53706, USA
010 * https://www.ssec.wisc.edu/mcidas
011 *
012 * All Rights Reserved
013 *
014 * McIDAS-V is built on Unidata's IDV and SSEC's VisAD libraries, and
015 * some McIDAS-V source code is based on IDV and VisAD source code.
016 *
017 * McIDAS-V is free software; you can redistribute it and/or modify
018 * it under the terms of the GNU Lesser Public License as published by
019 * the Free Software Foundation; either version 3 of the License, or
020 * (at your option) any later version.
021 *
022 * McIDAS-V is distributed in the hope that it will be useful,
023 * but WITHOUT ANY WARRANTY; without even the implied warranty of
024 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
025 * GNU Lesser Public License for more details.
026 *
027 * You should have received a copy of the GNU Lesser Public License
028 * along with this program. If not, see http://www.gnu.org/licenses.
029 */
030
031 package edu.wisc.ssec.mcidasv.chooser.adde;
032
033 import static javax.swing.GroupLayout.DEFAULT_SIZE;
034 import static javax.swing.GroupLayout.PREFERRED_SIZE;
035 import static javax.swing.GroupLayout.Alignment.BASELINE;
036 import static javax.swing.GroupLayout.Alignment.LEADING;
037 import static javax.swing.LayoutStyle.ComponentPlacement.RELATED;
038
039 import java.awt.event.ItemEvent;
040 import java.awt.event.ItemListener;
041 import java.util.Hashtable;
042 import java.util.List;
043
044 import javax.swing.GroupLayout;
045 import javax.swing.JCheckBox;
046 import javax.swing.JComponent;
047 import javax.swing.JLabel;
048 import javax.swing.JPanel;
049
050 import org.w3c.dom.Element;
051
052 import edu.wisc.ssec.mcidas.AreaDirectory;
053
054 import ucar.unidata.data.imagery.BandInfo;
055 import ucar.unidata.idv.chooser.IdvChooserManager;
056 import ucar.unidata.util.TwoFacedObject;
057 import ucar.unidata.xml.XmlObjectStore;
058
059 import edu.wisc.ssec.mcidasv.Constants;
060 import edu.wisc.ssec.mcidasv.util.McVGuiUtils;
061
062
063 /**
064 * Widget to select images from a remote ADDE server
065 * Displays a list of the descriptors (names) of the image datasets
066 * available for a particular ADDE group on the remote server.
067 *
068 * @author Don Murray
069 */
070 public class AddeImageParameterChooser extends AddeImageChooser implements Constants {
071
072 /**
073 * Public keys for server, group, dataset, user, project.
074 */
075 public final static String SIZE_KEY = "size";
076 public final static String BAND_KEY = "band";
077 public final static String PLACE_KEY = "place";
078 public final static String LATLON_KEY = "latlon";
079 public final static String LINELE_KEY = "linele";
080 public final static String MAG_KEY = "mag";
081 public final static String UNIT_KEY = "unit";
082 public final static String PREVIEW_KEY = "preview";
083
084 /** Property for image default value unit */
085 protected static final String PROP_NAV = "NAV";
086
087 /** Property for image default value unit */
088 protected static final String PROP_UNIT = "UNIT";
089
090 /** Property for image default value band */
091 protected static final String PROP_BAND = "BAND";
092
093 /** Xml attr name for the defaults */
094 private static final String ATTR_NAV = "NAV";
095 private static final String ATTR_UNIT = "UNIT";
096 private static final String ATTR_BAND = "BAND";
097 private static final String ATTR_PLACE = "PLACE";
098 private static final String ATTR_SIZE = "SIZE";
099 private static final String ATTR_MAG = "MAG";
100 private static final String ATTR_LATLON = "LATLON";
101 private static final String ATTR_LINELE = "LINELE";
102
103 /** string for ALL */
104 private static final String ALL = "ALL";
105
106 private static JCheckBox previewBox = null;
107
108 /**
109 * Construct an Adde image selection widget
110 *
111 *
112 * @param mgr The chooser manager
113 * @param root The chooser.xml node
114 */
115 public AddeImageParameterChooser(IdvChooserManager mgr, Element root) {
116 super(mgr, root);
117 //DAVEP: Hiding parameter set picker for now... revisit after 1.0
118 // showParameterButton();
119 }
120
121 /**
122 * Return the parameter type associated with this chooser. Override!
123 */
124 @Override
125 protected String getParameterSetType() {
126 return "addeimagery";
127 }
128
129 /**
130 * Return the data source ID. Used by extending classes.
131 */
132 @Override
133 protected String getDataSourceId() {
134 return "ADDE.IMAGE.V";
135 }
136
137 /**
138 * Restore the selected parameter set using element attributes
139 *
140 * @param restoreElement
141 * @return
142 */
143 @Override
144 protected boolean restoreParameterSet(Element restoreElement) {
145 boolean okay = super.restoreParameterSet(restoreElement);
146 if (!okay) return okay;
147
148 // Imagery specific restore
149
150 // Restore nav
151 if (restoreElement.hasAttribute(ATTR_NAV)) {
152 String nav = restoreElement.getAttribute(ATTR_NAV);
153 TwoFacedObject tfo = new TwoFacedObject("Default", "X");
154 navComboBox.setSelectedItem((Object)tfo);
155 if (nav.toUpperCase().equals("LALO")) {
156 tfo = new TwoFacedObject("Lat/Lon", "LALO");
157 }
158 navComboBox.setSelectedItem((Object)tfo);
159 }
160 return true;
161 }
162
163 /**
164 * Get the list of BandInfos for the current selected images
165 * @return list of BandInfos
166 */
167 public List<BandInfo> getSelectedBandInfos() {
168 return super.getBandInfos();
169 }
170
171 /**
172 * Get the value for the given property. This can either be the value
173 * supplied by the end user through the advanced GUI or is the default
174 *
175 * @param prop The property
176 * @param ad The AreaDirectory
177 *
178 * @return The value of the property to use in the request string
179 */
180 @Override
181 protected String getPropValue(String prop, AreaDirectory ad) {
182 String propValue = super.getPropValue(prop, ad);
183 if (prop.equals(PROP_NAV)) {
184 propValue = TwoFacedObject.getIdString(navComboBox.getSelectedItem());
185 }
186 return propValue;
187 }
188
189 /**
190 * Optionally override any defaults per parameter chooser
191 * @param property
192 * @return
193 */
194 @Override
195 protected String getDefault(String property, String dflt) {
196 String paramDefault = super.getDefault(property, dflt);
197 if (property.equals(PROP_NAV)) {
198 if (restoreElement != null) {
199 paramDefault = restoreElement.getAttribute(ATTR_NAV);
200 }
201 } else if (property.equals(PROP_UNIT)) {
202 paramDefault = "";
203 } else if (property.equals(PROP_BAND)) {
204 paramDefault = ALL;
205 } else if (property.equals(PROP_PLACE)) {
206 paramDefault = "";
207 }
208 return paramDefault;
209 }
210
211 /**
212 * Get the DataSource properties
213 *
214 * @param ht
215 * Hashtable of properties
216 */
217 @Override
218 protected void getDataSourceProperties(Hashtable ht) {
219 super.getDataSourceProperties(ht);
220 if (restoreElement != null) {
221 if (restoreElement.hasAttribute(ATTR_BAND)) {
222 ht.put(BAND_KEY, (Object)(restoreElement.getAttribute(ATTR_BAND)));
223 }
224 if (restoreElement.hasAttribute(ATTR_LATLON)) {
225 ht.put(LATLON_KEY, (Object)(restoreElement.getAttribute(ATTR_LATLON)));
226 }
227 if (restoreElement.hasAttribute(ATTR_LINELE)) {
228 ht.put(LINELE_KEY, (Object)(restoreElement.getAttribute(ATTR_LINELE)));
229 }
230 if (restoreElement.hasAttribute(ATTR_MAG)) {
231 ht.put(MAG_KEY, (Object)(restoreElement.getAttribute(ATTR_MAG)));
232 }
233 if (restoreElement.hasAttribute(ATTR_PLACE)) {
234 ht.put(PLACE_KEY, (Object)(restoreElement.getAttribute(ATTR_PLACE)));
235 }
236 if (restoreElement.hasAttribute(ATTR_SIZE)) {
237 ht.put(SIZE_KEY, (Object)(restoreElement.getAttribute(ATTR_SIZE)));
238 }
239 if (restoreElement.hasAttribute(ATTR_UNIT)) {
240 ht.put(UNIT_KEY, (Object)(restoreElement.getAttribute(ATTR_UNIT)));
241 }
242 }
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 }