001/*
002 * This file is part of McIDAS-V
003 *
004 * Copyright 2007-2015
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
029package edu.wisc.ssec.mcidasv.data;
030
031import static javax.swing.GroupLayout.Alignment.BASELINE;
032import static javax.swing.GroupLayout.Alignment.LEADING;
033import static javax.swing.LayoutStyle.ComponentPlacement.RELATED;
034import static javax.swing.LayoutStyle.ComponentPlacement.UNRELATED;
035
036import edu.wisc.ssec.mcidasv.Constants;
037
038import edu.wisc.ssec.mcidasv.data.dateChooser.*;
039
040import java.awt.Dimension;
041import java.rmi.RemoteException;
042import java.util.Calendar;
043import java.util.Date;
044
045import javax.swing.*;
046
047import name.gano.astro.time.Time;
048import org.slf4j.Logger;
049import org.slf4j.LoggerFactory;
050
051import ucar.unidata.data.DataSelection;
052import ucar.unidata.data.DataSelectionComponent;
053import ucar.unidata.data.DataSourceImpl;
054
055import visad.VisADException;
056
057public class TimeRangeSelection extends DataSelectionComponent implements Constants {
058
059      private static final Logger logger = LoggerFactory.getLogger(TimeRangeSelection.class);
060
061      private JTextField beginTimeFld;
062      private JTextField endTimeFld;
063      private String defaultBegTime = "00:00:00";
064      private String defaultEndTime = "23:59:59";
065      private Date defaultDay = null;
066
067      private JDateChooser begDay = null;
068      private JDateChooser endDay = null;
069
070      public static final String PROP_BEGTIME = "BeginTime";
071      public static final String PROP_ENDTIME = "EndTime";
072      protected static final String PROP_BTIME = "BTime";
073      protected static final String PROP_ETIME = "ETime";
074      protected static final String PROP_YEAR = "Year";
075      protected static final String PROP_MONTH = "Month";
076      protected static final String PROP_DAY = "Day";
077      protected static final String PROP_HOURS = "Hours";
078      protected static final String PROP_MINS = "Mins";
079      protected static final String PROP_SECS = "Secs";
080
081      private JPanel timeRangeComp = new JPanel();
082
083      public TimeRangeSelection(DataSourceImpl dataSource) 
084              throws VisADException, RemoteException {
085          super("Time Range");
086      }
087
088    protected JComponent doMakeContents() {
089
090        logger.debug("creating the TimeRangeSelection panel...");
091        JLabel begLab = new JLabel("  Begin");
092        JLabel endLab = new JLabel("  End");
093        JLabel begTimeLab = new JLabel("      Time:");
094        JLabel endTimeLab = new JLabel("      Time:");
095        JLabel begDateLab = new JLabel("      Date:");
096        JLabel endDateLab = new JLabel("      Date:");
097        beginTimeFld = new JTextField(defaultBegTime, 8);
098        beginTimeFld.setMaximumSize(new Dimension(80, 40));
099        endTimeFld = new JTextField(defaultEndTime, 8);
100        endTimeFld.setMaximumSize(new Dimension(80, 40));
101        Calendar cal = Calendar.getInstance();
102        defaultDay = cal.getTime();
103        begDay = new JDateChooser(defaultDay);
104        begDay.setMaximumSize(new Dimension(140, 20));
105        endDay = new JDateChooser(defaultDay);
106        endDay.setMaximumSize(new Dimension(140, 20));
107        
108        // make them listen to each other to maintain range validity (beg <= end) and vice versa
109        begDay.getJCalendar().getDayChooser().setName(JDayChooser.BEG_DAY);
110        endDay.getJCalendar().getDayChooser().setName(JDayChooser.END_DAY);
111        begDay.getJCalendar().getDayChooser().addPropertyChangeListener("day", endDay);
112        endDay.getJCalendar().getDayChooser().addPropertyChangeListener("day", begDay);
113
114        GroupLayout layout = new GroupLayout(timeRangeComp);
115        timeRangeComp.setLayout(layout);
116        layout.setHorizontalGroup(
117            layout.createParallelGroup(LEADING)
118                .addComponent(begLab)
119                .addGroup(layout.createSequentialGroup()
120                    .addComponent(begTimeLab)
121                    .addGap(GAP_RELATED)
122                    .addComponent(beginTimeFld))
123                .addGroup(layout.createSequentialGroup()
124                    .addComponent(begDateLab)
125                    .addGap(GAP_RELATED)
126                    .addComponent(begDay))
127                .addComponent(endLab)
128                .addGroup(layout.createSequentialGroup()
129                    .addComponent(endTimeLab)
130                    .addGap(GAP_RELATED)
131                    .addComponent(endTimeFld))
132                .addGroup(layout.createSequentialGroup()
133                    .addComponent(endDateLab)
134                    .addGap(GAP_RELATED)
135                    .addComponent(endDay))
136         );
137
138        layout.setVerticalGroup(
139            layout.createParallelGroup(LEADING)
140            .addGroup(layout.createSequentialGroup()
141                .addComponent(begLab)
142                .addGroup(layout.createParallelGroup(BASELINE)
143                    .addComponent(begTimeLab)
144                    .addComponent(beginTimeFld))
145                .addPreferredGap(RELATED)
146                .addGroup(layout.createParallelGroup(BASELINE)
147                    .addComponent(begDateLab)
148                    .addComponent(begDay))
149                .addPreferredGap(UNRELATED)
150                .addComponent(endLab)
151                .addGroup(layout.createParallelGroup(BASELINE)
152                    .addComponent(endTimeLab)
153                    .addComponent(endTimeFld))
154                .addPreferredGap(RELATED)
155                .addGroup(layout.createParallelGroup(BASELINE)
156                    .addComponent(endDateLab)
157                    .addComponent(endDay)))
158         );
159
160         return timeRangeComp;
161    }
162
163    protected JComponent getTimeRangeComponent() {
164        return timeRangeComp;
165    }
166
167    public boolean begTimeOk() {
168        String begTime = beginTimeFld.getText();
169        String[] timeStrings = begTime.split(":");
170        int num = timeStrings.length;
171        if (num != 3) return false;
172        int hours = -1;
173        int mins = -1;
174        int secs = -1; 
175        try {
176                hours = Integer.parseInt(timeStrings[0]);
177                mins = Integer.parseInt(timeStrings[1]);
178                secs = Integer.parseInt(timeStrings[2]);
179        } catch (NumberFormatException nfe) {
180                return false;
181        }
182        if ((hours < 0) || (hours > 23)) return false;
183        if ((mins < 0) || (mins > 59)) return false;
184        if ((secs < 0) || (secs > 59)) return false;
185        return true;
186    }
187    
188    public boolean endTimeOk() {
189        String endTime = endTimeFld.getText();
190        String[] timeStrings = endTime.split(":");
191        int num = timeStrings.length;
192        if (num != 3) return false;
193        int hours = -1;
194        int mins = -1;
195        int secs = -1;
196        try {
197                hours = Integer.parseInt(timeStrings[0]);
198                mins = Integer.parseInt(timeStrings[1]);
199                secs = Integer.parseInt(timeStrings[2]);
200        } catch (NumberFormatException nfe) {
201                return false;
202        }
203        if ((hours < 0) || (hours > 23)) return false;
204        if ((mins < 0) || (mins > 59)) return false;
205        if ((secs < 0) || (secs > 59)) return false;
206        return true;
207    }
208    
209    public boolean timeRangeOk() {
210        
211        logger.info("timeRangeOk...");
212        if (! begTimeOk()) return false;
213        if (! endTimeOk()) return false;
214        
215        JCalendar cal = begDay.getJCalendar();
216        JDayChooser dayChooser = cal.getDayChooser();
217        int day = dayChooser.getDay();
218        JMonthChooser monthChooser = cal.getMonthChooser();
219        int month = monthChooser.getMonth() + 1;
220        JYearChooser yearChooser = cal.getYearChooser();
221        int year = yearChooser.getYear();
222
223        int hours = 0;
224        int mins = 0;
225        double secs = 0.0;
226        String begTime = beginTimeFld.getText();
227        String[] timeStrings = begTime.split(":");
228        int num = timeStrings.length;
229        if (num > 0)
230            hours = (new Integer(timeStrings[0])).intValue();
231        if (num > 1)
232            mins = (new Integer(timeStrings[1])).intValue();
233        if (num > 2)
234            secs = (new Integer(timeStrings[2])).intValue();
235
236        Time bTime = new Time(year, month, day, hours, mins, secs);
237
238        cal = endDay.getJCalendar();
239        dayChooser = cal.getDayChooser();
240        day = dayChooser.getDay();
241        monthChooser = cal.getMonthChooser();
242        month = monthChooser.getMonth() + 1;
243        yearChooser = cal.getYearChooser();
244        year = yearChooser.getYear();
245
246        String endTime = endTimeFld.getText();
247        timeStrings = endTime.split(":");
248        num = timeStrings.length;
249        if (num > 0)
250            hours = (new Integer(timeStrings[0])).intValue();
251        if (num > 1)
252            mins = (new Integer(timeStrings[1])).intValue();
253        if (num > 2)
254            secs = (new Integer(timeStrings[2])).intValue();
255
256        Time eTime = new Time(year, month, day, hours, mins, secs);
257        
258        if (eTime.getJulianDate() < bTime.getJulianDate()) {
259                return false;
260        }
261        return true;
262    }
263    
264    @Override public void applyToDataSelection(DataSelection dataSelection) {
265
266        logger.info("applyToDataSelection...");
267        
268        if (! begTimeOk()) return;
269        if (! endTimeOk()) return;
270        
271        if (dataSelection == null) {
272            dataSelection = new DataSelection(true);
273        }
274
275        JCalendar cal = begDay.getJCalendar();
276        JDayChooser dayChooser = cal.getDayChooser();
277        int day = dayChooser.getDay();
278        JMonthChooser monthChooser = cal.getMonthChooser();
279        int month = monthChooser.getMonth() + 1;
280        JYearChooser yearChooser = cal.getYearChooser();
281        int year = yearChooser.getYear();
282
283        int hours = 0;
284        int mins = 0;
285        double secs = 0.0;
286        String begTime = beginTimeFld.getText();
287        String[] timeStrings = begTime.split(":");
288        int num = timeStrings.length;
289        if (num > 0)
290            hours = (new Integer(timeStrings[0])).intValue();
291        if (num > 1)
292            mins = (new Integer(timeStrings[1])).intValue();
293        if (num > 2)
294            secs = (new Integer(timeStrings[2])).intValue();
295        if ((hours < 0) || (hours > 23)) hours = 0;
296        if ((mins < 0) || (mins > 59)) mins = 0;
297        if ((secs < 0.0) || (secs > 59.0)) secs = 0.0;
298
299        Time bTime = new Time(year, month, day, hours, mins, secs);
300        double dVal = bTime.getJulianDate();
301        Double bigD = new Double(dVal);
302        String begTimeStr = bigD.toString();
303        dataSelection.putProperty(PROP_BEGTIME, bTime.getDateTimeStr());
304
305        Integer intVal = new Integer(year);
306        dataSelection.putProperty(PROP_YEAR, intVal.toString());
307        intVal = new Integer(month);
308        dataSelection.putProperty(PROP_MONTH, intVal.toString());
309        intVal = new Integer(day);
310        dataSelection.putProperty(PROP_DAY, intVal.toString());
311        intVal = new Integer(hours);
312        dataSelection.putProperty(PROP_HOURS, intVal.toString());
313        intVal = new Integer(mins);
314        dataSelection.putProperty(PROP_MINS, intVal.toString());
315        Double doubleVal = new Double(secs);
316        dataSelection.putProperty(PROP_SECS, doubleVal.toString());
317
318        cal = endDay.getJCalendar();
319        dayChooser = cal.getDayChooser();
320        day = dayChooser.getDay();
321        monthChooser = cal.getMonthChooser();
322        month = monthChooser.getMonth() + 1;
323        yearChooser = cal.getYearChooser();
324        year = yearChooser.getYear();
325
326        String endTime = endTimeFld.getText();
327        timeStrings = endTime.split(":");
328        num = timeStrings.length;
329        if (num > 0)
330            hours = (new Integer(timeStrings[0])).intValue();
331        if (num > 1)
332            mins = (new Integer(timeStrings[1])).intValue();
333        if (num > 2)
334            secs = (new Integer(timeStrings[2])).intValue();
335        if ((hours < 0) || (hours > 23)) hours = 0;
336        if ((mins < 0) || (mins > 59)) mins = 0;
337        if ((secs < 0.0) || (secs > 59.0)) secs = 0.0;
338
339        Time eTime = new Time(year, month, day, hours, mins, secs);
340        dVal = eTime.getJulianDate();
341        bigD = new Double(dVal);
342        String endTimeStr = bigD.toString();
343
344        dataSelection.putProperty(PROP_ENDTIME, eTime.getDateTimeStr());
345        dataSelection.putProperty(PROP_BTIME, begTimeStr);
346        dataSelection.putProperty(PROP_ETIME, endTimeStr);
347    }
348}