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