/*
* DateChooser.java
*
* Created on 15 ���� 2006 �., 11:06
*
* To change this template, choose Tools | Template Manager
* and open the template in the editor.
*/
package datechooser.beans;
import datechooser.controller.EventHandlerMultiply;
import datechooser.events.CommitListener;
import datechooser.events.CursorMoveListener;
import datechooser.events.SelectionChangedListener;
import datechooser.model.DateChoose;
import datechooser.model.exeptions.IncompatibleDataExeption;
import datechooser.model.multiple.MultyDateChooseModel;
import datechooser.model.multiple.MultyModelBehavior;
import datechooser.model.multiple.Period;
import datechooser.model.multiple.PeriodSet;
import datechooser.view.BackRenderer;
import datechooser.view.CalendarPane;
import datechooser.view.WeekDaysStyle;
import datechooser.view.appearance.*;
import java.awt.*;
import java.beans.*;
import java.io.Serializable;
import java.util.*;
import javax.swing.JPanel;
import javax.swing.JTable;
import javax.swing.border.Border;
import javax.swing.event.CellEditorListener;
import javax.swing.table.TableCellEditor;
import javax.swing.table.TableCellRenderer;
/**
* Bean: date selection panel.<br>
* ��������� "������ ��� ����� ���"
* @author Androsov Vadim
* @since 1.0
*/
public class DateChooserPanel extends DateChooserVisual implements PropertyChangeListener {
public static final long serialVersionUID = -267882659809359160L;
/**
* Panel property's name prefix.<br>
* ��������� � ��������� ���� ������� ������.
* @since 1.0
*/
public static final String PANEL_PREFIX = PREFIX + "panel_";
/**
* Property name. <br>
* �������� ��������.
* @see DateChooserPanel#setBorder(Border)
* @since 1.0
*/
public static final String PROPERTY_BORDER = PANEL_PREFIX + "border";
private MultyDateChooseModel model;
private CalendarPane calendarPane;
public DateChooserPanel() {
calendarPane = new CalendarPane();
model = new MultyDateChooseModel(new GregorianCalendar());
calendarPane.initialize(model, new EventHandlerMultiply());
calendarPane.setPreferredSize(new Dimension(250, 180));
calendarPane.addPropertyChangeListener(this);
setLayout(new BorderLayout());
add(calendarPane, BorderLayout.CENTER);
}
public boolean isAutoScroll() {
return model.isAutoScroll();
}
public void setLocale(Locale locale) {
super.setLocale(locale);
calendarPane.setLocale(locale);
}
public boolean isDateChooserPanelProperty(String name) {
if (name == null) return false;
return name.startsWith(PREFIX);
}
public void setAutoScroll(boolean autoScroll) {
boolean oldAutoScroll = isAutoScroll();
model.setAutoScroll(autoScroll);
firePropertyChange(PROPERTY_AUTOSCROLL, isAutoScroll(), autoScroll);
}
public boolean isShowOneMonth() {
return !model.isShowNeighbourMonth();
}
public void setShowOneMonth(boolean showOneMonth) {
boolean oldShowOneMonth = isShowOneMonth();
model.setShowNeighbourMonth(!showOneMonth);
firePropertyChange(PROPERTY_ONE_MONTH, oldShowOneMonth, showOneMonth);
}
public boolean isEnabled() {
return model.isEnabled();
}
public void setEnabled(boolean enabled) {
boolean oldEnabled = isEnabled();
model.setEnabled(enabled);
firePropertyChange(PROPERTY_ENABLED, oldEnabled, enabled);
}
/**
* Celendar panel border.<br>
* ������� ������.
* @since 1.0
*/
public void setBorder(Border border) {
Border oldBorder = getBorder();
super.setBorder(border);
firePropertyChange(PROPERTY_BORDER, oldBorder, getBorder());
}
public MultyModelBehavior getBehavior() {
return model.getBehavior();
}
public void setBehavior(MultyModelBehavior behavior) {
MultyModelBehavior oldBehavior = getBehavior();
model.setBehavior(behavior);
firePropertyChange(PROPERTY_BEHAVIOR, oldBehavior, behavior);
}
public AppearancesList getCurrentView() {
return calendarPane.getAppearancesList();
}
public void setCurrentView(AppearancesList aList) {
//������� "��������� ��������" ������������ � ������ ������.
calendarPane.setAppearancesList(aList);
}
public PeriodSet getDefaultPeriods() {
return model.getDefaultPeriodSet();
}
public void setDefaultPeriods(PeriodSet periods) throws IncompatibleDataExeption {
PeriodSet oldDefault = getDefaultPeriods();
model.setDefaultPeriodSet(periods);
firePropertyChange(PROPERTY_DEFAULT_DATES, oldDefault, periods);
}
public Iterable<Period> getSelection() {
return model.getSelectedPeriods();
}
public PeriodSet getSelectedPeriodSet() {
return model.getSelectedPeriodSet();
}
public Calendar getSelectedDate() {
return model.getSelectedDate();
}
public void setSelectedDate(Calendar aDate) {
if (aDate == null) {
model.selectNothing();
} else {
model.setSelectedDate(aDate);
}
}
public void setSelection(Iterable<Period> periods) {
if (periods == null) {
model.selectNothing();
} else {
model.setSelectedPeriods(periods);
}
}
public void setSelection(PeriodSet periods) {
if (periods == null) {
model.selectNothing();
} else {
model.setSelectedPeriods(periods);
}
}
public PeriodSet getForbiddenPeriods() {
return model.getForbiddenSet();
}
public void setForbiddenPeriods(PeriodSet periods) throws IncompatibleDataExeption {
PeriodSet oldForbid = getForbiddenPeriods();
model.setForbiddenSet(periods);
firePropertyChange(PROPERTY_FORBID_DATES, oldForbid, periods);
}
public void setForbidden(Iterable<Period> forbiddenPeriods) {
model.setForbidden(forbiddenPeriods);
}
public Calendar getMaxDate() {
return model.getMaxConstraint();
}
public void setMaxDate(Calendar aDate) {
Calendar oldMax = getMaxDate();
model.setMaxConstraint(aDate);
firePropertyChange(PROPERTY_MAX_DATE, oldMax, aDate);
}
public Calendar getMinDate() {
return model.getMinConstraint();
}
public void setMinDate(Calendar aDate) {
Calendar oldMin = getMinDate();
model.setMinConstraint(aDate);
firePropertyChange(PROPERTY_MIN_DATE, oldMin, aDate);
}
public void addCommitListener(CommitListener listener) {
model.addCommitListener(listener);
}
public void removeCommitListener(CommitListener listener) {
model.removeCommitListener(listener);
}
public void addSelectionChangedListener(SelectionChangedListener listener) {
model.addSelectionChangedListener(listener);
}
public void removeSelectionChangedListener(SelectionChangedListener listener) {
model.removeSelectionChangedListener(listener);
}
public void commit() {
model.commit();
}
public boolean isLocked() {
return model.isLocked();
}
public void setLocked(boolean lock) {
boolean oldLock = isLocked();
model.setLocked(lock);
firePropertyChange(PROPERTY_LOCKED, oldLock, lock);
}
public void addCursorMoveListener(CursorMoveListener listener) {
model.addCursorMoveListener(listener);
}
public void removeCursorMoveListener(CursorMoveListener listener) {
model.removeCursorMoveListener(listener);
}
public Calendar getCurrent() {
return model.getCurrent();
}
public boolean setCurrent(Calendar aDate) {
Calendar oldDate = getCurrent();
if (aDate == null) {
model.selectNothing();
return true;
}
boolean result = model.select(aDate);
firePropertyChange(PROPERTY_CURRENT, oldDate, aDate);
return result;
}
public void setNothingAllowed(boolean allow) {
boolean oldAllow = isNothingAllowed();
model.setNothingAllowed(allow);
firePropertyChange(PROPERTY_NOTHING_ALLOWED, oldAllow, allow);
}
public boolean isNothingAllowed() {
return model.isNothingAllowed();
}
public Color getCalendarBackground() {
return calendarPane.getGridBackground();
}
public void setCalendarBackground(Color backColor) {
Color was = getCalendarBackground();
calendarPane.setGridBackground(backColor);
firePropertyChange(PROPERTY_BACK_COLOR, was, backColor);
}
public Dimension getCalendarPreferredSize() {
return getPreferredSize();
}
public void setCalendarPreferredSize(Dimension dim) {
Dimension oldSize = getCalendarPreferredSize();
setPreferredSize(dim);
firePropertyChange(PROPERTY_CALENDAR_SIZE, oldSize, getCalendarPreferredSize());
}
public WeekDaysStyle getWeekStyle() {
return calendarPane.getWeekStyle();
}
public void setWeekStyle(WeekDaysStyle weekStyle) {
calendarPane.setWeekStyle(weekStyle);
}
public Font getNavigateFont() {
return calendarPane.getNavigateFont();
}
public void setNavigateFont(Font font) {
calendarPane.setNavigateFont(font);
}
public int getCurrentNavigateIndex() {
return calendarPane.getCurrentNavigateIndex();
}
public void setCurrentNavigateIndex(int currentNavigateIndex) {
calendarPane.setCurrentNavigateIndex(currentNavigateIndex);
}
public DateChoose getModel() {
return model;
}
public void propertyChange(PropertyChangeEvent evt) {
firePropertyChange(evt.getPropertyName(), evt.getOldValue(), evt.getNewValue());
}
public AppearancesList getAppearancesList() {
return calendarPane.getAppearancesList();
}
}