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;
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.GroupLayout.Alignment.TRAILING;
036 import static javax.swing.LayoutStyle.ComponentPlacement.RELATED;
037 import static javax.swing.LayoutStyle.ComponentPlacement.UNRELATED;
038
039 import java.awt.Component;
040 import java.awt.event.ActionEvent;
041 import java.awt.event.ActionListener;
042 import java.awt.event.ItemEvent;
043 import java.awt.event.ItemListener;
044 import java.io.IOException;
045 import java.net.URI;
046 import java.util.ArrayList;
047 import java.util.Date;
048 import java.util.Hashtable;
049 import java.util.List;
050 import java.util.Vector;
051
052 import javax.swing.GroupLayout;
053 import javax.swing.JButton;
054 import javax.swing.JComboBox;
055 import javax.swing.JComponent;
056 import javax.swing.JLabel;
057 import javax.swing.JPanel;
058 import javax.swing.JTabbedPane;
059
060 import org.jdom2.Document;
061 import org.jdom2.JDOMException;
062 import org.jdom2.Namespace;
063 import org.jdom2.input.SAXBuilder;
064 import org.w3c.dom.Element;
065
066 import thredds.catalog.XMLEntityResolver;
067 import ucar.unidata.data.radar.TDSRadarDatasetCollection;
068 import ucar.nc2.units.DateUnit;
069 import ucar.unidata.data.radar.RadarQuery;
070 import ucar.unidata.geoloc.StationImpl;
071 import ucar.unidata.idv.chooser.IdvChooserManager;
072 import ucar.unidata.idv.chooser.TimesChooser;
073 import ucar.unidata.metdata.NamedStation;
074 import ucar.unidata.metdata.NamedStationImpl;
075 import ucar.unidata.util.DateSelection;
076 import ucar.unidata.util.DateUtil;
077 import ucar.unidata.util.DatedThing;
078 import ucar.unidata.util.GuiUtils;
079 import ucar.unidata.util.LogUtil;
080 import ucar.unidata.util.Misc;
081 import ucar.unidata.util.PreferenceList;
082 import ucar.unidata.util.Product;
083 import ucar.unidata.util.TwoFacedObject;
084
085 import visad.CommonUnit;
086 import visad.DateTime;
087
088 import edu.wisc.ssec.mcidasv.Constants;
089 import edu.wisc.ssec.mcidasv.util.McVGuiUtils;
090 import edu.wisc.ssec.mcidasv.util.McVGuiUtils.Position;
091 import edu.wisc.ssec.mcidasv.util.McVGuiUtils.TextColor;
092 import edu.wisc.ssec.mcidasv.util.McVGuiUtils.Width;
093
094
095 /**
096 * Created by IntelliJ IDEA.
097 * User: yuanho
098 * Date: Jan 16, 2008
099 * Time: 11:17:51 AM
100 * To change this template use File | Settings | File Templates.
101 */
102 public class TDSRadarChooser extends TimesChooser implements Constants {
103
104 /** The collection */
105 private TDSRadarDatasetCollection collection;
106
107
108 /** The currently selected station */
109 private NamedStation selectedStation;
110
111 /** The currently selected level3 product */
112 private String selectedProduct;
113
114 /** Those urls we connect to */
115 //"http://motherlode.ucar.edu:8080/thredds/radarServer/catalog.xml";
116 private String serverUrl;
117
118 /** Each dataset collection URL */
119 //"http://motherlode.ucar.edu:8080/thredds/radarServer/level2/idd/dataset.xml";
120 //private String collectionUrl;
121
122 /** Component to hold collections */
123 private JComboBox collectionSelector;
124
125 /** Component to hold product list */
126 private JComboBox productComboBox;
127
128 /** Level 3 panel that can be hidden */
129 private JPanel productPanel;
130
131 /** components that need a server for activation */
132 private List compsThatNeedServer = new ArrayList();
133
134 /** components that need a server for activation */
135 private List level3CompsThatNeedServer = new ArrayList();
136
137 /** persistent holder for catalog URLS */
138 private PreferenceList urlListHandler;
139
140 /** catalog URL holder */
141 private JComboBox urlBox;
142
143 /** ok flag */
144 private boolean okToDoUrlListEvents = true;
145
146 /** dataset list */
147 private List datasetList;
148
149 /** Command for connecting */
150 protected static final String CMD_CONNECT = "cmd.connect";
151
152 /** _more_ */
153 private boolean isLevel3;
154
155 /** _more_ */
156 public static final String[] level3_ExName = { "NVW", "DPA" };
157
158
159 /**
160 * Create the RadarChooser
161 *
162 * @param mgr The <code>IdvChooserManager</code>
163 * @param root The xml root that defines this chooser
164 *
165 */
166 public TDSRadarChooser(IdvChooserManager mgr, Element root) {
167 super(mgr, root);
168
169 loadButton = McVGuiUtils.makeImageTextButton(ICON_ACCEPT_SMALL, getLoadCommandName());
170 loadButton.setActionCommand(getLoadCommandName());
171 loadButton.addActionListener(this);
172
173 cancelButton = McVGuiUtils.makeImageButton(ICON_CANCEL, "Cancel");
174 cancelButton.setActionCommand(GuiUtils.CMD_CANCEL);
175 cancelButton.addActionListener(this);
176 cancelButton.setEnabled(false);
177
178 }
179
180
181
182 /**
183 * Handle the update event. Just pass it through to the imageChooser
184 */
185 public void doUpdate() {
186 if ((serverUrl == null) || (datasetList == null)
187 || (datasetList.size() == 0) || (selectedProduct == null)) {
188 if (urlBox != null) {
189 setServer((String) urlBox.getSelectedItem());
190 }
191 return;
192 }
193 Misc.run(this, "stationOrProductChanged");
194 }
195
196
197
198 /**
199 * Update the status of the gui
200 */
201 protected void updateStatus() {
202 super.updateStatus();
203 if (serverUrl == null) {
204 setHaveData(false);
205 setStatus("Please connect to the server");
206 }
207 else if (selectedStation == null) {
208 setHaveData(false);
209 setStatus("Please select a station", "stations");
210 }
211 else if (isLevel3 && (selectedProduct == null)) {
212 setHaveData(false);
213 setStatus("Please select a level 3 product", "products");
214 }
215 else {
216 boolean haveTimesSelected;
217 if (getDoAbsoluteTimes()) {
218 haveTimesSelected = getSelectedAbsoluteTimes().size() > 0;
219 } else {
220 haveTimesSelected = true;
221 }
222 setHaveData(haveTimesSelected);
223 if (haveTimesSelected) {
224 setStatus("Press \"" + CMD_LOAD + "\" to load the selected radar data", "buttons");
225 } else {
226 setStatus("Please select times", "timepanel");
227 }
228 }
229 GuiUtils.enableTree(loadButton, getHaveData());
230 }
231
232
233
234 /**
235 * Handle when there are newly selected stations
236 *
237 * @param stations list of newly selected stations
238 */
239 protected void newSelectedStations(List stations) {
240 super.newSelectedStations(stations);
241 if ((stations == null) || (stations.size() == 0)) {
242 selectedStation = null;
243 } else {
244 NamedStation newStation = (NamedStation) stations.get(0);
245 if (Misc.equals(newStation, selectedStation)) {
246 return;
247 }
248 selectedStation = newStation;
249 }
250 Misc.run(TDSRadarChooser.this, "stationOrProductChanged");
251 }
252
253
254 /** A widget for the list of dataset descriptors */
255
256
257 /** Flag to keep from infinite looping */
258 private boolean ignoreProductChange = false;
259
260 /** Selection label text */
261 protected static final String LABEL_SELECT = " -- Select -- ";
262
263 /**
264 * _more_
265 */
266 protected void productChanged() {
267 stationOrProductChanged();
268 // updateStatus();
269 }
270
271 /**
272 * Reset the descriptor stuff
273 */
274 private void resetProductBox() {
275 ignoreProductChange = true;
276 productComboBox.setSelectedItem(LABEL_SELECT);
277 ignoreProductChange = false;
278 }
279
280 /**
281 * Should we update on first display
282 *
283 * @return true
284 */
285 protected boolean shouldDoUpdateOnFirstDisplay() {
286 return false;
287 }
288
289 /**
290 * Set the server
291 *
292 * @param s the server URL
293 */
294 private void setServer(String s) {
295 datasetList = new ArrayList();
296 serverUrl = s;
297 try {
298 List collections = getRadarCollections(serverUrl);
299 GuiUtils.setListData(collectionSelector, collections);
300 } catch (Exception e) {
301 GuiUtils.setListData(collectionSelector, new ArrayList());
302 }
303 }
304
305 /**
306 * Set the active collection
307 *
308 * @param s collection URL
309 */
310 private void setCollection(String s) {
311 isLevel3 = false;
312 GuiUtils.enableComponents(level3CompsThatNeedServer, false);
313 productPanel.setVisible(false);
314 GuiUtils.enableComponents(compsThatNeedServer, true);
315 setAbsoluteTimes(new ArrayList());
316 selectedProduct = null;
317 selectedStation = null;
318 Misc.run(this, "initializeCollection", s);
319 }
320
321 /**
322 * _more_
323 *
324 * @param s _more_
325 */
326 private void setLevel3Collection(String s) {
327 isLevel3 = true;
328 GuiUtils.enableComponents(level3CompsThatNeedServer, true);
329 productPanel.setVisible(true);
330 GuiUtils.enableComponents(compsThatNeedServer, true);
331 setAbsoluteTimes(new ArrayList());
332 selectedProduct = null;
333 selectedStation = null;
334 Misc.run(this, "initializeLevel3Collection", s);
335 }
336
337 /**
338 * Add a component that needs to have a valid server
339 *
340 * @param comp the component
341 *
342 * @return the component
343 */
344 protected JComponent addServerComp(JComponent comp) {
345 compsThatNeedServer.add(comp);
346 return comp;
347 }
348
349 /**
350 * Add a component that needs to have a valid server
351 *
352 * @param comp the component
353 *
354 * @return the component
355 */
356 protected JComponent addLevel3ServerComp(JComponent comp) {
357 level3CompsThatNeedServer.add(comp);
358 return comp;
359 }
360
361 /**
362 * Get the radar collections for the given server URL
363 *
364 * @param radarServerURL server URL
365 *
366 * @return a map of the collection names to URL
367 */
368 private List getRadarCollections(String radarServerURL) {
369 SAXBuilder builder;
370 Document doc = null;
371 XMLEntityResolver jaxp = new XMLEntityResolver(true);
372 builder = jaxp.getSAXBuilder();
373 List collections = new ArrayList();
374
375 try {
376 doc = builder.build(radarServerURL);
377 } catch (JDOMException e) {
378 userMessage("Invalid catalog");
379 //e.printStackTrace();
380 } catch (IOException e) {
381 userMessage("Unable to open catalog");
382 //e.printStackTrace();
383 }
384
385 org.jdom2.Element rootElem = doc.getRootElement();
386 org.jdom2.Element serviceElem = readElements(rootElem, "service");
387 String uriBase = serviceElem.getAttributeValue("base");
388 org.jdom2.Element dsElem = readElements(rootElem, "dataset");
389 String naming = "catalogRef";
390 Namespace nss = rootElem.getNamespace("xlink");
391 List children = dsElem.getChildren();
392 for (int j = 0; j < children.size(); j++) {
393 org.jdom2.Element child = (org.jdom2.Element) children.get(j);
394 String childName = child.getName();
395 if (childName.equals(naming)) {
396 //String id = child.getAttributeValue("ID");
397 String desc = child.getAttributeValue("title", nss);
398 String urlpath = child.getAttributeValue("href", nss);
399 String[] c = radarServerURL.split(uriBase); //.replaceFirst("catalog.xml", "");
400 String ul = c[0] + uriBase + urlpath;
401 TwoFacedObject twoObj = new TwoFacedObject(desc, ul);
402 collections.add(twoObj);
403 //collections.put(desc, ul);
404 }
405
406 }
407
408 return collections;
409 }
410
411 /**
412 * Read the elements
413 *
414 * @param elem element
415 * @param eleName element name
416 *
417 * @return an element
418 */
419 public org.jdom2.Element readElements(org.jdom2.Element elem,
420 String eleName) {
421 List children = elem.getChildren();
422 for (int j = 0; j < children.size(); j++) {
423 org.jdom2.Element child = (org.jdom2.Element) children.get(j);
424 String childName = child.getName();
425 if (childName.equals(eleName)) {
426 return child;
427 }
428 }
429 return null;
430 }
431
432 /**
433 * Make the collection. If there is an error, pop up a user message.
434 *
435 * @param url URL for the collection
436 */
437 public void initializeCollection(String url) {
438
439 List<NamedStationImpl> stations = new ArrayList<NamedStationImpl>();
440 try {
441 StringBuffer errlog = new StringBuffer();
442 try {
443 collection = TDSRadarDatasetCollection.factory("test", url,
444 errlog);
445 } catch (Exception exc) {
446 userMessage("Invalid catalog");
447
448 return;
449 }
450 List tdsStations = collection.getRadarStations();
451 for (int i = 0; i < tdsStations.size(); i++) {
452 StationImpl stn = (StationImpl) tdsStations.get(i);
453 // thredds.catalog.query.Location loc = stn.getLocation();
454 //TODO: need better station need to switch lat lon
455 NamedStationImpl station =
456 new NamedStationImpl(stn.getName(), stn.getName(),
457 stn.getLatitude(),
458 stn.getLongitude(),
459 stn.getAltitude(), CommonUnit.meter);
460 stations.add(station);
461
462 }
463
464 getStationMap().setStations(stations);
465 } catch (Exception exc) {
466 userMessage("Unable to load stations");
467 return;
468 }
469 urlListHandler.saveState(urlBox);
470 }
471
472 /**
473 * _more_
474 *
475 * @param url _more_
476 */
477 public void initializeLevel3Collection(String url) {
478
479 List<NamedStationImpl> stations = new ArrayList<NamedStationImpl>();
480 List<Product> products;
481 List<String> exProducts = new ArrayList<String>();
482
483 for(String ename: level3_ExName){
484 exProducts.add(ename);
485 }
486
487 try {
488 StringBuffer errlog = new StringBuffer();
489 try {
490 collection = TDSRadarDatasetCollection.factory("test", url,
491 errlog);
492 } catch (Exception exc) {
493 userMessage("Invalid catalog");
494 return;
495 }
496 products = collection.getRadarProducts();
497 List tdsStations = collection.getRadarStations();
498 for (int i = 0; i < tdsStations.size(); i++) {
499 StationImpl stn = (StationImpl) tdsStations.get(i);
500 // thredds.catalog.query.Location loc = stn.getLocation();
501 //TODO: need better station need to switch lat lon
502 NamedStationImpl station =
503 new NamedStationImpl(stn.getName(), stn.getName(),
504 stn.getLatitude(),
505 stn.getLongitude(),
506 stn.getAltitude(), CommonUnit.meter);
507 stations.add(station);
508
509 }
510 List<TwoFacedObject> productNames = new ArrayList();
511 for (Product product : products) {
512 // if ( !product.getID().contains("DPA")
513 // && !product.getID().contains("NVW")) {
514 if ( !exProducts.contains(product.getID())) {
515 String lable = product.getName() + " (" + product.getID()
516 + ")";
517 TwoFacedObject twoObj = new TwoFacedObject(lable,
518 product.getID());
519 productNames.add(twoObj);
520 }
521 }
522 GuiUtils.setListData(productComboBox, productNames);
523
524 // GuiUtils.setListData(dataTypeComboBox, dataTypes);
525 getStationMap().setStations(stations);
526 } catch (Exception exc) {
527 userMessage("Unable to load stations");
528 return;
529 }
530 urlListHandler.saveState(urlBox);
531 }
532
533
534 /**
535 * Handle when the user has selected a new station
536 */
537 public void stationOrProductChanged() {
538 Vector times = new Vector();
539 setHaveData(false);
540 if ((!isLevel3 && selectedStation != null) ||
541 (isLevel3 && selectedStation != null && selectedProduct != null)) {
542 List timeSpan = collection.getRadarTimeSpan();
543 Date fromDate = DateUnit.getStandardOrISO((String) timeSpan.get(0));
544 //Date toDate = DateUnit.getStandardOrISO((String) timeSpan.get(1));
545 Date toDate = new Date(System.currentTimeMillis()
546 + DateUtil.daysToMillis(1));
547 //Go back 10 years (or so)
548 //Date fromDate = new Date(System.currentTimeMillis()
549 // - DateUtil.daysToMillis(365 * 10));
550 try {
551 showWaitCursor();
552 setAbsoluteTimes(new ArrayList());
553 setStatus("Reading times for station: " + selectedStation,
554 "");
555 // LogUtil.message("Reading times for station: "
556 // + selectedStation);
557 String pid = null;
558 if(isLevel3)
559 pid = TwoFacedObject.getIdString(
560 productComboBox.getSelectedItem());
561 List allTimes =
562 collection.getRadarStationTimes(selectedStation.getID(),
563 pid, fromDate, toDate);
564
565 // if(allTimes.size() == 0) {
566 // toDate = new Date(System.currentTimeMillis()
567 // + DateUtil.daysToMillis(1));
568 // allTimes =
569 // collection.getRadarStationTimes(selectedStation.getID(),
570 // pid, fromDate, toDate);
571 // }
572
573 for (int timeIdx = 0; timeIdx < allTimes.size(); timeIdx++) {
574 Object timeObj = allTimes.get(timeIdx);
575 Date date;
576 if (timeObj instanceof Date) {
577 date = (Date) timeObj;
578 } else {
579 date = DateUnit.getStandardOrISO(timeObj.toString());
580 }
581 times.add(new DateTime(date));
582 }
583 // LogUtil.message("");
584 showNormalCursor();
585 } catch (Exception exc) {
586 userMessage("Error reading times for station: "
587 + selectedStation);
588 //logException("Getting times for station: " + selectedStation,
589 // exc);
590 setStatus("Select a different collection", "collections");
591 showNormalCursor();
592 return;
593 }
594 }
595 setAbsoluteTimes(times);
596 updateStatus();
597 }
598
599
600
601
602
603 /**
604 * Load the data
605 */
606 public void doLoadInThread() {
607 // to the CDMRadarDataSource
608 Hashtable ht = new Hashtable();
609 if (selectedStation != null) {
610 ht.put(ucar.unidata.data.radar.RadarDataSource.STATION_LOCATION,
611 selectedStation.getNamedLocation());
612 } else {
613 LogUtil.userMessage("No Station selected");
614 }
615
616 if (isLevel3 && (selectedProduct == null)) {
617
618 LogUtil.userMessage("No Product selected");
619 }
620
621 try {
622 DateSelection dateSelection = new DateSelection();
623 String collectionUrl = TwoFacedObject.getIdString(
624 collectionSelector.getSelectedItem());
625 String pid = null;
626 RadarQuery radarQuery;
627 if (isLevel3) {
628 pid = TwoFacedObject.getIdString(
629 productComboBox.getSelectedItem());
630 radarQuery = new RadarQuery(collectionUrl,
631 selectedStation.getID(), pid,
632 dateSelection);
633 } else {
634 radarQuery = new RadarQuery(collectionUrl,
635 selectedStation.getID(),
636 dateSelection);
637 }
638
639 List urls = new ArrayList();
640
641 if (getDoAbsoluteTimes()) {
642 List times = new ArrayList();
643 List selected = makeDatedObjects(getSelectedAbsoluteTimes());
644 for (int i = 0; i < selected.size(); i++) {
645 DatedThing datedThing = (DatedThing) selected.get(i);
646 Date date = datedThing.getDate();
647 times.add(date);
648 URI uri = null;
649 try {
650 uri = collection.getRadarDatasetURI(
651 selectedStation.getID(), pid, date);
652 } catch (Exception excp) {
653 LogUtil.userMessage("incorrect times selected");
654 return;
655 }
656 urls.add(uri.toString());
657 }
658 if (urls.size() == 0) {
659 LogUtil.userMessage("No times selected");
660 return;
661 }
662 dateSelection.setTimes(times);
663 } else {
664 int count = getRelativeTimesList().getSelectedIndex() + 1;
665 if (count == 0) {
666 LogUtil.userMessage("No relative times selected");
667 return;
668 }
669 Date toDate = new Date(System.currentTimeMillis()
670 + DateUtil.daysToMillis(365 * 100));
671 //Go back 10 years (or so)
672 Date fromDate = new Date(System.currentTimeMillis()
673 - DateUtil.daysToMillis(365 * 10));
674
675 dateSelection.setStartFixedTime(fromDate);
676 dateSelection.setEndFixedTime(toDate);
677 dateSelection.setCount(count);
678 }
679 makeDataSource(radarQuery, "FILE.RADAR", ht);
680 } catch (Exception exc) {
681 logException("Loading radar data", exc);
682 }
683 }
684
685 protected int getNumTimesToSelect() {
686 return 5;
687 }
688
689 /**
690 * Get the default selected index for the relative times list.
691 *
692 * @return default index
693 */
694 protected int getDefaultRelativeTimeIndex() {
695 return 4;
696 }
697
698 /**
699 * Check the times lists
700 */
701 protected void checkTimesLists() {
702 super.checkTimesLists();
703 if (timesCardPanelExtra == null) {
704 return;
705 }
706 if (getDoAbsoluteTimes()) {
707 timesCardPanelExtra.show("absolute");
708 } else {
709 timesCardPanelExtra.show("relative");
710 }
711 }
712
713 /** Card panel to hold extra relative and absolute time components */
714 private GuiUtils.CardLayoutPanel timesCardPanelExtra;
715
716 /**
717 * Add the interval selector to the component.
718 * @return superclass component with extra stuff
719 */
720 protected JPanel makeTimesPanel() {
721 JComponent extra = getExtraTimeComponent();
722 GuiUtils.enableTree(extra, false);
723 JPanel timesPanel = makeTimesPanel(extra, null);
724 return timesPanel;
725 }
726
727 /**
728 * Set the relative and absolute extra components
729 */
730 protected JPanel makeTimesPanel(JComponent relativeCard, JComponent absoluteCard) {
731 JPanel timesPanel = super.makeTimesPanel(false,true);
732
733 // Make a new timesPanel that has extra components tacked on the bottom, inside the tabs
734 Component[] comps = timesPanel.getComponents();
735 if (comps.length==2 && comps[0] instanceof JTabbedPane && comps[1] instanceof JLabel) {
736 timesCardPanelExtra = new GuiUtils.CardLayoutPanel();
737 if (relativeCard == null) relativeCard = new JPanel();
738 if (absoluteCard == null) absoluteCard = new JPanel();
739 absoluteCard = GuiUtils.hbox(comps[1], GuiUtils.right(absoluteCard));
740 timesCardPanelExtra.add(relativeCard, "relative");
741 timesCardPanelExtra.add(absoluteCard, "absolute");
742 timesPanel = GuiUtils.centerBottom(comps[0], timesCardPanelExtra);
743 }
744
745 return timesPanel;
746 }
747
748 /**
749 * Get the time popup widget
750 *
751 * @return a widget for selecting the day
752 */
753 protected JComponent getExtraTimeComponent() {
754 JPanel filler = new JPanel();
755 McVGuiUtils.setComponentHeight(filler, new JComboBox());
756 return filler;
757 }
758
759 /**
760 * Make the contents
761 *
762 * @return the contents
763 */
764 protected JPanel doMakeInnerPanel() {
765 JPanel myPanel = new JPanel();
766
767 JLabel collectionLabel = McVGuiUtils.makeLabelRight("Collection:");
768
769 collectionSelector = new JComboBox();
770 collectionSelector.addItemListener(new ItemListener() {
771 public void itemStateChanged(ItemEvent e) {
772 newSelectedStations(new ArrayList());
773 if (collectionSelector.getSelectedItem() == null) {
774 return;
775 }
776 String collectionUrl =
777 TwoFacedObject.getIdString(
778 collectionSelector.getSelectedItem());
779
780 if (collectionUrl.contains("level3")) {
781 setLevel3Collection(collectionUrl);
782 } else {
783 setCollection(collectionUrl);
784 }
785 }
786
787 });
788 addServerComp(collectionLabel);
789 addServerComp(collectionSelector);
790
791 productComboBox = new JComboBox();
792 productComboBox.addItemListener(new ItemListener() {
793 public void itemStateChanged(ItemEvent e) {
794 if (productComboBox.getSelectedItem() == null) {
795 return;
796 }
797 selectedProduct =
798 productComboBox.getSelectedItem().toString();
799 resetProductBox();
800 productChanged();
801 }
802
803 });
804 addLevel3ServerComp(productComboBox);
805
806 productPanel = McVGuiUtils.makeLabeledComponent("Product:", productComboBox);
807
808 JLabel stationLabel = McVGuiUtils.makeLabelRight("Station:");
809 addServerComp(stationLabel);
810
811 JComponent stationPanel = getStationMap();
812 registerStatusComp("stations", stationPanel);
813 addServerComp(stationPanel);
814
815 JLabel timesLabel = McVGuiUtils.makeLabelRight("Times:");
816 addServerComp(timesLabel);
817
818 JPanel timesPanel = makeTimesPanel();
819 timesPanel.setBorder(javax.swing.BorderFactory.createEtchedBorder());
820 addServerComp(timesPanel);
821
822 GuiUtils.enableComponents(compsThatNeedServer, false);
823 GuiUtils.enableComponents(level3CompsThatNeedServer, false);
824 productPanel.setVisible(false);
825
826 GroupLayout layout = new GroupLayout(myPanel);
827 myPanel.setLayout(layout);
828 layout.setHorizontalGroup(
829 layout.createParallelGroup(LEADING)
830 .addGroup(layout.createSequentialGroup()
831 .addGroup(layout.createParallelGroup(LEADING)
832 .addGroup(layout.createSequentialGroup()
833 .addComponent(collectionLabel)
834 .addGap(GAP_RELATED)
835 .addComponent(collectionSelector, PREFERRED_SIZE, DEFAULT_SIZE, Short.MAX_VALUE)
836 .addComponent(productPanel, PREFERRED_SIZE, DEFAULT_SIZE, Short.MAX_VALUE))
837 .addGroup(layout.createSequentialGroup()
838 .addComponent(stationLabel)
839 .addGap(GAP_RELATED)
840 .addComponent(stationPanel, PREFERRED_SIZE, DEFAULT_SIZE, Short.MAX_VALUE))
841 .addGroup(layout.createSequentialGroup()
842 .addComponent(timesLabel)
843 .addGap(GAP_RELATED)
844 .addComponent(timesPanel, PREFERRED_SIZE, DEFAULT_SIZE, Short.MAX_VALUE))))
845 );
846 layout.setVerticalGroup(
847 layout.createParallelGroup(LEADING)
848 .addGroup(layout.createSequentialGroup()
849 .addGroup(layout.createParallelGroup(BASELINE)
850 .addComponent(collectionLabel)
851 .addComponent(collectionSelector)
852 .addComponent(productPanel))
853 .addPreferredGap(RELATED)
854 .addGroup(layout.createParallelGroup(LEADING)
855 .addComponent(stationLabel)
856 .addComponent(stationPanel, PREFERRED_SIZE, DEFAULT_SIZE, Short.MAX_VALUE))
857 .addPreferredGap(RELATED)
858 .addGroup(layout.createParallelGroup(LEADING)
859 .addComponent(timesLabel)
860 .addComponent(timesPanel, PREFERRED_SIZE, DEFAULT_SIZE, Short.MAX_VALUE))
861 .addPreferredGap(RELATED))
862 );
863
864 return myPanel;
865 }
866
867 /**
868 * Make the UI for this selector.
869 *
870 * Thank you NetBeans for helping with the layout!
871 *
872 * @return The gui
873 */
874 private JPanel innerPanel = doMakeInnerPanel();
875
876 private JLabel statusLabel = new JLabel("Status");
877
878 @Override
879 public void setStatus(String statusString, String foo) {
880 if (statusString == null)
881 statusString = "";
882 statusLabel.setText(statusString);
883 }
884
885 protected void setInnerPanel(JPanel newInnerPanel) {
886 innerPanel = newInnerPanel;
887 }
888
889 public JComponent doMakeContents() {
890 JPanel outerPanel = new JPanel();
891
892 JLabel serverLabel = McVGuiUtils.makeLabelRight("Catalog:");
893
894 //Get the list of catalogs but remove the old catalog.xml entry
895 urlListHandler = getPreferenceList(PREF_TDSRADARSERVER);
896
897 ActionListener catListListener = new ActionListener() {
898 public void actionPerformed(ActionEvent ae) {
899 if ( !okToDoUrlListEvents) {
900 return;
901 }
902 setServer((String) urlBox.getSelectedItem());
903 }
904 };
905
906 urlBox = urlListHandler.createComboBox(GuiUtils.CMD_UPDATE, catListListener, true);
907 McVGuiUtils.setComponentWidth(urlBox, Width.DOUBLEDOUBLE);
908
909 // productComboBox gets created a little too tall--set to same height as urlBox
910 if (productComboBox!=null)
911 McVGuiUtils.setComponentHeight(productComboBox, urlBox);
912
913 JButton connectButton = McVGuiUtils.makeImageTextButton(ICON_CONNECT_SMALL, "Connect");
914 McVGuiUtils.setComponentWidth(connectButton, Width.DOUBLE);
915 connectButton.setActionCommand(GuiUtils.CMD_UPDATE);
916 connectButton.addActionListener(this);
917
918 JLabel statusLabelLabel = McVGuiUtils.makeLabelRight("");
919
920 statusLabel.setText("Status");
921 McVGuiUtils.setLabelPosition(statusLabel, Position.RIGHT);
922 McVGuiUtils.setComponentColor(statusLabel, TextColor.STATUS);
923
924 JButton helpButton = McVGuiUtils.makeImageButton(ICON_HELP, "Show help");
925 helpButton.setActionCommand(GuiUtils.CMD_HELP);
926 helpButton.addActionListener(this);
927
928 JButton refreshButton = McVGuiUtils.makeImageButton(ICON_REFRESH, "Refresh");
929 refreshButton.setActionCommand(GuiUtils.CMD_UPDATE);
930 refreshButton.addActionListener(this);
931
932 McVGuiUtils.setComponentWidth(loadButton, Width.DOUBLE);
933
934 GroupLayout layout = new GroupLayout(outerPanel);
935 outerPanel.setLayout(layout);
936 layout.setHorizontalGroup(
937 layout.createParallelGroup(LEADING)
938 .addGroup(TRAILING, layout.createSequentialGroup()
939 .addGroup(layout.createParallelGroup(TRAILING)
940 .addGroup(layout.createSequentialGroup()
941 .addContainerGap()
942 .addComponent(helpButton)
943 .addGap(GAP_RELATED)
944 .addComponent(refreshButton)
945 .addGap(GAP_RELATED)
946 .addComponent(cancelButton)
947 .addPreferredGap(RELATED)
948 .addComponent(loadButton))
949 .addGroup(LEADING, layout.createSequentialGroup()
950 .addContainerGap()
951 .addGroup(layout.createParallelGroup(LEADING)
952 .addComponent(innerPanel, DEFAULT_SIZE, DEFAULT_SIZE, Short.MAX_VALUE)
953 .addGroup(layout.createSequentialGroup()
954 .addComponent(serverLabel)
955 .addGap(GAP_RELATED)
956 .addComponent(urlBox, DEFAULT_SIZE, DEFAULT_SIZE, Short.MAX_VALUE)
957 .addGap(GAP_UNRELATED)
958 .addComponent(connectButton))
959 .addGroup(layout.createSequentialGroup()
960 .addComponent(statusLabelLabel)
961 .addGap(GAP_RELATED)
962 .addComponent(statusLabel, DEFAULT_SIZE, DEFAULT_SIZE, Short.MAX_VALUE)))))
963 .addContainerGap())
964 );
965 layout.setVerticalGroup(
966 layout.createParallelGroup(LEADING)
967 .addGroup(layout.createSequentialGroup()
968 .addContainerGap()
969 .addGroup(layout.createParallelGroup(BASELINE)
970 .addComponent(serverLabel)
971 .addComponent(urlBox)
972 .addComponent(connectButton))
973 .addPreferredGap(UNRELATED)
974 .addComponent(innerPanel, DEFAULT_SIZE, DEFAULT_SIZE, Short.MAX_VALUE)
975 .addPreferredGap(UNRELATED)
976 .addGroup(layout.createParallelGroup(BASELINE)
977 .addComponent(statusLabelLabel)
978 .addComponent(statusLabel))
979 .addPreferredGap(UNRELATED)
980 .addGroup(layout.createParallelGroup(BASELINE)
981 .addComponent(loadButton)
982 .addComponent(cancelButton)
983 .addComponent(refreshButton)
984 .addComponent(helpButton))
985 .addContainerGap())
986 );
987
988 return outerPanel;
989
990 }
991
992 }
993