package app.astrosoft.ui.cal; import java.awt.*; import java.util.Calendar; import javax.swing.*; import app.astrosoft.ui.util.UIConsts; public final class JCalendar extends JPanel { protected JCalendar() { days = new int[7][6]; startYear = 1901; endYear = 2099; firstDay = 0; showCurrentDate = false; initializeVariables(); setBackground(new Color(255,255,255)); } protected JCalendar(int firstDay, boolean showCurrentDate) { days = new int[7][6]; startYear = 1901; endYear = 2099; this.firstDay = firstDay; this.showCurrentDate = showCurrentDate; initializeVariables(); } protected JCalendar(int firstDay, boolean showCurrentDate, int startYear, int endYear) { days = new int[7][6]; this.startYear = startYear; this.endYear = endYear; this.firstDay = firstDay; this.showCurrentDate = showCurrentDate; initializeVariables(); } private void initializeVariables() { buttonItemListener = new ButtonItemListener(this); comboBoxListener = new ComboBoxItemListener(this); calendar = Calendar.getInstance(); showForYear = calendar.get(1); showForMonth = calendar.get(2); daySelected = (new Integer(calendar.get(5))).toString(); monthSelected = (new Integer(calendar.get(2) + 1)).toString(); yearSelected = (new Integer(calendar.get(1))).toString(); datePanel = new JPanel(); datePanel.setLayout(new BorderLayout()); yearCombo = createYearCombo(); yearCombo.setFont(yearCombo.getFont().deriveFont(1, 11F)); monthCombo = createMonthCombo(); monthCombo.setFont(monthCombo.getFont().deriveFont(1, 11F)); datePanel.add(yearCombo, "East"); datePanel.add(monthCombo, "Center"); centrePanel = new JPanel(); centrePanel.setBackground(new Color(255,255,255)); centrePanel.setLayout(new BorderLayout(5, 5)); centrePanel.add(datePanel, "North"); if(showCurrentDate) { currentDateLabel = new JLabel("Today's Date : " + daySelected + "/" + monthSelected + "/" + yearSelected); currentDateLabel.setFont(currentDateLabel.getFont().deriveFont(1, 11F)); currentDatePanel = new JPanel(); currentDatePanel.setLayout(new FlowLayout(1)); currentDatePanel.setBorder(BorderFactory.createEtchedBorder()); currentDatePanel.add(currentDateLabel); centrePanel.add(currentDatePanel, "South"); } add(centrePanel); yearCombo.addItemListener(comboBoxListener); monthCombo.addItemListener(comboBoxListener); } protected final void initializeCalendar() { monthCombo.removeItemListener(comboBoxListener); yearCombo.removeItemListener(comboBoxListener); if(showCalendarForDateSelected) monthCombo.setSelectedIndex(showForMonth - 1); else monthCombo.setSelectedIndex(showForMonth); yearCombo.setSelectedItem(new Integer(showForYear)); if(showCalendarForDateSelected) days = createCalendar(showForYear, showForMonth - 1); else days = createCalendar(showForYear, showForMonth); if(daysPanel != null) centrePanel.remove(daysPanel); createDaysPanel(); centrePanel.add(daysPanel, "Center"); setBorder(BorderFactory.createLineBorder(new Color(0,0,0))); monthCombo.addItemListener(comboBoxListener); yearCombo.addItemListener(comboBoxListener); } private final int[][] createCalendar(int year, int month) { boolean calendarCompleted = false; days = new int[7][6]; Calendar calendar = Calendar.getInstance(); calendar.set(year, month, 1); int number = calendar.get(7); int k = 1; for(int j = 0; j < 6; j++) { int i = 0; if(j == 0) if(firstDay == 0) { i = number - 1; } else { i = number - 2; if(i < 0) i = 6; } for(; i < 7; i++) { days[i][j] = k; if(month <= 6) { if(month % 2 == 0) { if(k == 31) { calendarCompleted = true; break; } } else if(month == 1) { if(year % 4 == 0) { if(k == 29) { calendarCompleted = true; break; } } else if(k == 28) { calendarCompleted = true; break; } } else if(k == 30) { calendarCompleted = true; break; } } else if(month % 2 == 0) { if(k == 30) { calendarCompleted = true; break; } } else if(k == 31) { calendarCompleted = true; break; } k++; } if(calendarCompleted) break; } return days; } private final JComboBox createYearCombo() { JComboBox combo = new JComboBox(); for(int i = startYear; i <= endYear; i++) combo.addItem(new Integer(i)); combo. setBackground(new Color(255,255,255)); return combo; } private final JComboBox createMonthCombo() { JComboBox list = new JComboBox(); list.addItem("January"); list.addItem("February"); list.addItem("March"); list.addItem("April"); list.addItem("May"); list.addItem("June"); list.addItem("July"); list.addItem("August"); list.addItem("September"); list.addItem("October"); list.addItem("November"); list.addItem("December"); list. setBackground(new Color(255,255,255)); return list; } private final void createDaysPanel() { daysPanel = new JPanel(); daysPanel.setBackground(UIConsts.CAL_COMBO_BACKGROUND); daysPanel.setBorder(BorderFactory.createEtchedBorder()); daysPanel.setLayout(new GridLayout(7, 7)); JDayLabel sunday = new JDayLabel(" Sun "); JDayLabel monday = new JDayLabel(" Mon "); JDayLabel tuesday = new JDayLabel(" Tue "); JDayLabel wednesday = new JDayLabel(" Wed "); JDayLabel thursday = new JDayLabel(" Thu "); JDayLabel friday = new JDayLabel(" Fri "); JDayLabel saturday = new JDayLabel(" Sat "); sunday.setForeground(Color.RED); if(firstDay == 0) { daysPanel.add(sunday); daysPanel.add(monday); daysPanel.add(tuesday); daysPanel.add(wednesday); daysPanel.add(thursday); daysPanel.add(friday); daysPanel.add(saturday); } else { daysPanel.add(monday); daysPanel.add(tuesday); daysPanel.add(wednesday); daysPanel.add(thursday); daysPanel.add(friday); daysPanel.add(saturday); daysPanel.add(sunday); } ButtonGroup buttonGroup = new ButtonGroup(); for(int i = 0; i < 6; i++) { for(int k = 0; k < 7; k++) if(days[k][i] == 0) { JDayButton dayButton = new JDayButton(); daysPanel.add(dayButton); } else { JDayButton dayButton = new JDayButton((new Integer(days[k][i])).toString()); Integer selectedYear = (Integer)yearCombo.getSelectedItem(); //System.out.println(days[k][i] + "," + daySelected + "," + monthCombo.getSelectedIndex() + "," + ((new Integer(monthSelected)).intValue() - 1) + "," + selectedYear + "," + yearSelected); if(days[k][i] == (new Integer(daySelected)).intValue() && monthCombo.getSelectedIndex() == (new Integer(monthSelected)).intValue() - 1 && selectedYear.intValue() == (new Integer(yearSelected)).intValue()){ dayButton.setForeground(Color.RED); dayButton.setSelected(true); } dayButton.addItemListener(buttonItemListener); buttonGroup.add(dayButton); daysPanel.add(dayButton); } } } protected void showCalendarForDate(int year, int month) { showForMonth = month; showForYear = year; showCalendarForDateSelected = true; } protected void setDay(String daySelected) { this.daySelected = daySelected; } protected void setMonth(String monthSelected) { this.monthSelected = monthSelected; } protected void setYear(String yearSelected) { this.yearSelected = yearSelected; } protected String getDay() { return daySelected; } protected String getMonth() { return monthSelected; } protected String getYear() { return yearSelected; } private int days[][]; private JPanel daysPanel; private JPanel datePanel; private JPanel currentDatePanel; private String daySelected; private String monthSelected; private String yearSelected; private JPanel centrePanel; public JComboBox yearCombo; public JComboBox monthCombo; private Calendar calendar; protected ButtonItemListener buttonItemListener; private int showForYear; private int showForMonth; private ComboBoxItemListener comboBoxListener; private boolean showCalendarForDateSelected; private boolean showCurrentDate; private int firstDay; private JLabel currentDateLabel; private int startYear; private int endYear; }