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