package open.dolphin.client;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeSupport;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.GregorianCalendar;
import java.util.HashMap;
import javax.swing.*;
import open.dolphin.infomodel.SimpleDate;
/**
* CalendarCardPanel
*
* @author Minagawa,Kazushi
*/
public class CalendarCardPanel extends JPanel {
public static final String PICKED_DATE = "pickedDate";
private final JPanel cardPanel = new JPanel();
private final CardLayout cardLayout = new CardLayout();
private final ImageIcon backIcon = ClientContext.getImageIconArias("icon_play_back");
private final ImageIcon stopIcon = ClientContext.getImageIconArias("icon_stop_play");
private final ImageIcon forwardIcon = ClientContext.getImageIconArias("icon_play");
private final JButton backBtn = new JButton(backIcon);
private final JButton stopBtn = new JButton(stopIcon);
private final JButton forwardBtn = new JButton(forwardIcon);
private int current;
private int[] range;
private SimpleDate[] acceptRange;
private final HashMap<String, LiteCalendarPanel> calendars = new HashMap<>(12,1.0f);
private final HashMap colorTable;
private ArrayList markList;
private final PropertyChangeSupport boundSupport = new PropertyChangeSupport(this);
private final PropertyChangeListener calendarListener;
private static final int TITLE_ALIGN = SwingConstants.CENTER;
private static final int TITLE_FONT_SIZE = 14;
private static final Font TITLE_FONT = new Font("Dialog", Font.PLAIN, TITLE_FONT_SIZE);
private final JLabel titleLable;
private final Color titleFore = ClientContext.getColor("color.calendar.title.fore");
private final Color titleBack = ClientContext.getColor("color.calendar.title.back");
private final int titleAlign = TITLE_ALIGN;
private final Font titleFont = TITLE_FONT;
/**
* CalendarCardPanelを生成する。
*
* @param colorTable カラーテーブル
*/
public CalendarCardPanel(HashMap colorTable) {
this.colorTable = colorTable;
calendarListener = new CalendarListener(this);
LiteCalendarPanel lc = new LiteCalendarPanel(current, false);
lc.addPropertyChangeListener(LiteCalendarPanel.SELECTED_DATE_PROP, calendarListener);
lc.setEventColorTable(colorTable);
SimpleDate today = new SimpleDate(new GregorianCalendar());
lc.setToday(today);
String name = String.valueOf(current);
calendars.put(name, lc);
cardPanel.setLayout(cardLayout);
cardPanel.add(lc, name);
backBtn.setMargin(new Insets(0,0,0,0));
stopBtn.setMargin(new Insets(0,0,0,0));
forwardBtn.setMargin(new Insets(0,0,0,0));
backBtn.addActionListener((ActionEvent e) -> {
current -= 1;
controlNavigation();
showCalendar();
});
stopBtn.addActionListener((ActionEvent e) -> {
current = 0;
controlNavigation();
showCalendar();
});
forwardBtn.addActionListener((ActionEvent e) -> {
current+=1;
controlNavigation();
showCalendar();
});
titleLable = new JLabel();
titleLable.setHorizontalAlignment(titleAlign);
titleLable.setFont(titleFont);
titleLable.setForeground(titleFore);
titleLable.setBackground(titleBack);
JPanel cmdPanel = createCommnadPanel();
updateTitle(lc, titleLable);
cmdPanel.add(titleLable);
this.setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
this.add(cmdPanel);
this.add(cardPanel);
Dimension size = this.getPreferredSize();
int h = size.height;
int w = 290; // 268
size = new Dimension(w, h);
this.setMinimumSize(size);
this.setMaximumSize(size);
}
private void updateTitle(LiteCalendarPanel lc, JLabel label) {
//minagawa^ I18N
// StringBuilder buf = new StringBuilder();
// buf.append(lc.getYear());
// buf.append(ClientContext.getString("calendar.title.year"));
// buf.append(" ");
// String m = String.valueOf(lc.getMonth() + 1);
// if (m.length()==1) {
// buf.append("0");
// }
// buf.append(m);
// buf.append(ClientContext.getString("calendar.title.month"));
// label.setText(buf.toString());
GregorianCalendar gc = new GregorianCalendar(lc.getYear(), lc.getMonth(), 1);
String fmt = ClientContext.getString("calendar.title.yearMonth");
SimpleDateFormat sdf = new SimpleDateFormat(fmt);
String dateString = sdf.format(gc.getTime());
label.setText(dateString);
//minagawa$
}
@Override
public void addPropertyChangeListener(String prop, PropertyChangeListener l) {
boundSupport.addPropertyChangeListener(prop, l);
}
@Override
public void removePropertyChangeListener(String prop, PropertyChangeListener l) {
boundSupport.removePropertyChangeListener(prop, l);
}
public void notifyPickedDate(SimpleDate picked) {
boundSupport.firePropertyChange(PICKED_DATE, null, picked);
}
public int[] getRange() {
return range;
}
public void setCalendarRange(int[] range) {
this.range = range;
controlNavigation();
}
public void setAcceptRange(SimpleDate[] range) {
this.acceptRange = range;
String key = String.valueOf(current);
LiteCalendarPanel lc = (LiteCalendarPanel)calendars.get(key);
lc.setAcceptRange(this.acceptRange);
}
public void setMarkList(ArrayList newMark) {
if (markList != newMark) {
markList = newMark;
}
LiteCalendarPanel lc = (LiteCalendarPanel)calendars.get(String.valueOf(current));
lc.getTableModel().setMarkDates(markList);
}
private void controlNavigation() {
if (range != null) {
if (current == range[0]) {
if (backBtn.isEnabled()) {
backBtn.setEnabled(false);
}
if (! forwardBtn.isEnabled()) {
forwardBtn.setEnabled(true);
}
} else if (current == range[1]) {
if (forwardBtn.isEnabled()) {
forwardBtn.setEnabled(false);
}
if (! backBtn.isEnabled()) {
backBtn.setEnabled(true);
}
} else {
if (! backBtn.isEnabled()) {
backBtn.setEnabled(true);
}
if (! forwardBtn.isEnabled()) {
forwardBtn.setEnabled(true);
}
}
}
}
private void showCalendar() {
String key = String.valueOf(current);
LiteCalendarPanel lc = (LiteCalendarPanel)calendars.get(key);
if (lc == null) {
lc = new LiteCalendarPanel(current, false);
lc.setAcceptRange(this.acceptRange);
lc.addPropertyChangeListener(LiteCalendarPanel.SELECTED_DATE_PROP, calendarListener);
lc.setEventColorTable(colorTable);
lc.getTableModel().setMarkDates(markList);
calendars.put(key, lc);
cardPanel.add(lc, key);
} else {
lc.getTableModel().setMarkDates(markList);
}
updateTitle(lc, titleLable);
cardLayout.show(cardPanel, key);
}
private JPanel createCommnadPanel() {
JPanel cmd = new JPanel();
cmd.setLayout(new BoxLayout(cmd, BoxLayout.X_AXIS));
backBtn.setMargin(new Insets(0,0,0,0));
stopBtn.setMargin(new Insets(0,0,0,0));
forwardBtn.setMargin(new Insets(0,0,0,0));
cmd.add(backBtn);
cmd.add(Box.createHorizontalStrut(2));
cmd.add(stopBtn);
cmd.add(Box.createHorizontalStrut(2));
cmd.add(forwardBtn);
cmd.add(Box.createHorizontalStrut(2));
return cmd;
}
class CalendarListener implements PropertyChangeListener {
private final CalendarCardPanel owner;
public CalendarListener(CalendarCardPanel owner) {
this.owner = owner;
}
@Override
public void propertyChange(PropertyChangeEvent e) {
if (e.getPropertyName().equals(LiteCalendarPanel.SELECTED_DATE_PROP)) {
SimpleDate sd = (SimpleDate)e.getNewValue();
owner.notifyPickedDate(sd);
}
}
}
}