001/*
002 * $Id: AddeLightningDataChooser.java,v 1.7 2011/03/24 16:06:32 davep Exp $
003 *
004 * This file is part of McIDAS-V
005 *
006 * Copyright 2007-2011
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
031package edu.wisc.ssec.mcidasv.chooser.adde;
032
033
034import java.util.ArrayList;
035import java.util.Date;
036import java.util.List;
037
038import javax.swing.ListSelectionModel;
039
040import org.w3c.dom.Element;
041
042import ucar.unidata.data.AddeUtil;
043import ucar.unidata.idv.chooser.IdvChooserManager;
044import ucar.unidata.util.TwoFacedObject;
045import ucar.visad.UtcDate;
046import visad.DateTime;
047
048import edu.wisc.ssec.mcidas.McIDASUtil;
049
050/**
051 * Selection widget for ADDE point data
052 *
053 * @author MetApps Development Team
054 * @version $Revision: 1.7 $ $Date: 2011/03/24 16:06:32 $
055 */
056public class AddeLightningDataChooser extends AddePointDataChooser {
057
058
059    /**
060     * Create a new <code>AddeLightningDataChooser</code> with the preferred
061     * list of ADDE servers.
062     *
063     *
064     * @param mgr The chooser manager
065     * @param root The chooser.xml node
066     */
067    public AddeLightningDataChooser(IdvChooserManager mgr, Element root) {
068        super(mgr, root);
069    }
070
071
072    /**
073     * Get the default station model for this chooser.
074     * @return name of default station model
075     */
076    public String getDefaultStationModel() {
077        return "flash";
078    }
079
080    /**
081     * This allows derived classes to provide their own name for labeling, etc.
082     *
083     * @return  the dataset name
084     */
085    public String getDataName() {
086        return "Lightning Data";
087    }
088
089    /**
090     * Get the request string for times particular to this chooser
091     *
092     * @return request string
093     * protected String getTimesRequest() {
094     *   StringBuffer buf = getGroupUrl(REQ_POINTDATA, getGroup());
095     *   appendKeyValue(buf, PROP_DESCR, getDescriptor());
096     *   // this is hokey, but take a smattering of stations.
097     *   //appendKeyValue(buf, PROP_SELECT, "'CO US'");
098     *   appendKeyValue(buf, PROP_POS, "0");
099     *   appendKeyValue(buf, PROP_NUM, "ALL");
100     *   appendKeyValue(buf, PROP_PARAM, "DAY TIME");
101     *   return buf.toString();
102     * }
103     */
104
105    /**
106     * Get the default datasets for the chooser.  The objects are
107     * a descriptive name and the ADDE group/descriptor
108     *
109     * @return  default datasets.
110     */
111    protected TwoFacedObject[] getDefaultDatasets() {
112        return new TwoFacedObject[] { new TwoFacedObject("NLDN", "LGT/NLDN"),
113                                      new TwoFacedObject("USPLN",
114                                      "LGT/USPLN") };
115    }
116
117    /**
118     * Get the increment between times for relative time requests
119     *
120     * @return time increment (hours)
121     */
122    public float getRelativeTimeIncrement() {
123        return .5f;
124    }
125
126    /**
127     * Create the date time selection string for the "select" clause
128     * of the ADDE URL.
129     *
130     * @return the select day and time strings
131     */
132    protected String getDayTimeSelectString() {
133        StringBuffer buf = new StringBuffer();
134        if (getDoAbsoluteTimes()) {
135            buf.append("time ");
136            List     times = getSelectedAbsoluteTimes();
137            DateTime dt    = (DateTime) times.get(0);
138            buf.append(UtcDate.getHMS(dt));
139            buf.append(" ");
140            dt = (DateTime) times.get(times.size() - 1);
141            buf.append(UtcDate.getHMS(dt));
142        } else {
143            buf.append(getRelativeTimeId());
144        }
145        return buf.toString();
146    }
147
148    /**
149     * Get the identifier for relative time.  Subclasses can override.
150     * @return the identifier
151     */
152    protected String getRelativeTimeId() {
153        return AddeUtil.RELATIVE_TIME_RANGE;
154    }
155
156    /**
157     * Get the selection mode for the absolute times panel. Subclasses
158     * can override.
159     *
160     * @return the list selection mode
161     */
162    protected int getAbsoluteTimeSelectMode() {
163        return ListSelectionModel.SINGLE_INTERVAL_SELECTION;
164    }
165
166
167    /**
168     * Set the list of available times.
169     */
170    public void readTimes() {
171        clearTimesList();
172        ArrayList uniqueTimes = new ArrayList();
173
174        setState(STATE_CONNECTING);
175        try {
176            float    hours      = getRelativeTimeIncrement();
177            int      numTimes   = (int) (24f / hours);
178            DateTime currentDay = new DateTime(new Date());
179            int day = Integer.parseInt(UtcDate.formatUtcDate(currentDay,
180                          "yyyyMMdd"));
181            for (int i = 0; i < numTimes; i++) {
182                int hour = McIDASUtil.mcDoubleToPackedInteger(i * hours);
183                try {
184                    DateTime dt =
185                        new DateTime(McIDASUtil.mcDayTimeToSecs(day, hour));
186                    uniqueTimes.add(dt);
187                } catch (Exception e) {}
188            }
189            setState(STATE_CONNECTED);
190            //System.out.println(
191            //       "found " + uniqueTimes.size() + " unique times");
192        } catch (Exception excp) {
193            handleConnectionError(excp);
194            return;
195        }
196        if (getDoAbsoluteTimes()) {
197            if ( !uniqueTimes.isEmpty()) {
198                setAbsoluteTimes(new ArrayList(uniqueTimes));
199            }
200            int selectedIndex = getAbsoluteTimes().size() - 1;
201            setSelectedAbsoluteTime(selectedIndex);
202        }
203    }
204
205
206}
207