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.Alignment.BASELINE;
033 import static javax.swing.GroupLayout.Alignment.LEADING;
034 import static javax.swing.GroupLayout.Alignment.TRAILING;
035 import static javax.swing.LayoutStyle.ComponentPlacement.RELATED;
036 import static javax.swing.LayoutStyle.ComponentPlacement.UNRELATED;
037
038 import java.awt.BorderLayout;
039 import java.awt.Dimension;
040 import java.awt.FlowLayout;
041 import java.awt.event.ActionEvent;
042 import java.awt.event.ActionListener;
043 import java.awt.event.KeyEvent;
044 import java.awt.event.KeyListener;
045 import java.io.File;
046 import java.util.ArrayList;
047 import java.util.Hashtable;
048 import java.util.List;
049 import java.util.Map;
050
051 import javax.swing.BorderFactory;
052 import javax.swing.Box;
053 import javax.swing.BoxLayout;
054 import javax.swing.GroupLayout;
055 import javax.swing.JButton;
056 import javax.swing.JComboBox;
057 import javax.swing.JComponent;
058 import javax.swing.JLabel;
059 import javax.swing.JPanel;
060 import javax.swing.JRadioButton;
061 import javax.swing.JTextField;
062
063 import org.w3c.dom.Element;
064
065 import ucar.unidata.idv.chooser.IdvChooserManager;
066 import ucar.unidata.util.GuiUtils;
067 import ucar.unidata.util.PreferenceList;
068
069 import edu.wisc.ssec.mcidasv.Constants;
070 import edu.wisc.ssec.mcidasv.chooser.adde.AddeChooser;
071 import edu.wisc.ssec.mcidasv.util.McVGuiUtils;
072 import edu.wisc.ssec.mcidasv.util.McVGuiUtils.Width;
073
074 /**
075 * Polar Orbit Track Chooser
076 * Allows user to load TLE files for display in McIDAS-V via three methods:
077 * Remote: ADDE or URL
078 * Local: file
079 *
080 * @author Gail Dengel and Tommy Jasmin
081 */
082
083 public class PolarOrbitTrackChooser extends AddeChooser implements Constants {
084
085 private static final long serialVersionUID = 1L;
086
087 // chooser for local files
088 TLEFileChooser tlefc = null;
089
090 // set when loading a local file
091 File localFile = null;
092
093 /** Connect button--we need to be able to disable this */
094 JButton connectButton = McVGuiUtils.makeImageTextButton(ICON_CONNECT_SMALL, "Connect");
095
096 /** Manage button */
097 JButton manageButton =
098 McVGuiUtils.makeImageButton("/edu/wisc/ssec/mcidasv/resources/icons/toolbar/preferences-system22.png",
099 this, "doManager", null, "Manage servers");
100
101 /** Public button--we need to draw a menu from this */
102 JButton publicButton =
103 McVGuiUtils.makeImageButton("/edu/wisc/ssec/mcidasv/resources/icons/toolbar/show-layer-controls22.png",
104 this, "showGroups", null, "List public datasets");
105
106 private JComboBox serverSelector;
107 private JRadioButton addeBtn;
108 private JRadioButton urlBtn;
109 private JLabel descLabel;
110 List addeList = new ArrayList();
111
112 /** Manages the pull down list of urls */
113 private PreferenceList prefList;
114
115 /** The list of urls */
116 private JComboBox box;
117 private JTextField boxEditor;
118
119 /** text type */
120 private static final String TLE_TYPE = "text";
121
122 /** Property name to get the list or urls */
123 public static final String PREF_URLLIST = "idv.urllist";
124
125 /**
126 * Property for the tle server name key.
127 * @see #getServer()
128 */
129 public static String TLE_SERVER_NAME_KEY = "tle_server";
130 public static String URL_NAME_KEY = "url_name";
131 public static String LOCAL_FILE_KEY = "file_object";
132
133 /**
134 * Property for the tle group name key.
135 * @see #getGroup()
136 */
137 public static String TLE_GROUP_NAME_KEY = "tle_group";
138
139 /**
140 * Property for the tle user id
141 */
142 public static String TLE_USER_ID_KEY = "tle_user";
143
144 /**
145 * Property for the tle project number
146 */
147 public static String TLE_PROJECT_NUMBER_KEY = "tle_proj";
148
149 /**
150 * Construct an Adde image selection widget
151 *
152 * @param mgr The chooser manager
153 * @param root The chooser.xml node
154 */
155
156 public PolarOrbitTrackChooser(IdvChooserManager mgr, Element root) {
157 super(mgr, root);
158 serverSelector = getServerSelector();
159 showServers();
160 }
161
162 /**
163 * Return the data source ID. Used by extending classes.
164 */
165 @Override
166 protected String getDataSourceId() {
167 return "TLE";
168 }
169
170 /**
171 * Make the UI for this selector.
172 *
173 * @return The gui
174 */
175
176 @Override
177 public JComponent doMakeContents() {
178 JPanel outerPanel = new JPanel();
179 JPanel addePanel = new JPanel();
180 addePanel = (JPanel) makeAddePanel();
181
182 tlefc = new TLEFileChooser(".");
183 tlefc.setPotc(this);
184
185 JButton helpButton = McVGuiUtils.makeImageButton(ICON_HELP, "Show help");
186 helpButton.setActionCommand(GuiUtils.CMD_HELP);
187 helpButton.addActionListener(this);
188
189 JButton refreshButton = McVGuiUtils.makeImageButton(ICON_REFRESH, "Refresh");
190 refreshButton.setActionCommand(GuiUtils.CMD_UPDATE);
191 refreshButton.addActionListener(this);
192
193 McVGuiUtils.setComponentWidth(loadButton, Width.DOUBLE);
194
195 outerPanel.setLayout(new BorderLayout());
196 JPanel choicePanel = new JPanel(new BorderLayout());
197 JPanel controlPanel = new JPanel(new FlowLayout(FlowLayout.TRAILING));
198
199 // load the local and remote choices in a Box in center panel
200 JPanel centerPanel = new JPanel();
201 centerPanel.setLayout(new BoxLayout(centerPanel, BoxLayout.PAGE_AXIS));
202 JPanel localPanel = new JPanel();
203 localPanel.setBorder(BorderFactory.createTitledBorder("Local"));
204 JPanel remotePanel = new JPanel();
205 remotePanel.setBorder(BorderFactory.createTitledBorder("Remote"));
206
207 // populate the local access panel
208 localPanel.add(tlefc);
209
210 // populate the remote access panel
211 remotePanel.add(addePanel);
212
213 centerPanel.add(localPanel);
214 centerPanel.add(remotePanel);
215 choicePanel.add(centerPanel, BorderLayout.CENTER);
216
217 outerPanel.add(choicePanel, BorderLayout.CENTER);
218
219 // populate and add the control panel
220 controlPanel.add(helpButton);
221 controlPanel.add(Box.createRigidArea(new Dimension(5, 0)));
222 controlPanel.add(refreshButton);
223 controlPanel.add(Box.createRigidArea(new Dimension(5, 0)));
224 controlPanel.add(cancelButton);
225 controlPanel.add(Box.createRigidArea(new Dimension(5, 0)));
226 controlPanel.add(loadButton);
227 outerPanel.add(controlPanel, BorderLayout.PAGE_END);
228
229 return outerPanel;
230 }
231
232 private JComponent makeAddePanel() {
233 JPanel outerPanel = new JPanel();
234
235 addeBtn = new JRadioButton("ADDE", true);
236 urlBtn = new JRadioButton("URL", false);
237 GuiUtils.buttonGroup(addeBtn, urlBtn);
238 addeBtn.addActionListener(new ActionListener() {
239 public void actionPerformed(ActionEvent e) {
240 for (int i=0; i<5; i++) {
241 JComponent comp = (JComponent)(addeList.get(i));
242 comp.setEnabled(true);
243 enableDescriptors(true);
244 }
245 for (int i=5; i<7; i++) {
246 JComponent comp = (JComponent)(addeList.get(i));
247 comp.setEnabled(false);
248 }
249 }
250 });
251 urlBtn.addActionListener(new ActionListener() {
252 public void actionPerformed(ActionEvent e) {
253 for (int i=5; i<7; i++) {
254 JComponent comp = (JComponent)(addeList.get(i));
255 comp.setEnabled(true);
256 }
257 loadButton.setEnabled(true);
258 for (int i=0; i<5; i++) {
259 JComponent comp = (JComponent)(addeList.get(i));
260 comp.setEnabled(false);
261 enableDescriptors(false);
262 }
263 }
264 });
265 JLabel serverLabel = new JLabel(" Server:");
266 JLabel urlLabel = new JLabel(" URL:");
267 descLabel = new JLabel(" Descriptor:");
268 descLabel.setEnabled(false);
269 descriptorComboBox.setEnabled(false);
270
271 clearOnChange(serverSelector);
272 McVGuiUtils.setComponentWidth(serverSelector, Width.DOUBLE);
273
274 JLabel groupLabel = McVGuiUtils.makeLabelRight("Dataset:");
275
276 groupSelector.setEditable(isGroupEditable());
277 clearOnChange(groupSelector);
278 McVGuiUtils.setComponentWidth(groupSelector, Width.DOUBLE);
279
280 McVGuiUtils.setComponentWidth(connectButton, Width.DOUBLE);
281 connectButton.setActionCommand(CMD_CONNECT);
282 connectButton.addActionListener(this);
283
284 prefList = getPreferenceList(PREF_URLLIST);
285 box = prefList.createComboBox(CMD_LOAD, this);
286 boxEditor = (JTextField)box.getEditor().getEditorComponent();
287 boxEditor.addKeyListener(new KeyListener() {
288 public void keyPressed(KeyEvent e) {}
289 public void keyReleased(KeyEvent e) {
290 }
291 public void keyTyped(KeyEvent e) {}
292 });
293 urlLabel.setEnabled(false);
294 box.setEnabled(false);
295 JLabel spaceLab = new JLabel(" ");
296
297 GroupLayout layout = new GroupLayout(outerPanel);
298 outerPanel.setLayout(layout);
299 layout.setHorizontalGroup(
300 layout.createParallelGroup(LEADING)
301 .addGroup(TRAILING, layout.createSequentialGroup()
302 .addGroup(layout.createParallelGroup(TRAILING)
303 .addGroup(LEADING, layout.createSequentialGroup()
304 .addGroup(layout.createParallelGroup(LEADING)
305 .addComponent(addeBtn)
306 .addGroup(layout.createSequentialGroup()
307 .addComponent(serverLabel)
308 .addGap(GAP_RELATED)
309 .addComponent(serverSelector)
310 .addGap(GAP_RELATED)
311 .addComponent(manageButton)
312 .addGap(GAP_RELATED)
313 .addComponent(groupLabel)
314 .addGap(GAP_RELATED)
315 .addComponent(groupSelector)
316 .addGap(GAP_RELATED)
317 .addComponent(publicButton)
318 .addPreferredGap(RELATED, DEFAULT_SIZE, Short.MAX_VALUE)
319 .addComponent(connectButton))
320 .addGroup(layout.createSequentialGroup()
321 .addComponent(spaceLab)
322 .addComponent(descLabel)
323 .addGap(GAP_RELATED)
324 .addComponent(descriptorComboBox))
325 .addGap(GAP_RELATED)
326 .addComponent(urlBtn)
327 .addGroup(layout.createSequentialGroup()
328 .addComponent(urlLabel)
329 .addGap(GAP_RELATED)
330 .addComponent(box))))))
331 );
332
333 layout.setVerticalGroup(
334 layout.createParallelGroup(LEADING)
335 .addGroup(layout.createSequentialGroup()
336 .addComponent(addeBtn)
337 .addGroup(layout.createParallelGroup(BASELINE)
338 .addComponent(serverLabel)
339 .addComponent(serverSelector)
340 .addComponent(manageButton)
341 .addComponent(groupLabel)
342 .addComponent(groupSelector)
343 .addComponent(publicButton)
344 .addComponent(connectButton))
345 .addPreferredGap(RELATED)
346 .addGroup(layout.createParallelGroup(BASELINE)
347 .addComponent(spaceLab)
348 .addComponent(descLabel)
349 .addComponent(descriptorComboBox))
350 .addPreferredGap(UNRELATED)
351 .addComponent(urlBtn)
352 .addGroup(layout.createParallelGroup(BASELINE)
353 .addComponent(urlLabel)
354 .addComponent(box)))
355 );
356
357 addeList.add(serverLabel);
358 addeList.add(serverSelector);
359 addeList.add(groupLabel);
360 addeList.add(groupSelector);
361 addeList.add(connectButton);
362 McVGuiUtils.setComponentWidth(descriptorComboBox, Width.DOUBLEDOUBLE);
363 addeList.add(urlLabel);
364 addeList.add(box);
365
366 return outerPanel;
367 }
368
369 public void enableFileLoad(boolean val) {
370 loadButton.setEnabled(val);
371 }
372
373 private void enableDescriptors(boolean val) {
374 if (val) {
375 boolean connected;
376 if (getState() == STATE_CONNECTED) {
377 connected = true;
378 } else {
379 connected = false;
380 }
381 if (connected) {
382 descLabel.setEnabled(true);
383 descriptorComboBox.setEnabled(true);
384 } else {
385 descLabel.setEnabled(false);
386 descriptorComboBox.setEnabled(false);
387 }
388 } else {
389 descLabel.setEnabled(false);
390 descriptorComboBox.setEnabled(false);
391 }
392 }
393
394 /**
395 * Update labels, enable widgets, etc.
396 */
397 protected void updateStatus() {
398 super.updateStatus();
399 enableWidgets();
400 }
401
402 /**
403 * Get the data type ID
404 *
405 * @return the data type
406 */
407
408 public String getDataType() {
409 return "TEXT";
410 }
411
412 /**
413 * get the adde server group type to use
414 *
415 * @return group type
416 */
417 @Override
418 protected String getGroupType() {
419 return TLE_TYPE;
420 }
421
422 /**
423 * User said go, we go.
424 * Create the TLE DataSource
425 *
426 */
427 public void doLoadInThread() {
428 String obj = "TLE";
429 prefList.saveState(box);
430 Hashtable ht = new Hashtable();
431 getDataSourceProperties(ht);
432 makeDataSource(obj, getDataSourceId(), ht);
433 saveServerState();
434 }
435
436 /**
437 * Get the DataSource properties
438 *
439 * @param ht
440 * Hashtable of properties
441 */
442 protected void getDataSourceProperties(Hashtable ht) {
443 if (tlefc.getSelectedFile() == null) {
444 if (addeBtn.isSelected()) {
445 super.getDataSourceProperties(ht);
446 ht.put(DATASET_NAME_KEY, getDatasetName());
447 String server = getServer();
448 ht.put(TLE_SERVER_NAME_KEY, server);
449 String group = getGroup();
450 ht.put(TLE_GROUP_NAME_KEY, group);
451 Map<String, String> acct = getAccounting(server, group);
452 String user = acct.get("user");
453 String proj = acct.get("proj");
454 ht.put(TLE_USER_ID_KEY, user);
455 ht.put(TLE_PROJECT_NUMBER_KEY, proj);
456 } else {
457 ht.put(URL_NAME_KEY, box.getSelectedItem());
458 }
459 } else {
460 // else if file, set a new key...
461 ht.put(LOCAL_FILE_KEY, tlefc.getSelectedFile());
462 }
463 }
464
465 private String getDatasetName() {
466 return (String) descriptorComboBox.getSelectedItem();
467 }
468
469 public void handleConnectFromThread() {
470 super.handleConnectFromThread();
471 enableDescriptors(true);
472 }
473
474 /**
475 * Get the default display type
476 *
477 * @return the name of the default display
478 */
479 protected String getDefaultDisplayType() {
480 return "tledisplay";
481 }
482 }