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.util.ArrayList;
038 import java.util.Hashtable;
039 import java.util.List;
040
041 import javax.swing.GroupLayout;
042 import javax.swing.JComponent;
043 import javax.swing.JLabel;
044 import javax.swing.JPanel;
045
046 import org.w3c.dom.Element;
047
048 import ucar.unidata.data.AddeUtil;
049 import ucar.unidata.data.profiler.AddeProfilerDataSource;
050 import ucar.unidata.idv.chooser.IdvChooserManager;
051 import ucar.unidata.metdata.NamedStationTable;
052 import ucar.unidata.util.GuiUtils;
053 import ucar.unidata.util.Misc;
054 import ucar.unidata.util.TwoFacedObject;
055 import ucar.unidata.view.station.StationLocationMap;
056 import ucar.unidata.xml.XmlResourceCollection;
057
058 import edu.wisc.ssec.mcidasv.util.McVGuiUtils;
059
060 /**
061 * Selection widget for specifing data sources of
062 * NOAA National Profiler Network data.
063 * For selecting Profiler data source; user selects ADDE server,
064 * profiler station(s),
065 * and choice of data interval such as hourly or 6 minute.
066 *
067 * Metadata about the station (lat, lon. elevation)
068 * and about the request is made available by "get" methods.
069 *
070 * @author Unidata IDV Development Team
071 * @version $Revision$
072 */
073 public class AddeProfilerDataChooser extends AddePointDataChooser {
074
075 /** collection of station tables */
076 private XmlResourceCollection stationResources;
077
078 /**
079 * ctor
080 *
081 * @param mgr The chooser manager
082 * @param root The chooser.xml node
083 */
084 public AddeProfilerDataChooser(IdvChooserManager mgr, Element root) {
085 super(mgr, root);
086
087 descriptorsAllowPrefix = "PROF";
088
089 }
090
091 /**
092 * Tell the AddeChooser our name
093 *
094 * @return The name
095 */
096 public String getDataName() {
097 return "Profiler Data";
098 }
099
100 /**
101 * Get the descriptor widget label.
102 *
103 * @return label for the descriptor widget
104 */
105 public String getDescriptorLabel() {
106 return "Profiler Type";
107 }
108
109 /**
110 * Overwrite base class method to create the station map
111 * with the appropriate properties.
112 *
113 * @return The new station map
114 */
115 protected StationLocationMap createStationMap() {
116 return new StationLocationMap(true, (String) null, StationLocationMap.TEMPLATE_NAME) {
117 public void setDeclutter(boolean declutter) {
118 super.setDeclutter(declutter);
119 updateStatus();
120 }
121 };
122 }
123
124 /**
125 * Initialize the station map
126 *
127 * @param stationMap The station map to initialize
128 */
129 protected void initStationMap(StationLocationMap stationMap) {
130 super.initStationMap(stationMap);
131
132 // get station information from the xml file listed
133 if (stationResources == null) {
134 List resources =
135 Misc.newList(
136 "/ucar/unidata/idv/resources/stations/profilerstns.xml");
137 stationResources = new XmlResourceCollection("", resources);
138 }
139
140 // create an object to hold the station info
141 NamedStationTable stationTable =
142 NamedStationTable.createStationTable(stationResources.getRoot(0));
143
144
145 List listOfTables =
146 NamedStationTable.createStationTables(stationResources);
147 if (listOfTables.size() > 0) {
148 NamedStationTable profStations =
149 (NamedStationTable) listOfTables.get(0);
150 // Take this out if we only want to init stations
151 // when we connect to the server.
152 // each "value" is a full Station object, not the name string
153 stationMap.setStations(new ArrayList(profStations.values()));
154 } else {
155 //What to do if there are no stations
156 }
157 }
158
159 /**
160 * Get any extra key=value pairs that are appended to all requests.
161 *
162 * @param buff The buffer to append onto
163 */
164 protected void appendMiscKeyValues(StringBuffer buff) {
165 appendKeyValue(buff, PROP_POS, getDoRelativeTimes() ? "ALL" : "0");
166 super.appendMiscKeyValues(buff);
167 }
168
169 /**
170 * Override this to determine how to select sample
171 */
172 protected void appendTimesRequest(StringBuffer buf) {
173 appendKeyValue(buf, PROP_SELECT, "'IDA BLMM'");
174 }
175
176 /**
177 * Do we have times selected. Either we are doing absolute
178 * times and there are some selected in the list. Or we
179 * are doing relative times and we have done a connect to the
180 * server
181 *
182 * @return Do we have times
183 */
184 public boolean timesOk() {
185 if (usingStations() && (stationMap.getStations().size() > 0)
186 && (getSelectedStations().size() == 0)) {
187 return false;
188 }
189 return super.timesOk();
190 }
191
192 /**
193 * Get the selection event from the profiler data chooser
194 * and process it, creating a ADDE.PROFILER data source
195 *
196 */
197 public void doLoadInThread() {
198 showWaitCursor();
199 try {
200 List selectedStations = getSelectedStations();
201
202 // make properties Hashtable to hand some
203 // data selection metadata
204 // to the AddeProfilerDataSource where it helps process
205 // the data from the server into data format this IDV
206 // needs for this request.
207
208 Hashtable profilersourceHT = new Hashtable();
209
210 profilersourceHT.put(AddeProfilerDataSource.PROFILER_INT,
211 getRelBoxString());
212 profilersourceHT.put(AddeProfilerDataSource.PROFILER_DATAINT,
213 getDescriptor());
214 profilersourceHT.put(AddeProfilerDataSource.PROFILER_SERVER,
215 getServer());
216 profilersourceHT.put(AddeProfilerDataSource.PROFILER_TIMES,
217 getDayTimeSelectString());
218 profilersourceHT.put(AddeUtil.NUM_RELATIVE_TIMES,
219 getRelativeTimeIndices());
220 profilersourceHT.put(AddeUtil.RELATIVE_TIME_INCREMENT,
221 new Float(getRelativeTimeIncrement()));
222 profilersourceHT.put(AddeUtil.MISC_KEYWORDS,
223 getMiscKeywords());
224
225
226 //System.out.println(" pc time list "+getSelectedTimes());
227 //System.out.println
228 // (" pc data display interval "+getSelectedDataInterval());
229 //System.out.println
230 // (" pc data source interval "+getDataSourceInterval());
231
232 // hard-coded "ADDE.PROFILER" is in idv/resources/datasource.xml,
233 // which tells IDV to use code
234 // ucar.unidata.data.profiler.AddeProfilerDataSource
235 makeDataSource(selectedStations, "ADDE.PROFILER",
236 profilersourceHT);
237 saveServerState();
238 } catch (Exception excp) {
239 logException("Unable to open Profiler dataset", excp);
240 }
241 showNormalCursor();
242 }
243
244 /**
245 * Get the extra time widget, but built in a different way.
246 * Designed to be put into a GroupLayout
247 */
248 protected JComponent getExtraTimeComponent() {
249 TwoFacedObject[] intervals = {
250 new TwoFacedObject(AddeProfilerDataSource.PROFILER_6MIN, .2f),
251 new TwoFacedObject(AddeProfilerDataSource.PROFILER_12MIN, .1f),
252 new TwoFacedObject(AddeProfilerDataSource.PROFILER_30MIN, .5f),
253 new TwoFacedObject(AddeProfilerDataSource.PROFILER_1HR, 1f)
254 };
255
256 GuiUtils.setListData(relTimeIncBox, intervals);
257 if (relTimeIncBox.getItemCount()>=4) relTimeIncBox.setSelectedIndex(3);
258
259 return McVGuiUtils.makeLabeledComponent(relTimeIncLabel, relTimeIncBox, McVGuiUtils.Position.LEFT);
260 }
261
262 /**
263 * Make the UI for this selector.
264 *
265 * @return The gui
266 */
267 public JComponent doMakeContents() {
268 JPanel myPanel = new JPanel();
269
270 JLabel stationLabel = McVGuiUtils.makeLabelRight("Stations:");
271 addServerComp(stationLabel);
272
273 JComponent stationPanel = getStationMap();
274 registerStatusComp("stations", stationPanel);
275 addServerComp(stationPanel);
276
277 JLabel timesLabel = McVGuiUtils.makeLabelRight("Times:");
278 addDescComp(timesLabel);
279
280 JPanel timesPanel = makeTimesPanel();
281 timesPanel.setBorder(javax.swing.BorderFactory.createEtchedBorder());
282 addDescComp(timesPanel);
283
284 enableWidgets();
285 updateStatus();
286
287 GroupLayout layout = new GroupLayout(myPanel);
288 myPanel.setLayout(layout);
289 layout.setHorizontalGroup(
290 layout.createParallelGroup(LEADING)
291 .addGroup(layout.createSequentialGroup()
292 .addGroup(layout.createParallelGroup(LEADING)
293 .addGroup(layout.createSequentialGroup()
294 .addComponent(descriptorLabel)
295 .addGap(GAP_RELATED)
296 .addComponent(descriptorComboBox))
297 .addGroup(layout.createSequentialGroup()
298 .addComponent(stationLabel)
299 .addGap(GAP_RELATED)
300 .addComponent(stationPanel, PREFERRED_SIZE, DEFAULT_SIZE, Short.MAX_VALUE))
301 .addGroup(layout.createSequentialGroup()
302 .addComponent(timesLabel)
303 .addGap(GAP_RELATED)
304 .addComponent(timesPanel, PREFERRED_SIZE, DEFAULT_SIZE, Short.MAX_VALUE))))
305 );
306 layout.setVerticalGroup(
307 layout.createParallelGroup(LEADING)
308 .addGroup(layout.createSequentialGroup()
309 .addGroup(layout.createParallelGroup(BASELINE)
310 .addComponent(descriptorLabel)
311 .addComponent(descriptorComboBox))
312 .addPreferredGap(RELATED)
313 .addGroup(layout.createParallelGroup(LEADING)
314 .addComponent(stationLabel)
315 .addComponent(stationPanel, PREFERRED_SIZE, DEFAULT_SIZE, Short.MAX_VALUE))
316 .addPreferredGap(RELATED)
317 .addGroup(layout.createParallelGroup(LEADING)
318 .addComponent(timesLabel)
319 .addComponent(timesPanel, PREFERRED_SIZE, DEFAULT_SIZE, Short.MAX_VALUE))
320 .addPreferredGap(RELATED))
321 );
322
323 setInnerPanel(myPanel);
324 return super.doMakeContents(true);
325 }
326
327 }
328