org.apache.pivot.wtk.CalendarButton Maven / Gradle / Ivy
The newest version!
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to you under the Apache License,
* Version 2.0 (the "License"); you may not use this file except in
* compliance with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.pivot.wtk;
import java.util.Locale;
import org.apache.pivot.collections.Dictionary;
import org.apache.pivot.json.JSON;
import org.apache.pivot.json.JSONSerializer;
import org.apache.pivot.serialization.SerializationException;
import org.apache.pivot.util.CalendarDate;
import org.apache.pivot.util.Filter;
import org.apache.pivot.util.ListenerList;
import org.apache.pivot.wtk.content.CalendarButtonDataRenderer;
/**
* A component that allows a user to select a calendar date. The calendar
* is hidden until the user pushes the button.
*/
public class CalendarButton extends Button {
private static class CalendarButtonListenerList extends WTKListenerList
implements CalendarButtonListener {
@Override
public void yearChanged(CalendarButton calendarButton, int previousYear) {
for (CalendarButtonListener listener : this) {
listener.yearChanged(calendarButton, previousYear);
}
}
@Override
public void monthChanged(CalendarButton calendarButton, int previousMonth) {
for (CalendarButtonListener listener : this) {
listener.monthChanged(calendarButton, previousMonth);
}
}
@Override
public void localeChanged(CalendarButton calendarButton, Locale previousLocale) {
for (CalendarButtonListener listener : this) {
listener.localeChanged(calendarButton, previousLocale);
}
}
@Override
public void disabledDateFilterChanged(CalendarButton calendarButton,
Filter previousDisabledDateFilter) {
for (CalendarButtonListener listener : this) {
listener.disabledDateFilterChanged(calendarButton, previousDisabledDateFilter);
}
}
}
private static class CalendarButtonSelectionListenerList
extends WTKListenerList
implements CalendarButtonSelectionListener {
@Override
public void selectedDateChanged(CalendarButton calendarButton,
CalendarDate previousSelectedDate) {
for (CalendarButtonSelectionListener listener : this) {
listener.selectedDateChanged(calendarButton, previousSelectedDate);
}
}
}
private static class CalendarButtonBindingListenerList extends WTKListenerList
implements CalendarButtonBindingListener {
@Override
public void selectedDateKeyChanged(CalendarButton calendarButton,
String previousSelectedDateKey) {
for (CalendarButtonBindingListener listener : this) {
listener.selectedDateKeyChanged(calendarButton, previousSelectedDateKey);
}
}
@Override
public void selectedDateBindTypeChanged(CalendarButton calendarButton,
BindType previousSelectedDateBindType) {
for (CalendarButtonBindingListener listener : this) {
listener.selectedDateBindTypeChanged(calendarButton, previousSelectedDateBindType);
}
}
@Override
public void selectedDateBindMappingChanged(CalendarButton calendarButton,
Calendar.SelectedDateBindMapping previousSelectedDateBindMapping) {
for (CalendarButtonBindingListener listener : this) {
listener.selectedDateBindMappingChanged(calendarButton, previousSelectedDateBindMapping);
}
}
}
/**
* CalendarButton skin interface. CalendarButton skins must implement
* this interface to facilitate additional communication between the
* component and the skin.
*/
public interface Skin {
public Window getCalendarPopup();
}
private int year;
private int month;
private CalendarDate selectedDate = null;
private Locale locale = Locale.getDefault();
private Filter disabledDateFilter = null;
private String selectedDateKey = null;
private BindType selectedDateBindType = BindType.BOTH;
private Calendar.SelectedDateBindMapping selectedDateBindMapping = null;
private CalendarButtonListenerList calendarButtonListeners =
new CalendarButtonListenerList();
private CalendarButtonSelectionListenerList calendarButtonSelectionListeners =
new CalendarButtonSelectionListenerList();
private CalendarButtonBindingListenerList calendarButtonBindingListeners =
new CalendarButtonBindingListenerList();
public static final String LANGUAGE_KEY = "language";
public static final String COUNTRY_KEY = "country";
public static final String VARIANT_KEY = "variant";
private static final Button.DataRenderer DEFAULT_DATA_RENDERER = new CalendarButtonDataRenderer();
public CalendarButton() {
this(new CalendarDate());
}
private CalendarButton(CalendarDate calendarDate) {
this(calendarDate.year, calendarDate.month);
}
public CalendarButton(int year, int month) {
this.year = year;
this.month = month;
setDataRenderer(DEFAULT_DATA_RENDERER);
installSkin(CalendarButton.class);
setSelectedDate(new CalendarDate());
}
@Override
protected void setSkin(org.apache.pivot.wtk.Skin skin) {
if (!(skin instanceof CalendarButton.Skin)) {
throw new IllegalArgumentException("Skin class must implement "
+ CalendarButton.Skin.class.getName());
}
super.setSkin(skin);
}
/**
* @return the popup window associated with this components skin
*/
public Window getListPopup() {
return ((CalendarButton.Skin) getSkin()).getCalendarPopup();
}
/**
* @throws UnsupportedOperationException
* This method is not supported by CalendarButton.
*/
@Override
public void setToggleButton(boolean toggleButton) {
throw new UnsupportedOperationException("Calendar buttons cannot be toggle buttons.");
}
/**
* Gets the year to which this calendar button is currently set.
*/
public int getYear() {
return year;
}
/**
* Sets this calendar's year.
*/
public void setYear(int year) {
int previousYear = this.year;
if (previousYear != year) {
this.year = year;
calendarButtonListeners.yearChanged(this, previousYear);
}
}
/**
* Gets the month to which this calendar button is currently set.
*/
public int getMonth() {
return month;
}
/**
* Sets this calendar's month.
*/
public void setMonth(int month) {
int previousMonth = this.month;
if (previousMonth != month) {
this.month = month;
calendarButtonListeners.monthChanged(this, previousMonth);
}
}
/**
* Returns the currently selected date.
*
* @return
* The currently selected date, or null if nothing is selected.
*/
public CalendarDate getSelectedDate() {
return selectedDate;
}
/**
* Sets the selected date.
*
* @param selectedDate
* The date to select, or null to clear the selection.
*/
public void setSelectedDate(CalendarDate selectedDate) {
CalendarDate previousSelectedDate = this.selectedDate;
if (previousSelectedDate != selectedDate) {
this.selectedDate = selectedDate;
calendarButtonSelectionListeners.selectedDateChanged(this,
previousSelectedDate);
}
}
/**
* Sets the selected date to the date represented by the specified date
* string. The date string must be in the ISO 8601 "calendar date"
* format, which is [YYYY]-[MM]-[DD].
*
* @param selectedDate
* A string in the form of [YYYY]-[MM]-[DD] (e.g. 2008-07-23)
*/
public final void setSelectedDate(String selectedDate) {
if (selectedDate == null) {
throw new IllegalArgumentException("selectedDate is null.");
}
setSelectedDate(CalendarDate.decode(selectedDate));
}
/**
* Returns the locale used to present calendar data.
*/
public Locale getLocale() {
return locale;
}
/**
* Sets the locale used to present calendar data.
*
* @param locale
*/
public void setLocale(Locale locale) {
if (locale == null) {
throw new IllegalArgumentException("locale is null.");
}
Locale previousLocale = this.locale;
if (previousLocale != locale) {
this.locale = locale;
calendarButtonListeners.localeChanged(this, previousLocale);
}
}
/**
* Sets the locale used to present calendar data.
*
* @param locale
* An dictionary containing values for language, country, and variant.
* Country and variant are optional but the must adhere to the following
* rules:
*
*
* - If variant is specified, language and country are required;
* - Otherwise, if country is specified, language is required;
* - Otherwise, language is required.
*
*/
public void setLocale(Dictionary locale) {
if (locale == null) {
throw new IllegalArgumentException("locale is null.");
}
String language = (String)locale.get(LANGUAGE_KEY);
String country = (String)locale.get(COUNTRY_KEY);
String variant = (String)locale.get(VARIANT_KEY);
if (variant != null) {
setLocale(new Locale(language, country, variant));
} else if (country != null) {
setLocale(new Locale(language, country));
} else {
setLocale(new Locale(language));
}
}
/**
* Sets the locale used to present calendar data.
*
* @param locale
* A JSON map containing values for language, country, and variant.
*
* @see #setLocale(Dictionary)
*/
public void setLocale(String locale) {
if (locale == null) {
throw new IllegalArgumentException("locale is null.");
}
try {
setLocale(JSONSerializer.parseMap(locale));
} catch (SerializationException exception) {
throw new IllegalArgumentException(exception);
}
}
public Filter getDisabledDateFilter() {
return disabledDateFilter;
}
public void setDisabledDateFilter(Filter disabledDateFilter) {
Filter previousDisabledDateFilter = this.disabledDateFilter;
if (previousDisabledDateFilter != disabledDateFilter) {
this.disabledDateFilter = disabledDateFilter;
calendarButtonListeners.disabledDateFilterChanged(this, previousDisabledDateFilter);
}
}
/**
* Gets the data binding key that is set on this calendar button.
*/
public String getSelectedDateKey() {
return selectedDateKey;
}
/**
* Sets this calendar button's data binding key.
*/
public void setSelectedDateKey(String selectedDateKey) {
String previousSelectedDateKey = this.selectedDateKey;
if (previousSelectedDateKey != selectedDateKey) {
this.selectedDateKey = selectedDateKey;
calendarButtonBindingListeners.selectedDateKeyChanged(this, previousSelectedDateKey);
}
}
public BindType getSelectedDateBindType() {
return selectedDateBindType;
}
public void setSelectedDateBindType(BindType selectedDateBindType) {
if (selectedDateBindType == null) {
throw new IllegalArgumentException();
}
BindType previousSelectedDateBindType = this.selectedDateBindType;
if (previousSelectedDateBindType != selectedDateBindType) {
this.selectedDateBindType = selectedDateBindType;
calendarButtonBindingListeners.selectedDateBindTypeChanged(this, previousSelectedDateBindType);
}
}
public Calendar.SelectedDateBindMapping getSelectedDateBindMapping() {
return selectedDateBindMapping;
}
public void setSelectedDateBindMapping(Calendar.SelectedDateBindMapping bindMapping) {
Calendar.SelectedDateBindMapping previousSelectedDateBindMapping = this.selectedDateBindMapping;
if (previousSelectedDateBindMapping != bindMapping) {
this.selectedDateBindMapping = bindMapping;
calendarButtonBindingListeners.selectedDateBindMappingChanged(this, previousSelectedDateBindMapping);
}
}
@Override
public void load(Object context) {
if (selectedDateKey != null
&& JSON.containsKey(context, selectedDateKey)
&& selectedDateBindType != BindType.STORE) {
Object value = JSON.get(context, selectedDateKey);
CalendarDate selectedDateLocal = null;
if (value instanceof CalendarDate) {
selectedDateLocal = (CalendarDate)value;
} else if (selectedDateBindMapping == null) {
if (value != null) {
selectedDateLocal = CalendarDate.decode(value.toString());
}
} else {
selectedDateLocal = selectedDateBindMapping.toDate(value);
}
setSelectedDate(selectedDateLocal);
}
}
@Override
public void store(Object context) {
if (selectedDateKey != null
&& selectedDateBindType != BindType.LOAD) {
JSON.put(context, selectedDateKey, (selectedDateBindMapping == null) ?
selectedDate : selectedDateBindMapping.valueOf(selectedDate));
}
}
@Override
public void clear() {
super.clear(); // for better consistency with superclass
if (selectedDateKey != null) {
setSelectedDate((CalendarDate)null);
}
}
/**
* Clears the selection.
*/
public void clearSelection() {
setSelectedDate((CalendarDate)null);
}
/**
* Returns the calendar button listener list.
*/
public ListenerList getCalendarButtonListeners() {
return calendarButtonListeners;
}
/**
* Returns the calendar button selection listener list.
*/
public ListenerList getCalendarButtonSelectionListeners() {
return calendarButtonSelectionListeners;
}
}