/*
* Copyright (c) 2012, Codename One and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Codename One designates this
* particular file as subject to the "Classpath" exception as provided
* by Oracle in the LICENSE file that accompanied this code.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Codename One through http://www.codenameone.com/ if you
* need additional information or have any questions.
*/
package com.codename1.ui.spinner;
import com.codename1.ui.Component;
import com.codename1.ui.List;
import com.codename1.ui.list.DefaultListCellRenderer;
import java.util.Calendar;
import java.util.Map;
/**
* A date spinner allows selecting a date value within the given date range
*
* @author Shai Almog
*/
public class DateSpinner extends BaseSpinner {
private Spinner month;
private Spinner day;
private Spinner year;
private int startYear = 1970;
private int endYear = 2100;
private int currentYear;
private int currentDay;
private int currentMonth;
private boolean monthDayYear = true;
private boolean numericMonths = false;
private String monthRenderingPrototype = "WWW";
/**
* Default constructor
*/
public DateSpinner() {
Calendar c = Calendar.getInstance();
currentDay = c.get(Calendar.DAY_OF_MONTH);
currentMonth = c.get(Calendar.MONTH) + 1;
currentYear = c.get(Calendar.YEAR);
}
void initSpinner() {
if(month == null) {
day = Spinner.create(1, 32, currentDay, 1);
month = Spinner.create(1, 13, currentMonth, 1);
SpinnerRenderer<Object> render = new SpinnerRenderer<Object>() {
public Component getListCellRendererComponent(List list, Object value, int index, boolean isSelected) {
if(value != null && value instanceof Integer) {
// round the number in the spinner to two digits
int d = ((Integer)value).intValue();
if(numericMonths) {
value = "" + d;
} else {
Map<String, String> t = getUIManager().getBundle();
String text = DateTimeRenderer.MONTHS[d - 1];
if (t != null) {
Object o = t.get("Calendar." + text);
if (o != null) {
text = (String) o;
}
}
value = text;
}
}
return super.getListCellRendererComponent(list, value, index, isSelected);
}
};
month.setRenderer(render);
month.initSpinnerRenderer();
month.setRenderingPrototype(monthRenderingPrototype);
year = Spinner.create(startYear, endYear, currentYear, 1);
addComponents();
}
}
private void addComponents() {
if(year != null) {
if(monthDayYear) {
addComponent(month);
addComponent(createSeparator());
addComponent(day);
addComponent(createSeparator());
addComponent(year);
} else {
addComponent(day);
addComponent(createSeparator());
addComponent(month);
addComponent(createSeparator());
addComponent(year);
}
}
}
/**
* @return the startYear
*/
public int getStartYear() {
return startYear;
}
/**
* @param startYear the startYear to set
*/
public void setStartYear(int startYear) {
this.startYear = startYear;
if(year != null) {
year.setModel(new SpinnerNumberModel(startYear, endYear, currentYear, 1));
}
}
/**
* @return the endYear
*/
public int getEndYear() {
return endYear;
}
/**
* @param endYear the endYear to set
*/
public void setEndYear(int endYear) {
this.endYear = endYear;
if(year != null) {
year.setModel(new SpinnerNumberModel(startYear, endYear, currentYear, 1));
}
}
/**
* @return the currentYear
*/
public int getCurrentYear() {
if(year != null) {
return ((Integer)year.getValue()).intValue();
}
return currentYear;
}
/**
* @param currentYear the currentYear to set
*/
public void setCurrentYear(int currentYear) {
this.currentYear = currentYear;
if(year != null) {
year.setModel(new SpinnerNumberModel(startYear, endYear, currentYear, 1));
}
}
/**
* @return the currentDay
*/
public int getCurrentDay() {
return ((Integer)day.getValue()).intValue();
}
/**
* @param currentDay the currentDay to set
*/
public void setCurrentDay(int currentDay) {
this.currentDay = currentDay;
if(day != null) {
day.setModel(new SpinnerNumberModel(1, 32, currentDay, 1));
}
}
/**
* @return the currentMonth
*/
public int getCurrentMonth() {
if(month != null) {
return ((Integer)month.getValue()).intValue();
}
return currentMonth;
}
/**
* @param currentMonth the currentMonth to set
*/
public void setCurrentMonth(int currentMonth) {
this.currentMonth = currentMonth;
if(month != null) {
month.setModel(new SpinnerNumberModel(1, 13, currentMonth, 1));
}
}
/**
* @return the monthDayYear
*/
public boolean isMonthDayYear() {
return monthDayYear;
}
/**
* @param monthDayYear the monthDayYear to set
*/
public void setMonthDayYear(boolean monthDayYear) {
this.monthDayYear = monthDayYear;
removeAll();
addComponents();
}
/**
* @return the numericMonths
*/
public boolean isNumericMonths() {
return numericMonths;
}
/**
* @param numericMonths the numericMonths to set
*/
public void setNumericMonths(boolean numericMonths) {
this.numericMonths = numericMonths;
if(month != null) {
month.repaint();
}
}
/**
* {@inheritDoc}
*/
public String[] getPropertyNames() {
return new String[] {"startYear", "endYear", "currentYear", "currentDay", "currentMonth", "monthDayYear", "numericMonths"};
}
/**
* {@inheritDoc}
*/
public Class[] getPropertyTypes() {
return new Class[] {Integer.class, Integer.class, Integer.class, Integer.class, Integer.class, Integer.class, Integer.class, Boolean.class, Boolean.class};
}
/**
* {@inheritDoc}
*/
public Object getPropertyValue(String name) {
if(name.equals("startYear")) {
return new Integer(startYear);
}
if(name.equals("endYear")) {
return new Integer(endYear);
}
if(name.equals("currentYear")) {
return new Integer(currentYear);
}
if(name.equals("currentDay")) {
return new Integer(currentDay);
}
if(name.equals("currentMonth")) {
return new Integer(currentMonth);
}
if(name.equals("monthDayYear")) {
return new Boolean(monthDayYear);
}
if(name.equals("numericMonths")) {
return new Boolean(numericMonths);
}
return null;
}
/**
* {@inheritDoc}
*/
public String setPropertyValue(String name, Object value) {
if(name.equals("startYear")) {
setStartYear(Integer.parseInt(value.toString()));
return null;
}
if(name.equals("endYear")) {
setEndYear(Integer.parseInt(value.toString()));
return null;
}
if(name.equals("currentYear")) {
setCurrentYear(Integer.parseInt(value.toString()));
return null;
}
if(name.equals("currentDay")) {
setCurrentDay(Integer.parseInt(value.toString()));
return null;
}
if(name.equals("currentMonth")) {
setCurrentMonth(Integer.parseInt(value.toString()));
return null;
}
if(name.equals("monthDayYear")) {
setMonthDayYear(((Boolean)value).booleanValue());
return null;
}
if(name.equals("numericMonths")) {
setNumericMonths(((Boolean)value).booleanValue());
return null;
}
return super.setPropertyValue(name, value);
}
/**
* Sets the Month Rendering Prototype to be used, useful when the language
* is changed and you need the month spinner to be wider.
*
* @param monthPrototype a prototype to be used to calc the month cell size
*/
public void setMonthRenderingPrototype(String monthPrototype){
this.monthRenderingPrototype = monthPrototype;
}
}