
org.jdesktop.swingx.demos.monthview.MonthViewDemo Maven / Gradle / Ivy
/* Copyright 2007-2009 Sun Microsystems, Inc. All Rights Reserved.
Copyright notice, list of conditions and disclaimer see LICENSE file
*/
package org.jdesktop.swingx.demos.monthview;
import static org.jdesktop.beansbinding.AutoBinding.UpdateStrategy.READ;
import java.awt.BorderLayout;
import java.awt.Frame;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Set;
import java.util.SortedSet;
import java.util.TreeSet;
import java.util.logging.Logger;
import javax.swing.DefaultComboBoxModel;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JComponent;
import javax.swing.JLabel;
import javax.swing.JSpinner;
import javax.swing.JSpinner.DefaultEditor;
import javax.swing.SpinnerModel;
import javax.swing.SpinnerNumberModel;
import javax.swing.SwingUtilities;
import javax.swing.border.BevelBorder;
import org.jdesktop.beans.AbstractBean;
import org.jdesktop.beansbinding.BeanProperty;
import org.jdesktop.beansbinding.Binding;
import org.jdesktop.beansbinding.BindingGroup;
import org.jdesktop.beansbinding.Bindings;
import org.jdesktop.beansbinding.Converter;
import org.jdesktop.swingx.JXCollapsiblePane;
import org.jdesktop.swingx.JXDatePicker;
import org.jdesktop.swingx.JXFrame;
import org.jdesktop.swingx.JXFrame.StartPosition;
import org.jdesktop.swingx.JXMonthView;
import org.jdesktop.swingx.JXPanel;
import org.jdesktop.swingx.JXTitledSeparator;
import org.jdesktop.swingx.binding.LabelHandler;
import org.jdesktop.swingx.calendar.CalendarUtils;
import org.jdesktop.swingx.calendar.DateSelectionModel.SelectionMode;
import org.jdesktop.swingx.combobox.EnumComboBoxModel;
import org.jdesktop.swingx.renderer.DefaultListRenderer;
import org.jdesktop.swingx.renderer.FormatStringValue;
import org.jdesktop.swingx.util.Contract;
import org.jdesktop.swingxset.util.DisplayValues;
import com.jgoodies.forms.builder.PanelBuilder;
import com.jgoodies.forms.factories.Borders;
import com.jgoodies.forms.layout.CellConstraints;
import com.jgoodies.forms.layout.FormLayout;
import swingset.AbstractDemo;
/**
* A demo for the {@code JXMonthView}.
*
* @author Karl George Schaefer
* @author Joshua Outwater (original JXMonthViewDemoPanel)
* @author EUG https://github.com/homebeaver (reorg)
*/
//@DemoProperties(
// value = "JXMonthView (basic)",
// category = "Controls",
// description = "Demonstrates JXMonthView, a monthly calendar display.",
// sourceFiles = {
// "org/jdesktop/swingx/demos/monthview/MonthViewDemo.java",
// "org/jdesktop/swingx/demos/monthview/MonthViewDemoUtils.java",
// "org/jdesktop/swingx/demos/monthview/resources/MonthViewDemo.properties",
// "org/jdesktop/swingx/demos/monthview/resources/MonthViewDemo.html",
// "org/jdesktop/swingx/demos/monthview/resources/images/MonthViewDemo.png"
// }
//)
//@SuppressWarnings("serial")
public class MonthViewDemo extends AbstractDemo {
private static final long serialVersionUID = -5961902554362481875L;
private static final Logger LOG = Logger.getLogger(MonthViewDemo.class.getName());
private static final String DESCRIPTION = "Demonstrates JXMonthView, a monthly calendar display.";
/**
* main method allows us to run as a standalone demo.
* @param args params
*/
public static void main(String[] args) {
SwingUtilities.invokeLater( () -> {
JXFrame controller = new JXFrame("controller", exitOnClose);
AbstractDemo demo = new MonthViewDemo(controller);
JXFrame frame = new JXFrame(DESCRIPTION, exitOnClose);
frame.setStartPosition(StartPosition.CenterInScreen);
//frame.setLocationRelativeTo(controller);
frame.getContentPane().add(demo);
frame.pack();
frame.setVisible(true);
controller.getContentPane().add(demo.getControlPane());
controller.pack();
controller.setVisible(true);
});
}
private JXMonthView monthView;
private JComboBox selectionModes;
private JCheckBox traversable;
private JComboBox dayOfWeekComboBox;
private JCheckBox leadingDaysBox;
private JCheckBox trailingDaysBox;
private JSpinner prefColumnSlider;
private JCheckBox weekNumberBox;
private JSpinner prefRowSlider;
private JXDatePicker flaggedDates;
private JXDatePicker unselectableDates;
private JXDatePicker upperBound;
private JXDatePicker lowerBound;
/**
* MonthViewDemo Constructor
*
* @param frame controller Frame
*/
public MonthViewDemo(Frame frame) {
super(new BorderLayout());
frame.setTitle(getBundleString("frame.title", DESCRIPTION));
super.setPreferredSize(PREFERRED_SIZE);
super.setBorder(new BevelBorder(BevelBorder.LOWERED));
monthView = new JXMonthView();
monthView.setName("monthView");
// add to container which doesn't grow the size beyond the pref
JComponent monthViewContainer = new JXPanel();
monthViewContainer.add(monthView);
add(monthViewContainer, BorderLayout.CENTER);
}
/**
* the controller contains two pane's in jgoodies layout,
* a BoxPropertiesPanel and
* a ConfigPanel
*/
/* some notes on jgoodies layout and builder (used in create*Panel):
* dlu == dialog units
* f:m:g == FILL:MIN:GROW == [columnAlignment:] componentSize [:resizeBehavior]
* r:d:n == RIGHT:DEFAULT:NONE == [columnAlignment:] size [:resizeBehavior]
* f:d:n == FILL:DEFAULT:NONE == [columnAlignment:] size [:resizeBehavior]
* t:d:n == TOP:DEFAULT:NONE == rowSpec
* c:d:n == CENTER:DEFAULT:NONE == rowSpec
* @see jgoodies-forms whitepaper.pdf
*/
@Override
public JXPanel getControlPane() {
JXPanel monthViewControlPanel = new JXPanel();
// jgoodies layout and builder:
FormLayout formLayout = new FormLayout(
"f:m:g, l:4dlu:n, f:m:g", // encodedColumnSpecs 2cols + gap
"t:d:n " // encodedRowSpecs: one row
);
PanelBuilder builder = new PanelBuilder(formLayout, monthViewControlPanel);
builder.setBorder(Borders.DLU4_BORDER);
CellConstraints cc = new CellConstraints();
builder.add(createBoxPropertiesPanel(), cc.xywh(1, 1, 1, 1));
builder.add(createConfigPanel(), cc.xywh(3, 1, 1, 1));
LOG.config("create and bind MonthViewDemoControl");
new MonthViewDemoControl();
// PENDING JW: re-visit distribution of binding control ...
// this is quite arbitrary (time of coding ;-)
BindingGroup group = new BindingGroup();
group.addBinding(Bindings.createAutoBinding(READ,
leadingDaysBox, BeanProperty.create("selected"),
monthView, BeanProperty.create("showingLeadingDays")));
group.addBinding(Bindings.createAutoBinding(READ,
trailingDaysBox, BeanProperty.create("selected"),
monthView, BeanProperty.create("showingTrailingDays")));
group.addBinding(Bindings.createAutoBinding(READ,
weekNumberBox, BeanProperty.create("selected"),
monthView, BeanProperty.create("showingWeekNumber")));
group.addBinding(Bindings.createAutoBinding(READ,
prefColumnSlider, BeanProperty.create("value"),
monthView, BeanProperty.create("preferredColumnCount")));
group.addBinding(Bindings.createAutoBinding(READ,
prefRowSlider, BeanProperty.create("value"),
monthView, BeanProperty.create("preferredRowCount")));
group.bind();
return monthViewControlPanel;
}
/**
* @return control pane BoxPropertiesPanel
*/
private JComponent createBoxPropertiesPanel() {
JXCollapsiblePane painterControl = new JXCollapsiblePane();
FormLayout formLayout = new FormLayout(
"5dlu, r:d:n, l:4dlu:n, f:d:n, l:4dlu:n, f:d:n", // encodedColumnSpecs 3 cols + 2 gaps
"c:d:n, t:4dlu:n, c:d:n, t:4dlu:n, c:d:n, t:4dlu:n, c:d:n, t:4dlu:n, c:d:n, t:4dlu:n, c:d:n" // 6 rows
);
PanelBuilder builder = new PanelBuilder(formLayout, painterControl);
builder.setBorder(Borders.DLU4_BORDER);
CellConstraints cl = new CellConstraints();
CellConstraints cc = new CellConstraints();
JXTitledSeparator areaSeparator = new JXTitledSeparator();
areaSeparator.setName("monthBoxSeparator");
areaSeparator.setTitle(getBundleString("monthBoxSeparator.title"));
builder.add(areaSeparator, cc.xywh(1, 1, 6, 1));
int labelColumn = 2;
int widgetColumn = labelColumn + 2;
int currentRow = 3;
prefColumnSlider = createSpinner(1, 3, 2);
prefColumnSlider.setName("preferredColumnSlider");
prefRowSlider = createSpinner(1, 2, 1);
prefRowSlider.setName("preferredRowSlider");
JLabel insets = builder.addLabel("", cl.xywh(labelColumn, currentRow, 1, 1), prefRowSlider,
cc.xywh(widgetColumn, currentRow, 1, 1));
insets.setName("preferredColumnLabel");
insets.setText(getBundleString("preferredColumnLabel.text"));
LabelHandler.bindLabelFor(insets, prefRowSlider);
builder.add(prefColumnSlider, cc.xywh(widgetColumn + 2, currentRow, 1, 1));
currentRow += 2;
leadingDaysBox = new JCheckBox();
leadingDaysBox.setName("leadingDaysBox");
leadingDaysBox.setText(getBundleString("leadingDaysBox.text"));
JLabel leadingLabel = builder.addLabel("", cl.xywh(labelColumn, currentRow, 1, 1),
leadingDaysBox, cc.xywh(widgetColumn, currentRow, 1, 1));
leadingLabel.setName("leadingDaysLabel");
leadingLabel.setText(getBundleString("leadingDaysLabel.text"));
LabelHandler.bindLabelFor(leadingLabel, leadingDaysBox);
trailingDaysBox = new JCheckBox();
trailingDaysBox.setName("trailingDaysBox");
trailingDaysBox.setText(getBundleString("trailingDaysBox.text"));
builder.add(trailingDaysBox, cc.xywh(widgetColumn + 2, currentRow, 1, 1));
currentRow += 2;
weekNumberBox = new JCheckBox();
weekNumberBox.setName("weekNumberBox");
weekNumberBox.setText(getBundleString("weekNumberBox.text"));
builder.add(weekNumberBox, cc.xywh(widgetColumn, currentRow, 3, 1));
currentRow += 2;
traversable = new JCheckBox();
traversable.setName("traversable"); // traversable.text=Tra&versable
traversable.setText(getBundleString("traversable.text", traversable));
builder.add(traversable, cc.xywh(widgetColumn, currentRow, 3, 1));
currentRow += 2;
return painterControl;
}
private JSpinner createSpinner(int min, int max, int value) {
SpinnerModel model = new SpinnerNumberModel(value, min, max, 1);
JSpinner spinner = new JSpinner(model);
((DefaultEditor) spinner.getEditor()).getTextField().setEditable(false);
return spinner;
}
/**
* @return control pane ConfigPanel
*/
private JComponent createConfigPanel() {
JXCollapsiblePane painterControl = new JXCollapsiblePane();
// jgoodies layout and builder:
FormLayout formLayout = new FormLayout(
"5dlu, r:d:n, l:4dlu:n, f:m:g, l:4dlu:n, f:m:g", // encodedColumnSpecs 3 cols + 2 gaps
"c:d:n, t:4dlu:n, c:d:n, t:4dlu:n, c:d:n, t:4dlu:n, c:d:n, t:4dlu:n, c:d:n" // 5 rows
); // rows
PanelBuilder builder = new PanelBuilder(formLayout, painterControl);
builder.setBorder(Borders.DLU4_BORDER);
CellConstraints cl = new CellConstraints();
CellConstraints cc = new CellConstraints();
JXTitledSeparator areaSeparator = new JXTitledSeparator();
areaSeparator.setName("configurationSeparator");
areaSeparator.setTitle(getBundleString("configurationSeparator.title"));
builder.add(areaSeparator, cc.xywh(1, 1, 6, 1));
int labelColumn = 2;
int widgetColumn = labelColumn + 2;
int currentRow = 3;
dayOfWeekComboBox = new JComboBox();
JLabel dayOfWeekLabel = builder.addLabel("", cl.xywh(labelColumn, currentRow, 1, 1),
dayOfWeekComboBox, cc.xywh(widgetColumn, currentRow, 3, 1));
dayOfWeekLabel.setName("dayOfWeekLabel");
dayOfWeekLabel.setText(getBundleString("dayOfWeekLabel.text", dayOfWeekLabel));
LabelHandler.bindLabelFor(dayOfWeekLabel, dayOfWeekComboBox); // calls dayOfWeekLabel.setLabelFor(dayOfWeekComboBox);
currentRow += 2;
selectionModes = new JComboBox();
JLabel insets = builder.addLabel("", cl.xywh(labelColumn, currentRow, 1, 1),
selectionModes, cc.xywh(widgetColumn, currentRow, 3, 1));
currentRow += 2;
insets.setName("selectionModesLabel");
insets.setText(getBundleString("selectionModesLabel.text", insets));
LabelHandler.bindLabelFor(insets, selectionModes); // calls insets.setLabelFor(selectionModes);
unselectableDates = new JXDatePicker();
JLabel unselectables = builder.addLabel("", cl.xywh(labelColumn, currentRow, 1, 1),
unselectableDates, cc.xywh(widgetColumn, currentRow, 1, 1));
unselectables.setName("unselectableDatesLabel");
unselectables.setText(getBundleString("unselectableDatesLabel.text"));
LabelHandler.bindLabelFor(unselectables, unselectableDates);
flaggedDates = new JXDatePicker();
builder.add(flaggedDates, cc.xywh(widgetColumn + 2, currentRow, 1, 1));
currentRow += 2;
upperBound = new JXDatePicker();
lowerBound = new JXDatePicker();
JLabel lower = builder.addLabel("", cl.xywh(labelColumn, currentRow, 1, 1),
lowerBound, cc.xywh(widgetColumn, currentRow, 1, 1));
lower.setName("lowerBoundsLabel");
lower.setText(getBundleString("lowerBoundsLabel.text"));
LabelHandler.bindLabelFor(lower, lowerBound);
builder.add(upperBound, cc.xywh(widgetColumn + 2, currentRow, 1, 1));
currentRow += 2;
return painterControl;
}
//--------------------- MonthViewDemoControl
// must not be private!
// private leads to: java.lang.IllegalAccessException:
// class org.jdesktop.beansbinding.BeanProperty cannot access a member of class org.jdesktop.swingx.demos.monthview.MonthViewDemo$MonthViewDemoControl with modifiers "public"
public class MonthViewDemoControl extends AbstractBean {
private Date lastFlagged;
private Date lastUnselectable;
private Date upper;
private Date lower;
@SuppressWarnings("unchecked")
public MonthViewDemoControl() {
selectionModes.setModel(new EnumComboBoxModel(SelectionMode.class));
selectionModes.setRenderer(new DefaultListRenderer(DisplayValues.TITLE_WORDS_UNDERSCORE));
// PENDING JW: this does not survive a change in Locale -
// revisit if we add changing Locale to the demo
Calendar calendar = monthView.getCalendar();
// start of week == first day of week in the calendar's coordinate space
CalendarUtils.startOfWeek(calendar);
DefaultComboBoxModel model = new DefaultComboBoxModel();
for (int i = 0; i < 7; i++) {
model.addElement(calendar.getTime());
calendar.add(Calendar.DATE, 1);
}
dayOfWeekComboBox.setModel(model);
SimpleDateFormat format = new SimpleDateFormat("EEEE");
dayOfWeekComboBox.setRenderer(new DefaultListRenderer(new FormatStringValue(format)));
Converter, ?> days = new DayOfWeekConverter(calendar);
BindingGroup group = new BindingGroup();
group.addBinding(Bindings.createAutoBinding(READ,
selectionModes, BeanProperty.create("selectedItem"),
monthView, BeanProperty.create("selectionMode")));
group.addBinding(Bindings.createAutoBinding(READ,
traversable, BeanProperty.create("selected"),
monthView, BeanProperty.create("traversable")));
Binding dayOfWeek = Bindings.createAutoBinding(READ,
dayOfWeekComboBox, BeanProperty.create("selectedItem"),
monthView, BeanProperty.create("firstDayOfWeek"));
dayOfWeek.setConverter(days);
group.addBinding(dayOfWeek);
Binding flagged = Bindings.createAutoBinding(READ,
flaggedDates, BeanProperty.create("date"),
this, BeanProperty.create("lastFlagged"));
group.addBinding(flagged);
Binding unselectable = Bindings.createAutoBinding(READ,
unselectableDates, BeanProperty.create("date"),
this, BeanProperty.create("lastUnselectable"));
group.addBinding(unselectable);
group.addBinding(Bindings.createAutoBinding(READ,
upperBound, BeanProperty.create("date"),
this, BeanProperty.create("upperBound")));
group.addBinding(Bindings.createAutoBinding(READ,
lowerBound, BeanProperty.create("date"),
this, BeanProperty.create("lowerBound")));
group.bind();
/* TODO remove this log
Aug. 13, 2022 9:12:31 PM org.jdesktop.swingx.JXDatePicker initMonthView
INFO: monthView.SelectionModel/Mode:org.jdesktop.swingx.calendar.DaySelectionModel@5c413ee5/SINGLE_SELECTION
Exception in thread "AWT-EventQueue-0" org.jdesktop.beansbinding.PropertyResolutionException: Exception invoking method public void org.jdesktop.swingx.demos.monthview.MonthViewDemo$MonthViewDemoControl.setLastFlagged(java.util.Date) on org.jdesktop.swingx.demos.monthview.MonthViewDemo$MonthViewDemoControl@1fc99a44
at org.jdesktop.beansbinding.BeanProperty.invokeMethod(BeanProperty.java:791)
at org.jdesktop.beansbinding.BeanProperty.write(BeanProperty.java:891)
at org.jdesktop.beansbinding.BeanProperty.setProperty(BeanProperty.java:909)
at org.jdesktop.beansbinding.BeanProperty.setValue(BeanProperty.java:580)
at org.jdesktop.beansbinding.Binding.refreshUnmanaged(Binding.java:1229)
at org.jdesktop.beansbinding.Binding.refresh(Binding.java:1207)
at org.jdesktop.beansbinding.Binding.refreshAndNotify(Binding.java:1143)
at org.jdesktop.beansbinding.AutoBinding.bindImpl(AutoBinding.java:197)
at org.jdesktop.beansbinding.Binding.bindUnmanaged(Binding.java:959)
at org.jdesktop.beansbinding.Binding.bind(Binding.java:944)
at org.jdesktop.beansbinding.BindingGroup.bind(BindingGroup.java:143)
at org.jdesktop.swingx.demos.monthview.MonthViewDemo$MonthViewDemoControl.(MonthViewDemo.java:412) <===
at org.jdesktop.swingx.demos.monthview.MonthViewDemo.getControlPane(MonthViewDemo.java:181)
at io.github.homebeaver.swingset.demo.DemoAction.actionPerformed(DemoAction.java:402)
at io.github.homebeaver.swingset.demo.DemoJXTasks$1.actionPerformed(DemoJXTasks.java:91)
at java.desktop/javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1972)
at org.jdesktop.swingx.JXHyperlink.fireActionPerformed(JXHyperlink.java:264)
at java.desktop/javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2313)
at java.desktop/javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:405)
at java.desktop/javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:262)
at java.desktop/javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:279)
at java.desktop/java.awt.Component.processMouseEvent(Component.java:6617)
at java.desktop/javax.swing.JComponent.processMouseEvent(JComponent.java:3342)
at java.desktop/java.awt.Component.processEvent(Component.java:6382)
at java.desktop/java.awt.Container.processEvent(Container.java:2264)
at java.desktop/java.awt.Component.dispatchEventImpl(Component.java:4993)
at java.desktop/java.awt.Container.dispatchEventImpl(Container.java:2322)
at java.desktop/java.awt.Component.dispatchEvent(Component.java:4825)
at java.desktop/java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4934)
at java.desktop/java.awt.LightweightDispatcher.processMouseEvent(Container.java:4563)
at java.desktop/java.awt.LightweightDispatcher.dispatchEvent(Container.java:4504)
at java.desktop/java.awt.Container.dispatchEventImpl(Container.java:2308)
at java.desktop/java.awt.Window.dispatchEventImpl(Window.java:2773)
at java.desktop/java.awt.Component.dispatchEvent(Component.java:4825)
at java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:772)
at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:721)
at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:715)
at java.base/java.security.AccessController.doPrivileged(AccessController.java:391)
at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:85)
at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:95)
at java.desktop/java.awt.EventQueue$5.run(EventQueue.java:745)
at java.desktop/java.awt.EventQueue$5.run(EventQueue.java:743)
at java.base/java.security.AccessController.doPrivileged(AccessController.java:391)
at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:85)
at java.desktop/java.awt.EventQueue.dispatchEvent(EventQueue.java:742)
at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:203)
at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:124)
at java.desktop/java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:113)
at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:109)
at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
at java.desktop/java.awt.EventDispatchThread.run(EventDispatchThread.java:90)
Caused by: java.lang.IllegalAccessException: class org.jdesktop.beansbinding.BeanProperty cannot access a member of class org.jdesktop.swingx.demos.monthview.MonthViewDemo$MonthViewDemoControl with modifiers "public"
at java.base/jdk.internal.reflect.Reflection.newIllegalAccessException(Reflection.java:385)
at java.base/java.lang.reflect.AccessibleObject.checkAccess(AccessibleObject.java:687)
at java.base/java.lang.reflect.Method.invoke(Method.java:559)
at org.jdesktop.beansbinding.BeanProperty.invokeMethod(BeanProperty.java:782)
... 50 more
*/
// PENDING JW: removed the color selection stuff for now
// future will be to use highlighters anyway - revisit then
}
/**
* @return the lastFlagged
*/
public Date getLastFlagged() {
return lastFlagged;
}
/**
* @param lastFlagged the lastFlagged to set
*/
public void setLastFlagged(Date lastFlagged) {
Date old = getLastFlagged();
this.lastFlagged = lastFlagged;
updateFlaggedDates();
firePropertyChange("lastFlagged", old, getLastFlagged());
}
/**
*
*/
private void updateFlaggedDates() {
// PENDING JW: should be handled by converter
// not working - "flaggedDates" is not a real property because different
// types in getter/setter
if (getLastFlagged() == null) {
monthView.setFlaggedDates();
return;
}
Set old = monthView.getFlaggedDates();
Date[] flagged = new Date[old.size() + 1];
int index = 0;
for (Date d : old) {
flagged[index++] = d;
}
flagged[index] = getLastFlagged();
monthView.setFlaggedDates(flagged);
}
/**
* @return the lastUnselectable
*/
public Date getLastUnselectable() {
return lastUnselectable;
}
/**
* @param lastUnselectable the lastUnselectable to set
*/
public void setLastUnselectable(Date lastUnselectable) {
Date old = getLastUnselectable();
this.lastUnselectable = lastUnselectable;
updateLastUnselectable();
firePropertyChange("lastUnselectable", old, getLastUnselectable());
}
/**
*
*/
private void updateLastUnselectable() {
// JW: can't bind directly - it's not a property
if (getLastUnselectable() == null) {
monthView.setUnselectableDates();
return;
}
Set old = monthView.getSelectionModel().getUnselectableDates();
SortedSet result = new TreeSet(old);
result.add(getLastUnselectable());
monthView.getSelectionModel().setUnselectableDates(result);
}
/**
* @param lower the lower to set
*/
public void setLowerBound(Date lower) {
Date old = getLowerBound();
this.lower = lower;
monthView.setLowerBound(lower);
firePropertyChange("lowerBound", old, getLowerBound());
}
/**
* @return the lower
*/
public Date getLowerBound() {
return lower;
}
/**
* @param upper the upper to set
*/
public void setUpperBound(Date upper) {
Date old = getUpperBound();
this.upper = upper;
monthView.setUpperBound(upper);
firePropertyChange("upperBound", old, getUpperBound());
}
/**
* @return the upper
*/
public Date getUpperBound() {
return upper;
}
}
// TODO move it to package org.jdesktop.swingx.binding
private static class DayOfWeekConverter extends Converter {
Calendar calendar;
public DayOfWeekConverter(Calendar calendar) {
this.calendar = Contract.asNotNull(calendar, "calendar must not be null");
}
@Override
public Integer convertForward(Date date) {
calendar.setTime(date);
return calendar.get(Calendar.DAY_OF_WEEK);
}
@Override
public Date convertReverse(Integer arg0) {
return null;
}
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy