/* * Created on Mar 8, 2005 */ package com.firsthealthinc.components; import java.awt.Color; import java.awt.Dimension; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.Insets; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.sql.Timestamp; import java.text.DateFormatSymbols; import java.util.Calendar; import java.util.Date; import java.util.Locale; import javax.swing.JButton; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JSpinner; import javax.swing.SpinnerDateModel; import javax.swing.SpinnerModel; import javax.swing.border.EmptyBorder; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; import com.firsthealthinc.common.DateTime; import com.firsthealthinc.receivers.DateReceiver; /** * @author lunk */ public class CalendarPanel extends JPanel implements ActionListener,MouseListener { private static DateFormatSymbols dfSymb; private static String[] SHORTDAYNAMES; private int day; private final String PREVMONTH="previousmonth"; private final String NEXTMONTH="nextmonth"; private final String PREVYEAR="previousyear"; private final String NEXTYEAR="nextyear"; public final static int DOUBLE_CLICK=-2; private JButton btnPrevMonth; private JButton btnNextMonth; private JButton btnPrevYear; private JButton btnNextYear; private JSpinner spnDate; private Calendar calendar; private Calendar today; private JLabel lblSelection; private JButton[] days; private JLabel[] daynames; private JButton selectedDay; private JPanel m_pnlDaysSub; private JButton btnPreviousDate; private int oldI; private int oldJ; private Dimension dayButtonDim; private DateReceiver m_receiver; private int m_flag; private ChangeListener chgListener; public CalendarPanel(Calendar selectDate,DateReceiver r, int flag) { super(new GridBagLayout()); calendar = selectDate; m_receiver = r; m_flag = flag; buildControls(); buildPanel(); setDay(calendar.get(Calendar.DAY_OF_MONTH)); } private void buildControls() { dfSymb = new DateFormatSymbols(); SHORTDAYNAMES = dfSymb.getShortWeekdays(); btnPreviousDate = null; today = Calendar.getInstance(Locale.getDefault()); days = new JButton[42]; daynames = new JLabel[7]; dayButtonDim = new Dimension(25,25); btnPrevMonth = new JButton("<"); btnNextMonth = new JButton(">"); btnPrevYear = new JButton("<<"); btnNextYear = new JButton(">>"); chgListener = new ChangeListener() { public void stateChanged(ChangeEvent e) { Date oldDate = calendar.getTime(); Date t = (Date) spnDate.getValue(); Calendar c = Calendar.getInstance(); c.setTime(t); if (c.get(Calendar.YEAR)<100) { JOptionPane.showMessageDialog(null, "Please use 4 digit year. Resetting to current value."); t = oldDate; } if (m_pnlDaysSub!=null) { setDay(new Timestamp(t.getTime())); } } }; SpinnerModel spnmdlDate = new SpinnerDateModel( new Timestamp(calendar.getTimeInMillis()), null, null, Calendar.DAY_OF_MONTH ); spnDate = new JSpinner(spnmdlDate); spnDate.setToolTipText("Double click a field to use spinner."); spnDate.setEditor(new JSpinner.DateEditor(spnDate, "MM/dd/yyyy")); spnDate.getModel().addChangeListener(chgListener); lblSelection = new JLabel("Selection: " ,JLabel.CENTER); lblSelection.setForeground(Color.RED); } private void buildPanel() { m_pnlDaysSub = buildDaysSub(); JPanel nav = buildNavigationSub(); GridBagConstraints gbc = new GridBagConstraints(); gbc.anchor = GridBagConstraints.NORTH; gbc.fill = GridBagConstraints.BOTH; gbc.weightx=1.0; gbc.weighty=1.0; //setBackground(Color.WHITE); gbc.gridx=0; gbc.gridy=0; nav.setPreferredSize(new Dimension(25*8,25*2)); add(nav,gbc); gbc.gridy++; m_pnlDaysSub.setPreferredSize(new Dimension(25*8,25*7)); add(m_pnlDaysSub,gbc); setPreferredSize(new Dimension(25*8,25*9)); } private JPanel buildNavigationSub() { GridBagConstraints gbc = new GridBagConstraints(); JPanel navSub = new JPanel(new GridBagLayout()); navSub.setBackground(Color.BLUE); gbc.gridy=0; gbc.gridx=0; gbc.anchor = GridBagConstraints.NORTH; gbc.fill = GridBagConstraints.BOTH; gbc.gridwidth=4; navSub.add(spnDate, gbc); gbc.gridx=0; gbc.gridy=1; gbc.gridwidth=1; btnPrevYear.setActionCommand(PREVYEAR); btnPrevYear.addActionListener(this); navSub.add(btnPrevYear,gbc); gbc.gridx++; btnPrevMonth.setActionCommand(PREVMONTH); btnPrevMonth.addActionListener(this); navSub.add(btnPrevMonth,gbc); gbc.gridx++; btnNextMonth.setActionCommand(NEXTMONTH); btnNextMonth.addActionListener(this); navSub.add(btnNextMonth,gbc); gbc.gridx++; btnNextYear.setActionCommand(NEXTYEAR); btnNextYear.addActionListener(this); navSub.add(btnNextYear,gbc); return navSub; } private void updateMonthLabel() { //Avoids infinite loops spnDate.getModel().removeChangeListener(chgListener); spnDate.setValue(new Timestamp(calendar.getTimeInMillis())); spnDate.getModel().addChangeListener(chgListener); } private JPanel buildDaysSub() { JPanel dSub = new JPanel(); today = Calendar.getInstance(Locale.getDefault()); dSub.setBackground(Color.WHITE); dSub.setLayout(new GridBagLayout()); GridBagConstraints gbc = new GridBagConstraints(); gbc.anchor = GridBagConstraints.NORTH; gbc.fill = GridBagConstraints.BOTH; gbc.weightx=1.0; gbc.weighty=1.0; gbc.gridx=0; gbc.gridy=0; gbc.insets = new Insets(0,0,0,0); // Add Day name labels for (int i=0; i<7; i++) { daynames[i] = new JLabel(SHORTDAYNAMES[i+1],JLabel.CENTER); daynames[i].setForeground(Color.BLUE); gbc.gridx=i; dSub.add(daynames[i],gbc); } // Add Day number buttons gbc.gridy = 1; gbc.gridx=0; for(int i=0; i<6; i++) { for(int j=0; j<7; j++) { int k = j + 7 * i; days[k] = new JButton("x"); days[k].addActionListener(this); days[k].setMargin(new Insets(0, 0, 0, 0)); days[k].setFocusPainted(false); days[k].setBorder(new EmptyBorder(0,0,0,0)); days[k].setBackground(Color.WHITE); days[k].setPreferredSize(dayButtonDim); dSub.add(days[k],gbc); gbc.gridx++; } gbc.gridx=0; gbc.gridy++; } drawDays(); return dSub; } private void drawDays() { makePreviousButtonNormal(); Calendar cDate = (Calendar) calendar.clone(); cDate.set(Calendar.DAY_OF_MONTH, 1); int dayOfWeek = cDate.get(Calendar.DAY_OF_WEEK); int i = 0; for(int m=1; m lastDay ) iDay = lastDay; day = iDay; calendar.set(Calendar.DAY_OF_MONTH,day); if(selectedDay != null) { selectedDay.setBackground(Color.WHITE); selectedDay.repaint(); } for(int i=0; i