rendered paste body/*
* 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<dayOfWeek; m++,i++)
{
days[i].setVisible(true);
days[i].setEnabled(false);
days[i].setText("");
}
int j = 0;
int curMonth = cDate.get(Calendar.MONTH);
for(;curMonth == cDate.get(Calendar.MONTH);)
{
if(j + 1 == day) {
selectedDay = days[i + j];
makePreviousButtonNormal();
makeButtonRound(days[i+j],i,j);
}
days[i + j].setText(Integer.toString(j + 1));
days[i + j].setVisible(true);
days[i + j].setEnabled(true);
if(cDate.get(Calendar.DAY_OF_YEAR) == today.get(Calendar.DAY_OF_YEAR) &&
cDate.get(Calendar.YEAR) == today.get(Calendar.YEAR)) {
days[i + j].setForeground(Color.RED);
}
else
days[i + j].setForeground(Color.BLACK);
cDate.add(Calendar.DAY_OF_MONTH, 1);
j++;
}
for(int k = i + j; k<days.length; k++)
{
days[k].setVisible(true);
days[k].setEnabled(false);
days[k].setText("");
}
updateMonthLabel();
updateUI();
repaint();
if (m_pnlDaysSub !=null)
m_pnlDaysSub.updateUI();
}
/* Overridden
* @see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent)
*/
public void actionPerformed(ActionEvent arg0) {
String cmd = arg0.getActionCommand();
if (cmd.equals(NEXTMONTH)) {
calendar.add(Calendar.MONTH,1);
makePreviousButtonNormal();
setDay(calendar.get(Calendar.DAY_OF_MONTH));
} else if (cmd.equals(PREVMONTH)) {
calendar.add(Calendar.MONTH,-1);
makePreviousButtonNormal();
setDay(calendar.get(Calendar.DAY_OF_MONTH));
} else if (cmd.equals(PREVYEAR)) {
calendar.add(Calendar.YEAR,-1);
makePreviousButtonNormal();
setDay(calendar.get(Calendar.DAY_OF_MONTH));
} else if (cmd.equals(NEXTYEAR)) {
calendar.add(Calendar.YEAR,1);
makePreviousButtonNormal();
setDay(calendar.get(Calendar.DAY_OF_MONTH));
}
else {
JButton jbutton = (JButton)arg0.getSource();
String s = jbutton.getText();
int i = (new Integer(s)).intValue();
makePreviousButtonNormal();
setDay(i);
}
}
public void setDay(int iDay)
{
if(iDay < 1)
iDay = 1;
Calendar cDate = (Calendar)calendar.clone();
cDate.set(Calendar.DAY_OF_MONTH, 1);
cDate.add(Calendar.MONTH, 1);
cDate.add(Calendar.DAY_OF_MONTH, -1);
int lastDay = cDate.get(Calendar.DAY_OF_MONTH);
if( iDay > 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<days.length; i++)
{
if(!days[i].getText().equals(Integer.toString(day)))
continue;
selectedDay = days[i];
//selectedDay.setBackground(Color.GREEN);
break;
}
drawDays();
String d = DateTime.formatDateTime(getSelectedDate(),true);
if (m_receiver != null) m_receiver.setDate(d,m_flag);
}
public void setDay(Timestamp t)
{
// calendar.setTimeInMillis(t.getTime());
// int day = calendar.get(Calendar.DAY_OF_MONTH);
//
// drawDays();
// for(int i=0; i<days.length; i++)
// {
// if(!days[i].getText().equals(Integer.toString(day)))
// continue;
// selectedDay = days[i];
// selectedDay.setBackground(Color.BLUE);
// break;
// }
//
// if(selectedDay != null)
// selectedDay.repaint();
//
// if (m_receiver != null) m_receiver.setCalendar(calendar);
calendar.setTimeInMillis(t.getTime());
setDay(calendar.get(Calendar.DAY_OF_MONTH));
}
public Timestamp getSelectedDate() {
return new Timestamp(calendar.getTimeInMillis());
}
private void makeButtonRound(JButton btn, int i, int j) {
GridBagConstraints gbc = new GridBagConstraints();
gbc.gridx=(i+j)%7; gbc.gridy=(j+i)/7 + 1;
gbc.anchor = GridBagConstraints.NORTH;
gbc.fill = GridBagConstraints.BOTH;
gbc.weightx=1.0; gbc.weighty=1.0;
gbc.insets = new Insets(0,0,0,0);
RoundButton r = new RoundButton(btn.getText().trim());
r.setMargin(new Insets(0, 0, 0, 0));
r.setPreferredSize(dayButtonDim);
r.addMouseListener(this);
oldI = i;
oldJ = j;
btnPreviousDate = btn;
m_pnlDaysSub.remove(btn);
days[i+j] = r;
m_pnlDaysSub.add(days[i+j],gbc);
}
private void makePreviousButtonNormal() {
if (m_pnlDaysSub == null || btnPreviousDate == null) return;
GridBagConstraints gbc = new GridBagConstraints();
gbc.gridx=(oldI+oldJ)%7; gbc.gridy=(oldI+oldJ)/7 + 1;
gbc.anchor = GridBagConstraints.NORTH;
gbc.fill = GridBagConstraints.BOTH;
gbc.weightx=1.0; gbc.weighty=1.0;
gbc.insets = new Insets(0,0,0,0);
m_pnlDaysSub.remove(days[oldI+oldJ]);
days[oldI+oldJ] =btnPreviousDate;
days[oldI+oldJ].setBackground(Color.WHITE);
days[oldI+oldJ].setPreferredSize(dayButtonDim);
m_pnlDaysSub.add(days[oldI+oldJ],gbc);
}
public void mouseClicked(MouseEvent e) {
if (e.getClickCount() == 2) {
String d = DateTime.formatDateTime(getSelectedDate(),true);
if (m_receiver != null) m_receiver.setDate(d,DOUBLE_CLICK);
}
}
public void mouseEntered(MouseEvent e) { }
public void mouseExited(MouseEvent e) { }
public void mousePressed(MouseEvent e) { }
public void mouseReleased(MouseEvent e) { }
}