/*
* DateChooserDialog.java
*
* Created on 13 ������� 2006 �., 13:37
*
*/
package datechooser.beans;
import static datechooser.beans.locale.LocaleUtils.getEditorLocaleString;
import datechooser.events.CommitEvent;
import datechooser.events.CommitListener;
import datechooser.events.CursorMoveListener;
import datechooser.events.SelectionChangedListener;
import datechooser.model.exeptions.IncompatibleDataExeption;
import datechooser.model.multiple.MultyModelBehavior;
import datechooser.model.multiple.Period;
import datechooser.model.multiple.PeriodSet;
import datechooser.view.BackRenderer;
import datechooser.view.WeekDaysStyle;
import datechooser.view.appearance.AppearancesList;
import java.awt.*;
import java.awt.event.*;
import java.beans.*;
import java.io.Serializable;
import java.util.*;
import javax.swing.*;
/**
* Bean: dialog for date selection. Not visual.<br>
* ���������: ���������� ���� ��� ������ ���. �� ����������.
* @author Androsov Vadim
* @since 1.0
*/
public class DateChooserDialog implements DateChooserBean, Serializable, PropertyChangeListener {
public static final long serialVersionUID = 8940585643117164408L;
/**
* Dialog property's name prefix.<br>
* ��������� � ��������� ���� ������� ����������� ���� ������ ����.
* @since 1.0
*/
public static final String DIALOG_PREFIX = PREFIX + "dialog_";
/**
* Property name. <br>
* �������� ��������.
* @see DateChooserDialog#isModal()
* @since 1.0
*/
public static final String PROPERTY_MODAL = DIALOG_PREFIX + "modal";
/**
* Property name. <br>
* �������� ��������.
* @see DateChooserDialog#getCaption()
* @since 1.0
*/
public static final String PROPERTY_CAPTION = DIALOG_PREFIX + "caption";
private DateChooserPanel chooser;
private JPanel dialogPanel;
private JDialog dialog = null;
private Iterable<Period> state;
private String caption;
private boolean modal;
private PropertyChangeSupport changeSupport;
public DateChooserDialog() {
changeSupport = new PropertyChangeSupport(this);
setModal(true);
chooser = new DateChooserPanel();
chooser.addPropertyChangeListener(this);
dialogPanel = getDialogPane();
setCaption("");
addCommitListener(new CommitListener() {
public void onCommit(CommitEvent evt) {
disposeDialog();
}
});
UIManager.addPropertyChangeListener(new PropertyChangeListener() {
public void propertyChange(PropertyChangeEvent evt) {
SwingUtilities.updateComponentTreeUI(dialogPanel);
}
});
}
/**
* Modal dialog.<br>
* ����������� ����.
* @since 1.0
*/
public boolean isModal() {
return modal;
}
/**
* @see DateChooserDialog#isModal()
* @since 1.0
*/
public void setModal(boolean modal) {
boolean old = isModal();
this.modal = modal;
changeSupport.firePropertyChange(PROPERTY_MODAL, old, isModal());
}
/**
* Dialog caption.<br>
* ��������� ����.
* @since 1.0
*/
public String getCaption() {
return caption;
}
/**
* @see DateChooserDialog#getCaption()
* @since 1.0
*/
public void setCaption(String caption) {
String old = getCaption();
this.caption = caption;
changeSupport.firePropertyChange(PROPERTY_CAPTION, old, getCaption());
}
/**
* Displays dialog window using "modal" property.<br>
* ���������� ���������� ���� �������� �������� "���������"
* @see DateChooserDialog#showDialog(Frame, boolean)
* @see DateChooserDialog#isModal()
* @since 1.0
*/
public void showDialog(Frame owner) {
showDialog(owner, isModal());
}
/**
* Displays dialog window centered in relation to the parent.<br>
* ���������� ���������� ���� �� ������ ������������ ��������.
* @param owner Parent component.<br>
* ������������ ���������.
* @param isModal Is dialog modal.<br> �����������
* @since 1.0
*/
public void showDialog(Frame owner, boolean isModal) {
Dimension ownerSize = null;
if (owner != null) {
ownerSize = owner.getSize();
} else {
ownerSize = Toolkit.getDefaultToolkit().getScreenSize();
}
Dimension dim = dialogPanel.getPreferredSize();
Point location = new Point(
(ownerSize.width - dim.width) / 2,
(ownerSize.height - dim.height) / 2);
showDialog(owner, isModal, location);
}
/**
* Displays dialog window with specified location.<br>
* ���������� ���������� � �������� �������.
* @param owner Parent component.<br>
* ������������ ���������.
* @param isModal Is dialog modal.<br> �����������
* @since 1.1
*/
public void showDialog(Frame owner, boolean isModal, Point location) {
dialog = new JDialog(owner, isModal);
dialog.setDefaultCloseOperation(JDialog.DO_NOTHING_ON_CLOSE);
dialog.addWindowListener(new OnClose());
dialog.setContentPane(dialogPanel);
dialog.setTitle(getCaption());
saveState();
Dimension dim = dialogPanel.getPreferredSize();
dialog.setSize(dim.width, dim.height + 80);
dialog.setLocation(location);
dialog.pack();
dialog.setVisible(true);
}
public MultyModelBehavior getBehavior() {
return chooser.getBehavior();
}
public AppearancesList getCurrentView() {
return chooser.getCurrentView();
}
public PeriodSet getDefaultPeriods() {
return chooser.getDefaultPeriods();
}
public PeriodSet getForbiddenPeriods() {
return chooser.getForbiddenPeriods();
}
public Calendar getMaxDate() {
return chooser.getMaxDate();
}
public Calendar getMinDate() {
return chooser.getMinDate();
}
public Calendar getSelectedDate() {
return chooser.getSelectedDate();
}
public PeriodSet getSelectedPeriodSet() {
return chooser.getSelectedPeriodSet();
}
public Iterable<Period> getSelection() {
return chooser.getSelection();
}
public boolean isAutoScroll() {
return chooser.isAutoScroll();
}
public boolean isEnabled() {
return chooser.isEnabled();
}
public boolean isShowOneMonth() {
return chooser.isShowOneMonth();
}
public void setAutoScroll(boolean autoScroll) {
chooser.setAutoScroll(autoScroll);
}
public void setBehavior(MultyModelBehavior behavior) {
chooser.setBehavior(behavior);
}
public void setCurrentView(AppearancesList aList) {
chooser.setCurrentView(aList);
}
public void setDefaultPeriods(PeriodSet periods) throws IncompatibleDataExeption {
chooser.setDefaultPeriods(periods);
}
public void setEnabled(boolean enabled) {
chooser.setEnabled(enabled);
}
public void setForbidden(Iterable<Period> forbiddenPeriods) {
chooser.setForbidden(forbiddenPeriods);
}
public void setForbiddenPeriods(PeriodSet periods) throws IncompatibleDataExeption {
chooser.setForbiddenPeriods(periods);
}
public void setMaxDate(Calendar aDate) {
chooser.setMaxDate(aDate);
}
public void setMinDate(Calendar aDate) {
chooser.setMinDate(aDate);
}
public void setSelectedDate(Calendar aDate) {
chooser.setSelectedDate(aDate);
}
public void setSelection(Iterable<Period> periods) {
chooser.setSelection(periods);
}
public void setSelection(PeriodSet periods) {
chooser.setSelection(periods);
}
public void setShowOneMonth(boolean showOneMonth) {
chooser.setShowOneMonth(showOneMonth);
}
public Dimension getPreferredSize() {
return chooser.getPreferredSize();
}
public Font getNavigateFont() {
return chooser.getNavigateFont();
}
public void setNavigateFont(Font font) {
chooser.setNavigateFont(font);
}
public Locale getLocale() {
return chooser.getLocale();
}
public void setLocale(Locale locale) {
chooser.setLocale(locale);
}
public int getCurrentNavigateIndex() {
return chooser.getCurrentNavigateIndex();
}
public void setCurrentNavigateIndex(int currentNavigateIndex) {
chooser.setCurrentNavigateIndex(currentNavigateIndex);
}
public boolean isLocked() {
return chooser.isLocked();
}
public void setLocked(boolean lock) {
chooser.setLocked(lock);
}
public WeekDaysStyle getWeekStyle() {
return chooser.getWeekStyle();
}
public void setWeekStyle(WeekDaysStyle weekStyle) {
chooser.setWeekStyle(weekStyle);
}
public Calendar getCurrent() {
return chooser.getCurrent();
}
public boolean setCurrent(Calendar aDate) {
return chooser.setCurrent(aDate);
}
public void setNothingAllowed(boolean allow) {
chooser.setNothingAllowed(allow);
}
public boolean isNothingAllowed() {
return chooser.isNothingAllowed();
}
public Dimension getCalendarPreferredSize() {
return chooser.getCalendarPreferredSize();
}
public void setCalendarPreferredSize(Dimension dim) {
chooser.setCalendarPreferredSize(dim);
}
public void commit() {
chooser.commit();
}
private JPanel getDialogPane() {
JButton bOK = new JButton(getEditorLocaleString("OK"));
JButton bCancel = new JButton(getEditorLocaleString("Cancel"));
bOK.addActionListener(new OnOK());
bCancel.addActionListener(new OnCancel());
JPanel buttonPane = new JPanel(new GridLayout(1,2));
buttonPane.add(bOK);
buttonPane.add(bCancel);
JPanel dialogPane = new JPanel(new BorderLayout());
dialogPane.add(chooser, BorderLayout.CENTER);
dialogPane.add(buttonPane, BorderLayout.SOUTH);
return dialogPane;
}
private void saveState() {
state = chooser.getSelection();
}
private void restoreState() {
chooser.setSelection(state);
}
private void disposeDialog() {
if (dialog == null) return;
dialog.setVisible(false);
dialog.dispose();
dialog = null;
}
private void commitAction() {
commit();
disposeDialog();
}
private void cancelAction() {
restoreState();
commit();
disposeDialog();
}
public void propertyChange(PropertyChangeEvent evt) {
if (chooser.isDateChooserPanelProperty(evt.getPropertyName())) {
changeSupport.firePropertyChange(evt);
}
}
public void addCommitListener(CommitListener listener) {
chooser.addCommitListener(listener);
}
public void removeCommitListener(CommitListener listener) {
chooser.removeCommitListener(listener);
}
public void addSelectionChangedListener(SelectionChangedListener listener) {
chooser.addSelectionChangedListener(listener);
}
public void removeSelectionChangedListener(SelectionChangedListener listener) {
chooser.removeSelectionChangedListener(listener);
}
public void addCursorMoveListener(CursorMoveListener listener) {
chooser.addCursorMoveListener(listener);
}
public void removeCursorMoveListener(CursorMoveListener listener) {
chooser.removeCursorMoveListener(listener);
}
public Color getCalendarBackground() {
return chooser.getCalendarBackground();
}
public void setCalendarBackground(Color backColor) {
chooser.setCalendarBackground(backColor);
}
public AppearancesList getAppearancesList() {
return chooser.getAppearancesList();
}
public DateChooserDialog clone() {
return (DateChooserDialog) BeanUtils.cloneBean(this);
}
private class OnClose implements WindowListener {
public void windowOpened(WindowEvent e) {
}
public void windowClosing(WindowEvent e) {
disposeDialog();
}
public void windowClosed(WindowEvent e) {
}
public void windowIconified(WindowEvent e) {
}
public void windowDeiconified(WindowEvent e) {
}
public void windowActivated(WindowEvent e) {
}
public void windowDeactivated(WindowEvent e) {
}
}
private class OnOK implements ActionListener {
public void actionPerformed(ActionEvent e) {
commitAction();
}
}
private class OnCancel implements ActionListener {
public void actionPerformed(ActionEvent e) {
cancelAction();
}
}
}