Dépôt officiel du code source de l'ERP OpenConcerto
Rev 137 | Blame | Compare with Previous | Last modification | View Log | RSS feed
package org.jopencalendar.ui;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
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.text.DateFormat;
import java.text.DateFormatSymbols;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import javax.swing.BorderFactory;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingConstants;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
public class DatePickerPanel extends JPanel implements ActionListener, MouseListener {
private static final long serialVersionUID = -2882634897084487051L;
public static final String TIME_IN_MILLIS = "timeInMillis";
private int rowCount = 7;
private int colCount = 7;
private int currentYear;
private int currentMonth;
private List<DateLabel> labels = new ArrayList<DateLabel>();
private JLabel title;
private JButton bRight;
private JButton bLeft;
private Date selectedDate;
public DatePickerPanel() {
//
Calendar cal = Calendar.getInstance();
this.selectedDate = cal.getTime();
this.currentYear = cal.get(Calendar.YEAR);
this.currentMonth = cal.get(Calendar.MONTH);
//
this.setLayout(new BorderLayout(2, 2));
JPanel navigator = new JPanel();
navigator.setLayout(new BorderLayout());
String leftFileName = "left.png";
String rightFileName = "right.png";
if (this.getFont().getSize() > 16) {
leftFileName = "left_2x.png";
rightFileName = "right_2x.png";
}
bLeft = new JButton(new ImageIcon(this.getClass().getResource(leftFileName)));
configureButton(bLeft);
navigator.add(bLeft, BorderLayout.WEST);
title = new JLabel("...", SwingConstants.CENTER);
title.setFont(title.getFont().deriveFont(Font.BOLD));
navigator.add(title, BorderLayout.CENTER);
bRight = new JButton(new ImageIcon(this.getClass().getResource(rightFileName)));
configureButton(bRight);
navigator.add(bRight, BorderLayout.EAST);
this.add(navigator, BorderLayout.NORTH);
final JPanel dayPanel = new JPanel() {
private static final long serialVersionUID = 1L;
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.setColor(Color.GRAY);
g.drawLine(0, 0, getWidth(), 0);
}
};
dayPanel.setBackground(Color.WHITE);
dayPanel.setLayout(new GridLayout(rowCount, colCount, 4, 4));
dayPanel.setBorder(BorderFactory.createEmptyBorder(3, 3, 3, 3));
//
String[] dateFormatSymbols = new DateFormatSymbols().getShortWeekdays();
int f = cal.getFirstDayOfWeek();
for (int i = 0; i < colCount; i++) {
int j = i + f;
if (j >= 8) {
j = 1;
}
String d = dateFormatSymbols[j];
final JLabel lDay = new JLabel(d, SwingConstants.RIGHT);
lDay.setMinimumSize(new Dimension(lDay.getPreferredSize().width, lDay.getPreferredSize().width));
dayPanel.add(lDay);
}
//
int c = 0;
final MouseAdapter mListener = new MouseAdapter() {
public long select(MouseEvent e) {
if (e.getSource() instanceof DateLabel) {
final DateLabel dateLabel = (DateLabel) e.getSource();
final Calendar c = Calendar.getInstance();
final long timeInMillis = dateLabel.getTimeInMillis();
c.setTimeInMillis(timeInMillis);
setSelectedDate(c);
return timeInMillis;
}
return -1;
}
@Override
public void mouseDragged(MouseEvent e) {
e.setSource(dayPanel.getComponentAt(SwingUtilities.convertPoint(e.getComponent(), e.getPoint(), dayPanel)));
select(e);
}
@Override
public void mousePressed(MouseEvent e) {
// Nothing
}
@Override
public void mouseReleased(MouseEvent e) {
e.setSource(dayPanel.getComponentAt(SwingUtilities.convertPoint(e.getComponent(), e.getPoint(), dayPanel)));
long timeInMillis = select(e);
if (timeInMillis >= 0) {
firePropertyChange(TIME_IN_MILLIS, Long.valueOf(0), Long.valueOf(timeInMillis));
}
}
};
for (int i = 0; i < rowCount - 1; i++) {
for (int j = 0; j < colCount; j++) {
final DateLabel label = new DateLabel(String.valueOf(c), SwingConstants.RIGHT);
label.addMouseListener(mListener);
label.addMouseMotionListener(mListener);
label.setOpaque(true);
this.labels.add(label);
dayPanel.add(label);
c++;
}
}
this.add(dayPanel, BorderLayout.CENTER);
DateFormat df = DateFormat.getDateInstance(DateFormat.FULL);
// Today
final JLabel date = new JLabel(df.format(new Date()), SwingConstants.CENTER);
date.setBorder(BorderFactory.createEmptyBorder(4, 3, 5, 3));
this.add(date, BorderLayout.SOUTH);
//
updateLabels();
bRight.addActionListener(this);
bLeft.addActionListener(this);
date.addMouseListener(this);
}
public Date getSelectedDate() {
return selectedDate;
}
public void setSelectedDate(Calendar cal) {
if (cal == null) {
this.selectedDate = null;
setDate(Calendar.getInstance());
} else if (this.selectedDate == null || !this.selectedDate.equals(cal.getTime())) {
this.selectedDate = cal.getTime();
setDate(cal);
}
}
public void setDate(Calendar cal) {
this.currentYear = cal.get(Calendar.YEAR);
this.currentMonth = cal.get(Calendar.MONTH);
updateLabels();
}
private void configureButton(final JButton button) {
int buttonSize = button.getIcon().getIconWidth() + 8;
button.setMinimumSize(new Dimension(buttonSize, buttonSize));
button.setPreferredSize(new Dimension(buttonSize, buttonSize));
button.setFocusPainted(false);
button.setBorderPainted(false);
button.setBorder(null);
button.setContentAreaFilled(false);
button.setOpaque(false);
}
private void updateLabels() {
int selectedYear = -1;
int selectedDay = -1;
if (selectedDate != null) {
Calendar calSelected = Calendar.getInstance();
calSelected.setTime(this.selectedDate);
selectedYear = calSelected.get(Calendar.YEAR);
selectedDay = calSelected.get(Calendar.DAY_OF_YEAR);
}
Calendar cal = Calendar.getInstance();
int todayYear = cal.get(Calendar.YEAR);
int todayDay = cal.get(Calendar.DAY_OF_YEAR);
cal.clear();
cal.set(Calendar.YEAR, this.currentYear);
cal.set(Calendar.MONTH, this.currentMonth);
cal.set(Calendar.DAY_OF_MONTH, 1);
SimpleDateFormat sdf = new SimpleDateFormat("MMMM yyyy");
title.setText(sdf.format(cal.getTime()));
int f = cal.getFirstDayOfWeek();
int offset = cal.get(Calendar.DAY_OF_WEEK) - f + 1; // offset du 1er jour du mois par
// rapport a
if (offset < 2) {
offset += 7;
}
// grille
cal.add(Calendar.DAY_OF_YEAR, -offset);
int c = 0;
for (int i = 0; i < rowCount - 1; i++) {
for (int j = 0; j < colCount; j++) {
cal.add(Calendar.DAY_OF_YEAR, 1);
final DateLabel label = this.labels.get(c);
label.setDate(cal);
label.setText(cal.get(Calendar.DAY_OF_MONTH) + " ");
if (cal.get(Calendar.MONTH) != this.currentMonth) {
if (!label.getForeground().equals(Color.GRAY))
label.setForeground(Color.GRAY);
} else {
if (!label.getForeground().equals(Color.BLACK))
label.setForeground(Color.BLACK);
}
if (cal.get(Calendar.YEAR) == todayYear && cal.get(Calendar.DAY_OF_YEAR) == todayDay) {
label.setBackground(Color.LIGHT_GRAY);
label.setForeground(Color.WHITE);
} else {
label.setBackground(Color.WHITE);
}
if (cal.get(Calendar.YEAR) == selectedYear && cal.get(Calendar.DAY_OF_YEAR) == selectedDay) {
label.setBackground(new Color(232, 242, 250));
label.setForeground(Color.BLACK);
}
c++;
}
}
}
@Override
public void setFocusable(boolean focusable) {
super.setFocusable(focusable);
bRight.setFocusable(focusable);
bLeft.setFocusable(focusable);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (Exception e1) {
e1.printStackTrace();
}
final JFrame f = new JFrame();
final DatePickerPanel picker = new DatePickerPanel();
picker.addPropertyChangeListener(TIME_IN_MILLIS, new PropertyChangeListener() {
@Override
public void propertyChange(PropertyChangeEvent evt) {
final Long millis = (Long) evt.getNewValue();
Calendar c = Calendar.getInstance();
c.setTimeInMillis(millis);
f.dispose();
}
});
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setContentPane(picker);
f.pack();
f.setLocationRelativeTo(null);
f.setVisible(true);
final JFrame f1 = new JFrame();
final DatePicker p = new DatePicker();
Calendar c = Calendar.getInstance();
c.set(Calendar.YEAR, 2010);
c.set(Calendar.MONTH, 2);
c.set(Calendar.DAY_OF_MONTH, 1);
p.setDate(c.getTime());
p.setDate(null);
final JPanel pRed = new JPanel();
pRed.setBackground(Color.RED);
pRed.add(p);
pRed.add(new JTextField("Dummy TextField"));
f1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f1.setContentPane(pRed);
f1.pack();
f1.setLocation(f.getLocation().x + f.getWidth() + 10, f.getLocation().y);
f1.setVisible(true);
}
});
}
@Override
public void actionPerformed(ActionEvent e) {
// Buttons + / -
Calendar cal = Calendar.getInstance();
cal.clear();
cal.set(Calendar.YEAR, this.currentYear);
cal.set(Calendar.MONTH, this.currentMonth);
if (e.getSource().equals(this.bLeft)) {
cal.add(Calendar.MONTH, -1);
} else if (e.getSource().equals(this.bRight)) {
cal.add(Calendar.MONTH, 1);
}
setDate(cal);
}
@Override
public void mouseClicked(MouseEvent e) {
}
@Override
public void mousePressed(MouseEvent e) {
Calendar cal = Calendar.getInstance();
cal.set(Calendar.SECOND, 0);
cal.set(Calendar.MILLISECOND, 0);
if (e.getClickCount() > 1) {
setSelectedDate(cal);
firePropertyChange(TIME_IN_MILLIS, Long.valueOf(0), Long.valueOf(cal.getTimeInMillis()));
} else {
setDate(cal);
}
}
@Override
public void mouseReleased(MouseEvent e) {
// Nothing
}
@Override
public void mouseEntered(MouseEvent e) {
// Nothing
}
@Override
public void mouseExited(MouseEvent e) {
// Nothing
}
}