/*
* 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;
/**
* Allows selecting a time of day either in 24 hour batches or AM/PM format
*
* @author Shai Almog
*/
public class TimeSpinner extends BaseSpinner {
private Spinner hour;
private Spinner minute;
private Spinner amPM;
private int startHour = 1;
private int endHour = 13;
private int minuteStep = 5;
private boolean durationMode;
private boolean showMeridiem = true;
private int currentHour = 8;
private int currentMinute = 0;
private boolean currentMeridiem;
/**
* Default constructor
*/
public TimeSpinner() {
}
/**
* Default constructor
*/
void initSpinner() {
if(hour == null) {
hour = Spinner.create(startHour, endHour, currentHour, 1);
minute = Spinner.create(0, 60, currentMinute, minuteStep);
if(currentMeridiem) {
amPM = Spinner.create(0, 2, 1, 1);
} else {
amPM = Spinner.create(0, 2, 0, 1);
}
((DefaultListCellRenderer)hour.getRenderer()).setRightAlignNumbers(true);
SpinnerRenderer<Object> twoDigitRender = new SpinnerRenderer<Object>() {
public Component getListCellRendererComponent(List list, Object value, int index, boolean isSelected) {
if(value != null && value instanceof Integer) {
int i = ((Integer)value).intValue();
if(i < 10) {
value = "0" + i;
}
}
return super.getListCellRendererComponent(list, value, index, isSelected);
}
};
minute.setRenderer(twoDigitRender);
SpinnerRenderer<Object> render = new SpinnerRenderer<Object>() {
public Component getListCellRendererComponent(List list, Object value, int index, boolean isSelected) {
if(value != null && value instanceof Integer) {
int d = ((Integer)value).intValue();
if(d == 0) {
value = "AM";
} else {
value = "PM";
}
}
return super.getListCellRendererComponent(list, value, index, isSelected);
}
};
amPM.setRenderer(render);
render.setRTL(false);
render.setShowNumbers(false);
twoDigitRender.setUIID("SpinnerRenderer");
render.setUIID("SpinnerRenderer");
amPM.setRenderingPrototype("WW");
amPM.initSpinnerRenderer();
minute.initSpinnerRenderer();
addComponents();
}
}
void addComponents() {
if(amPM != null) {
addComponent(hour);
addComponent(createSeparator());
addComponent(minute);
if(showMeridiem) {
addComponent(createSeparator());
addComponent(amPM);
}
}
}
/**
* {@inheritDoc}
*/
public String[] getPropertyNames() {
return new String[] {"currentHour", "currentMinute", "minuteStep", "currentMeridiem", "showMeridiem", "durationMode"};
}
/**
* {@inheritDoc}
*/
public Class[] getPropertyTypes() {
return new Class[] {Integer.class, Integer.class, Integer.class, Boolean.class, Boolean.class, Boolean.class};
}
/**
* {@inheritDoc}
*/
public Object getPropertyValue(String name) {
if(name.equals("durationMode")) {
if(durationMode) {
return Boolean.TRUE;
}
return Boolean.FALSE;
}
if(name.equals("currentHour")) {
return new Integer(currentHour);
}
if(name.equals("currentMinute")) {
return new Integer(currentMinute);
}
if(name.equals("minuteStep")) {
return new Integer(minuteStep);
}
if(name.equals("currentMeridiem")) {
if(currentMeridiem) {
return Boolean.TRUE;
}
return Boolean.FALSE;
}
if(name.equals("showMeridiem")) {
if(showMeridiem) {
return Boolean.TRUE;
}
return Boolean.FALSE;
}
return null;
}
/**
* {@inheritDoc}
*/
public String setPropertyValue(String name, Object value) {
if(name.equals("currentHour")) {
setCurrentHour(Integer.parseInt(value.toString()));
return null;
}
if(name.equals("currentMinute")) {
setCurrentMinute(Integer.parseInt(value.toString()));
return null;
}
if(name.equals("minuteStep")) {
setMinuteStep(Integer.parseInt(value.toString()));
return null;
}
if(name.equals("currentMeridiem")) {
setCurrentMeridiem(((Boolean)value).booleanValue());
return null;
}
if(name.equals("showMeridiem")) {
setShowMeridiem(((Boolean)value).booleanValue());
return null;
}
if(name.equals("durationMode")) {
setDurationMode(((Boolean)value).booleanValue());
return null;
}
return super.setPropertyValue(name, value);
}
/**
* @return the minuteStep
*/
public int getMinuteStep() {
return minuteStep;
}
/**
* @param minuteStep the minuteStep to set
*/
public void setMinuteStep(int minuteStep) {
this.minuteStep = minuteStep;
if(minute != null) {
minute.setModel(new SpinnerNumberModel(0, 60, currentMinute, minuteStep));
}
}
/**
* @return the showMeridiem
*/
public boolean isShowMeridiem() {
return showMeridiem && !durationMode;
}
/**
* Shows AM/PM indication
* @param showMeridiem the showMeridiem to set
*/
public void setShowMeridiem(boolean showMeridiem) {
if(durationMode) {
return;
}
this.showMeridiem = showMeridiem;
if(showMeridiem) {
startHour = 1;
endHour = 13;
} else {
startHour = 0;
endHour = 24;
}
if(hour != null) {
hour.setModel(new SpinnerNumberModel(startHour, endHour, currentHour, 1));
}
removeAll();
addComponents();
if(isInitialized()) {
getParent().revalidate();
}
}
/**
* The hour from 1-12 or 0-23
* @return the currentHour
*/
public int getCurrentHour() {
if(hour != null) {
return ((Integer)hour.getValue()).intValue();
}
return currentHour;
}
/**
* Set the hour from 1-12 or 0-23
* @param currentHour the currentHour to set
*/
public void setCurrentHour(int currentHour) {
this.currentHour = currentHour;
if(hour != null) {
hour.setValue(new Integer(currentHour));
}
}
/**
* @return the currentMinute
*/
public int getCurrentMinute() {
if(minute != null) {
return ((Integer)minute.getValue()).intValue();
}
return currentMinute;
}
/**
* @param currentMinute the currentMinute to set
*/
public void setCurrentMinute(int currentMinute) {
this.currentMinute = currentMinute;
if(minute != null) {
minute.setValue(new Integer(currentMinute));
}
}
/**
* @return the currentMeridiem
*/
public boolean isCurrentMeridiem() {
if(durationMode) {
return false;
}
if(amPM != null) {
return ((Integer)amPM.getValue()).intValue() != 0;
}
return currentMeridiem;
}
/**
* @param currentMeridiem the currentMeridiem to set
*/
public void setCurrentMeridiem(boolean currentMeridiem) {
if(durationMode) {
return;
}
this.currentMeridiem = currentMeridiem;
if(amPM != null) {
if(currentMeridiem) {
amPM.setValue(new Integer(1));
} else {
amPM.setValue(new Integer(0));
}
}
}
/**
* Duration mode uses the time spinner to indicate a duration in hours and minutes
* @return the durationMode
*/
public boolean isDurationMode() {
return durationMode;
}
/**
* Duration mode uses the time spinner to indicate a duration in hours and minutes
* @param durationMode the durationMode to set
*/
public void setDurationMode(boolean durationMode) {
if(durationMode) {
setShowMeridiem(false);
startHour = 0;
endHour = 24;
} else {
if(showMeridiem) {
startHour = 1;
endHour = 13;
} else {
startHour = 0;
endHour = 24;
}
}
this.durationMode = durationMode;
}
}