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}