All pastes #74015 Raw Edit

Miscellany

public text v1 · immutable
#74015 ·published 2006-06-28 15:33 UTC
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) {    }


}