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.data.dateChooser;
030
031import java.util.Calendar;
032import java.util.Date;
033
034/**
035 *  A utility class for some date operations.
036 * 
037 * @author Kai Toedter
038 * @version $LastChangedRevision: 95 $
039 * @version $LastChangedDate: 2006-05-05 18:43:15 +0200 (Fr, 05 Mai 2006) $
040 */
041public class DateUtil {
042        protected Date minSelectableDate;
043
044        protected Date maxSelectableDate;
045
046        protected Date defaultMinSelectableDate;
047
048        protected Date defaultMaxSelectableDate;
049
050        public DateUtil() {
051                Calendar tmpCalendar = Calendar.getInstance();
052                tmpCalendar.set(1, 0, 1, 1, 1);
053                defaultMinSelectableDate = tmpCalendar.getTime();
054                minSelectableDate = defaultMinSelectableDate;
055                tmpCalendar.set(9999, 0, 1, 1, 1);
056                defaultMaxSelectableDate = tmpCalendar.getTime();
057                maxSelectableDate = defaultMaxSelectableDate;
058        }
059
060        /**
061         * Sets a valid date range for selectable dates. If max is before min, the
062         * default range with no limitation is set.
063         * 
064         * @param min
065         *            the minimum selectable date or null (then the minimum date is
066         *            set to 01\01\0001)
067         * @param max
068         *            the maximum selectable date or null (then the maximum date is
069         *            set to 01\01\9999)
070         */
071        public void setSelectableDateRange(Date min, Date max) {
072                if (min == null) {
073                        minSelectableDate = defaultMinSelectableDate;
074                } else {
075                        minSelectableDate = min;
076                }
077                if (max == null) {
078                        maxSelectableDate = defaultMaxSelectableDate;
079                } else {
080                        maxSelectableDate = max;
081                }
082                if (maxSelectableDate.before(minSelectableDate)) {
083                        minSelectableDate = defaultMinSelectableDate;
084                        maxSelectableDate = defaultMaxSelectableDate;
085                }
086        }
087
088        /**
089         * Sets the maximum selectable date. If null, the date 01\01\9999 will be set instead.
090         * 
091         * @param max the maximum selectable date
092         * 
093         * @return the maximum selectable date
094         */
095        public Date setMaxSelectableDate(Date max) {
096                if (max == null) {
097                        maxSelectableDate = defaultMaxSelectableDate;
098                } else {
099                        maxSelectableDate = max;
100                }
101                return maxSelectableDate;
102        }
103
104        /**
105         * Sets the minimum selectable date. If null, the date 01\01\0001 will be set instead.
106         * 
107         * @param min the minimum selectable date
108         * 
109         * @return the minimum selectable date
110         */
111        public Date setMinSelectableDate(Date min) {
112                if (min == null) {
113                        minSelectableDate = defaultMinSelectableDate;
114                } else {
115                        minSelectableDate = min;
116                }
117                return minSelectableDate;
118        }
119
120        /**
121         * Gets the maximum selectable date.
122         * 
123         * @return the maximum selectable date
124         */
125        public Date getMaxSelectableDate() {
126                return maxSelectableDate;
127        }
128
129        /**
130         * Gets the minimum selectable date.
131         * 
132         * @return the minimum selectable date
133         */
134        public Date getMinSelectableDate() {
135                return minSelectableDate;
136        }
137
138        /**
139         * Checks a given date if it is in the formally specified date range.
140         * 
141         * @param date
142         *            the date to check
143         * @return true, if the date is within minSelectableDate and
144         *         maxSelectableDate
145         */
146        public boolean checkDate(Date date) {
147                Calendar calendar = Calendar.getInstance();
148                calendar.setTime(date);
149                calendar.set(Calendar.HOUR_OF_DAY, 0);
150                calendar.set(Calendar.MINUTE, 0);
151                calendar.set(Calendar.SECOND, 0);
152                calendar.set(Calendar.MILLISECOND, 0);
153
154                Calendar minCal = Calendar.getInstance();
155                minCal.setTime(minSelectableDate);
156                minCal.set(Calendar.HOUR_OF_DAY, 0);
157                minCal.set(Calendar.MINUTE, 0);
158                minCal.set(Calendar.SECOND, 0);
159                minCal.set(Calendar.MILLISECOND, 0);
160
161                Calendar maxCal = Calendar.getInstance();
162                maxCal.setTime(maxSelectableDate);
163                maxCal.set(Calendar.HOUR_OF_DAY, 0);
164                maxCal.set(Calendar.MINUTE, 0);
165                maxCal.set(Calendar.SECOND, 0);
166                maxCal.set(Calendar.MILLISECOND, 0);
167
168                return !(calendar.before(minCal) || calendar.after(maxCal));
169        }
170
171}