package no.ntnu.fp.gui.timepicker; import java.awt.Color; import java.awt.Dimension; import java.awt.GridLayout; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.util.Calendar; import java.util.Date; import javax.swing.JLabel; import javax.swing.JPanel; public class CalendarPanel extends JPanel implements MouseListener, PropertyChangeListener { private final static int ROWS = 6; private final static int COLS = 7; public String[] DAY_LABELS = new String[] { "Ma", "Ti", "On", "To", "Fr", "Lø", "Sø" }; private DayPanel[][] grid; private DateModel model; public CalendarPanel() { this(new DateModel(new Date())); } public CalendarPanel(DateModel date) { setLayout(new GridLayout(7,7)); model = date; model.addPropertyChangeListener(this); for (String day : DAY_LABELS) { JPanel panel = new JPanel(); JLabel label = new JLabel(day); panel.add(label); add(panel); } grid = new DayPanel[ROWS][COLS]; for (int i=0; i<ROWS; i++) { for(int j=0; j<COLS; j++) { DayPanel panel = new DayPanel(model); add(panel); grid[i][j] = panel; } } update(); } private void update() { int startday = model.getMonthStartDay(); int daysInMonth = model.getDaysInMonth(); int activeday = model.getDay(); int day = -1; for(int i=0; i<ROWS; i++) { for (int j=0; j<COLS; j++) { grid[i][j].clearLabel(); grid[i][j].setActive(false); if (i==0 && j == startday) { day = 1; } if (day > 0 && day <= daysInMonth) { grid[i][j].setDay(day); day++; } if (day == activeday) { grid[i][j].setActive(true); } grid[i][j].update(); } } } public void setModel(Date date) { model.setDate(date); } public DateModel getModel() { return model; } @Override public void mouseClicked(MouseEvent e) { Object source = e.getSource(); JLabel label = null; if (source instanceof JPanel) { JPanel panel = (JPanel)source; label = (JLabel)panel.getComponent(0); } else { // (source instanceof JLabel) label = (JLabel) source; } try { int day = Integer.parseInt(label.getText()); model.setDay(day); } catch (NumberFormatException ex) { ex.printStackTrace(); } } public void mousePressed(MouseEvent e) {} public void mouseReleased(MouseEvent e) {} public void mouseEntered(MouseEvent e) {} public void mouseExited(MouseEvent e) {} @Override public void propertyChange(PropertyChangeEvent evt) { update(); } }