@ -0,0 +1,66 @@ | |||
package com.henninghall.date_picker; | |||
import android.os.Build; | |||
import android.view.View; | |||
import android.view.ViewGroup; | |||
import android.widget.RelativeLayout; | |||
import com.henninghall.date_picker.wheels.Wheel; | |||
import java.util.ArrayList; | |||
import java.util.Locale; | |||
public class WheelOrderUpdater | |||
{ | |||
private final PickerView pickerView; | |||
private String ymdPattern = ""; | |||
WheelOrderUpdater(final PickerView v) { | |||
this.pickerView = v; | |||
} | |||
public void update(final Locale locale, final Mode mode) { | |||
if (mode != Mode.date) { | |||
return; | |||
} | |||
String lastYmdPattern = ymdPattern; | |||
ymdPattern = Utils.localeToYmdPattern(locale); | |||
if(lastYmdPattern.equals(ymdPattern)) return; | |||
final ArrayList<Wheel> wheelOrder = this.ymdPatternToWheelOrder(ymdPattern); | |||
this.placeWheelRightOf(wheelOrder.get(0), wheelOrder.get(1)); | |||
this.placeWheelRightOf(wheelOrder.get(1), wheelOrder.get(2)); | |||
} | |||
private void placeWheelRightOf(final Wheel leftWheel, final Wheel rightWheel) { | |||
final RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(-2, Utils.getWheelHeight((View)this.pickerView)); | |||
params.addRule(1, leftWheel.id); | |||
if (Build.VERSION.SDK_INT >= 17) { | |||
params.addRule(17, leftWheel.id); | |||
} | |||
rightWheel.picker.setLayoutParams((ViewGroup.LayoutParams)params); | |||
} | |||
private ArrayList<Wheel> ymdPatternToWheelOrder(final String ymdPattern) { | |||
final String[] parts = ymdPattern.split("/"); | |||
final ArrayList<Wheel> wheelList = new ArrayList<Wheel>(); | |||
for (final String s : parts) { | |||
switch (s.charAt(0)) { | |||
case 'y': { | |||
wheelList.add(this.pickerView.yearWheel); | |||
break; | |||
} | |||
case 'M': { | |||
wheelList.add(this.pickerView.monthWheel); | |||
break; | |||
} | |||
case 'd': { | |||
wheelList.add(this.pickerView.dateWheel); | |||
break; | |||
} | |||
} | |||
} | |||
return wheelList; | |||
} | |||
} | |||
@ -0,0 +1,39 @@ | |||
package com.henninghall.date_picker.wheels; | |||
import java.util.*; | |||
import com.henninghall.date_picker.*; | |||
public class DateWheel extends Wheel | |||
{ | |||
public DateWheel(final PickerView pickerView, final int id) { | |||
super(pickerView, id); | |||
} | |||
@Override | |||
void init() { | |||
final int maxDate = 31; | |||
final int minDate = 1; | |||
final Calendar cal = this.pickerView.getInitialDate(); | |||
final String initialDate = this.format.format(cal.getTime()); | |||
for (int i = minDate; i <= maxDate; ++i) { | |||
final int currentDate = (Integer.valueOf(initialDate) + i) % maxDate + 1; | |||
final String currentDateString = String.valueOf(currentDate); | |||
this.values.add(currentDateString); | |||
this.displayValues.add(currentDateString); | |||
} | |||
this.picker.setDisplayedValues((String[])this.displayValues.toArray(new String[0])); | |||
this.picker.setMinValue(0); | |||
this.picker.setMaxValue(maxDate - minDate); | |||
} | |||
@Override | |||
public boolean visible() { | |||
return this.pickerView.mode == Mode.date; | |||
} | |||
@Override | |||
public String getFormatTemplate() { | |||
return "d"; | |||
} | |||
} |
@ -0,0 +1,39 @@ | |||
package com.henninghall.date_picker.wheels; | |||
import java.text.*; | |||
import java.util.*; | |||
import com.henninghall.date_picker.*; | |||
public class MonthWheel extends Wheel | |||
{ | |||
public MonthWheel(final PickerView pickerView, final int id) { | |||
super(pickerView, id); | |||
} | |||
@Override | |||
void init() { | |||
final int min = 0; | |||
final int max = 12; | |||
final Calendar cal = this.pickerView.getInitialDate(); | |||
final SimpleDateFormat format = new SimpleDateFormat(this.getFormatTemplate(), this.pickerView.locale); | |||
for (int i = min; i <= max; ++i) { | |||
this.values.add(format.format(cal.getTime())); | |||
this.displayValues.add(format.format(cal.getTime())); | |||
cal.add(2, 1); | |||
} | |||
this.picker.setDisplayedValues((String[])this.displayValues.toArray(new String[0])); | |||
this.picker.setMinValue(0); | |||
this.picker.setMaxValue(max); | |||
} | |||
@Override | |||
public boolean visible() { | |||
return this.pickerView.mode == Mode.date; | |||
} | |||
@Override | |||
public String getFormatTemplate() { | |||
return "LLLL"; | |||
} | |||
} | |||
@ -0,0 +1,63 @@ | |||
package com.henninghall.date_picker.wheels; | |||
import com.henninghall.date_picker.Mode; | |||
import com.henninghall.date_picker.PickerView; | |||
import java.util.Calendar; | |||
public class YearWheel extends Wheel | |||
{ | |||
private int defaultStartYear; | |||
private int defaultEndYear; | |||
public YearWheel(final PickerView pickerView, final int id) { | |||
super(pickerView, id); | |||
this.defaultStartYear = 0; | |||
this.defaultEndYear = 2100; | |||
} | |||
@Override | |||
void init() { | |||
final int startYear = getStartYear(); | |||
final int endYear = getEndYear() ; | |||
int max = endYear - startYear; | |||
for (int i = 0; i <= max; ++i) { | |||
values.add(String.valueOf(startYear + i)); | |||
displayValues.add(String.valueOf(startYear + i)); | |||
} | |||
picker.setDisplayedValues(displayValues.toArray(new String[0])); | |||
picker.setMinValue(0); | |||
picker.setMaxValue(max); | |||
} | |||
private int getEndYear() { | |||
if (this.pickerView.maxDate == null) { | |||
return this.defaultEndYear; | |||
} | |||
final Calendar cal = Calendar.getInstance(); | |||
cal.setTime(this.pickerView.maxDate); | |||
return cal.get(Calendar.YEAR); | |||
} | |||
private int getStartYear() { | |||
if (this.pickerView.minDate != null) { | |||
final Calendar cal = Calendar.getInstance(); | |||
cal.setTime(this.pickerView.minDate); | |||
return cal.get(Calendar.YEAR); | |||
} | |||
return this.defaultStartYear; | |||
} | |||
@Override | |||
public boolean visible() { | |||
return this.pickerView.mode == Mode.date; | |||
} | |||
@Override | |||
public String getFormatTemplate() { | |||
return "y"; | |||
} | |||
} | |||
@ -1,6 +1,6 @@ | |||
#Thu Apr 19 20:55:10 CEST 2018 | |||
#Wed Aug 29 20:29:50 CEST 2018 | |||
distributionBase=GRADLE_USER_HOME | |||
distributionPath=wrapper/dists | |||
zipStoreBase=GRADLE_USER_HOME | |||
zipStorePath=wrapper/dists | |||
distributionUrl=https\://services.gradle.org/distributions/gradle-3.5.1-all.zip | |||
distributionUrl=https\://services.gradle.org/distributions/gradle-4.4-all.zip |
@ -0,0 +1,17 @@ | |||
import React, { Component } from 'react'; | |||
import DatePicker from 'react-native-date-picker-x'; | |||
export default class DateMode extends Component { | |||
state = { date: new Date() } | |||
render = () => | |||
<DatePicker | |||
date={this.state.date} | |||
onDateChange={date => this.setState({ date })} | |||
mode={'date'} | |||
style={{borderWidth: 1}} | |||
locale={'sv-SE'} | |||
/> | |||
} |
@ -0,0 +1,82 @@ | |||
package com.henninghall.date_picker; | |||
import android.view.*; | |||
import com.facebook.react.uimanager.*; | |||
import net.time4j.android.*; | |||
import android.content.*; | |||
import android.support.annotation.*; | |||
import com.facebook.react.uimanager.annotations.*; | |||
import org.apache.commons.lang3.*; | |||
import java.util.*; | |||
import com.facebook.react.common.*; | |||
public class DatePickerManager extends SimpleViewManager<View> | |||
{ | |||
public static final String REACT_CLASS = "DatePickerManager"; | |||
public static ThemedReactContext context; | |||
public String getName() { | |||
return "DatePickerManager"; | |||
} | |||
public PickerView createViewInstance(final ThemedReactContext reactContext) { | |||
ApplicationStarter.initialize((Context)(DatePickerManager.context = reactContext), true); | |||
return new PickerView(); | |||
} | |||
@ReactProp(name = "mode") | |||
public void setMode(final PickerView view, @Nullable final String mode) { | |||
try { | |||
view.setMode(Mode.valueOf(mode)); | |||
} | |||
catch (Exception e) { | |||
throw new IllegalArgumentException("Invalid mode. Valid modes: 'datetime', 'date', 'time'"); | |||
} | |||
} | |||
@ReactProp(name = "date") | |||
public void setDate(final PickerView view, @Nullable final double date) { | |||
view.setDate(Utils.unixToDate(date)); | |||
} | |||
@ReactProp(name = "locale") | |||
public void setLocale(final PickerView view, @Nullable final String locale) { | |||
view.setLocale(LocaleUtils.toLocale(locale.replace('-', '_'))); | |||
view.requestLayout(); | |||
} | |||
@ReactProp(name = "minimumDate") | |||
public void setMinimumDate(final PickerView view, @Nullable final double date) { | |||
view.setMinimumDate(Utils.unixToDate(date)); | |||
} | |||
@ReactProp(name = "maximumDate") | |||
public void setMaximumDate(final PickerView view, @Nullable final double date) { | |||
view.setMaximumDate(Utils.unixToDate(date)); | |||
} | |||
@ReactProp(name = "fadeToColor") | |||
public void setFadeToColor(final PickerView view, @Nullable final String color) { | |||
view.style.setFadeToColor(color); | |||
} | |||
@ReactProp(name = "textColor") | |||
public void setTextColor(final PickerView view, @Nullable final String color) { | |||
view.style.setTextColor(color); | |||
} | |||
@ReactProp(name = "minuteInterval") | |||
public void setMinuteInterval(final PickerView view, @Nullable final int interval) throws Exception { | |||
if (interval < 0 || interval > 59) { | |||
throw new Exception("Minute interval out of bounds"); | |||
} | |||
if (interval > 1) { | |||
view.setMinuteInterval(interval); | |||
} | |||
} | |||
public Map getExportedCustomBubblingEventTypeConstants() { | |||
return MapBuilder.builder().put((Object)"dateChange", (Object)MapBuilder.of((Object)"phasedRegistrationNames", (Object)MapBuilder.of((Object)"bubbled", (Object)"onChange"))).build(); | |||
} | |||
} | |||
@ -0,0 +1,38 @@ | |||
-ckage com.henninghall.date_picker.wheels; | |||
import java.util.*; | |||
import com.henninghall.date_picker.*; | |||
public class DateWheel extends Wheel | |||
{ | |||
public DateWheel(final PickerView pickerView, final int id) { | |||
super(pickerView, id); | |||
} | |||
@Override | |||
void init() { | |||
final int maxDate = 31; | |||
final int minDate = 1; | |||
final Calendar cal = this.pickerView.getInitialDate(); | |||
final String initialDate = this.format.format(cal.getTime()); | |||
for (int i = minDate; i <= maxDate; ++i) { | |||
final int currentDate = (Integer.valueOf(initialDate) + i) % maxDate + 1; | |||
final String currentDateString = String.valueOf(currentDate); | |||
this.values.add(currentDateString); | |||
this.displayValues.add(currentDateString); | |||
} | |||
this.picker.setDisplayedValues((String[])this.displayValues.toArray(new String[0])); | |||
this.picker.setMinValue(0); | |||
this.picker.setMaxValue(maxDate - minDate); | |||
} | |||
@Override | |||
public boolean visible() { | |||
return this.pickerView.mode == Mode.date; | |||
} | |||
public String getFormatTemplate() { | |||
return "d"; | |||
} | |||
} |
@ -0,0 +1,9 @@ | |||
package com.henninghall.date_picker; | |||
public enum Mode | |||
{ | |||
date, | |||
time, | |||
datetime; | |||
} | |||
@ -0,0 +1,38 @@ | |||
package com.henninghall.date_picker.wheels; | |||
import java.text.*; | |||
import java.util.*; | |||
import com.henninghall.date_picker.*; | |||
public class MonthWheel extends Wheel | |||
{ | |||
public MonthWheel(final PickerView pickerView, final int id) { | |||
super(pickerView, id); | |||
} | |||
@Override | |||
void init() { | |||
final int min = 0; | |||
final int max = 12; | |||
final Calendar cal = this.pickerView.getInitialDate(); | |||
final SimpleDateFormat format = new SimpleDateFormat(this.getFormatTemplate(), this.pickerView.locale); | |||
for (int i = min; i <= max; ++i) { | |||
this.values.add(format.format(cal.getTime())); | |||
this.displayValues.add(format.format(cal.getTime())); | |||
cal.add(2, 1); | |||
} | |||
this.picker.setDisplayedValues((String[])this.displayValues.toArray(new String[0])); | |||
this.picker.setMinValue(0); | |||
this.picker.setMaxValue(max); | |||
} | |||
@Override | |||
public boolean visible() { | |||
return this.pickerView.mode == Mode.date; | |||
} | |||
public String getFormatTemplate() { | |||
return "LLLL"; | |||
} | |||
} | |||
@ -0,0 +1,184 @@ | |||
package com.henninghall.date_picker; | |||
import android.widget.*; | |||
import cn.carbswang.android.numberpickerview.library.*; | |||
import android.content.*; | |||
import com.henninghall.date_picker.wheels.*; | |||
import com.facebook.react.uimanager.events.*; | |||
import java.text.*; | |||
import com.facebook.react.bridge.*; | |||
import android.view.*; | |||
import android.os.*; | |||
import org.apache.commons.lang3.time.*; | |||
import com.henninghall.date_picker.wheelFunctions.*; | |||
import java.util.*; | |||
public class PickerView extends RelativeLayout | |||
{ | |||
private final NumberPickerView hourPicker; | |||
private final NumberPickerView ampmPicker; | |||
private SimpleDateFormat dateFormat; | |||
private HourWheel hourWheel; | |||
private DayWheel dayWheel; | |||
public MinutesWheel minutesWheel; | |||
private AmPmWheel ampmWheel; | |||
private Date minDate; | |||
private Date maxDate; | |||
public int minuteInterval; | |||
public Locale locale; | |||
public Mode mode; | |||
public Style style; | |||
WheelChangeListener onWheelChangeListener; | |||
private final Runnable measureAndLayout; | |||
public PickerView() { | |||
super((Context)DatePickerManager.context); | |||
this.minuteInterval = 1; | |||
this.onWheelChangeListener = new WheelChangeListener() { | |||
@Override | |||
public void onChange(final Wheel wheel) { | |||
final WritableMap event = Arguments.createMap(); | |||
try { | |||
final Date date = PickerView.this.dateFormat.parse(PickerView.this.getDateString()); | |||
if (PickerView.this.minDate != null && date.before(PickerView.this.minDate)) { | |||
PickerView.this.applyOnVisibleWheels(new AnimateToDate(PickerView.this.minDate)); | |||
} | |||
else if (PickerView.this.maxDate != null && date.after(PickerView.this.maxDate)) { | |||
PickerView.this.applyOnVisibleWheels(new AnimateToDate(PickerView.this.maxDate)); | |||
} | |||
else { | |||
event.putDouble("date", (double)date.getTime()); | |||
((RCTEventEmitter)DatePickerManager.context.getJSModule((Class)RCTEventEmitter.class)).receiveEvent(PickerView.this.getId(), "dateChange", event); | |||
} | |||
} | |||
catch (ParseException e) { | |||
e.printStackTrace(); | |||
} | |||
} | |||
}; | |||
this.measureAndLayout = new Runnable() { | |||
@Override | |||
public void run() { | |||
PickerView.this.measure(View.MeasureSpec.makeMeasureSpec(PickerView.this.getWidth(), 1073741824), View.MeasureSpec.makeMeasureSpec(PickerView.this.getHeight(), 1073741824)); | |||
PickerView.this.layout(PickerView.this.getLeft(), PickerView.this.getTop(), PickerView.this.getRight(), PickerView.this.getBottom()); | |||
} | |||
}; | |||
final View rootView = inflate(this.getContext(), R.layout.datepicker_view, (ViewGroup)this); | |||
this.style = new Style(this); | |||
final RelativeLayout wheelsWrapper = (RelativeLayout)rootView.findViewById(R.id.wheelsWrapper); | |||
wheelsWrapper.setWillNotDraw(false); | |||
this.locale = ((Build.VERSION.SDK_INT >= 21) ? Locale.forLanguageTag("en") : Locale.getDefault()); | |||
final NumberPickerView dayPicker = (NumberPickerView)rootView.findViewById(R.id.day); | |||
this.dayWheel = new DayWheel(dayPicker, this); | |||
final NumberPickerView minutePicker = (NumberPickerView)rootView.findViewById(R.id.minutes); | |||
this.minutesWheel = new MinutesWheel(minutePicker, this); | |||
this.ampmPicker = (NumberPickerView)rootView.findViewById(R.id.ampm); | |||
this.ampmWheel = new AmPmWheel(this.ampmPicker, this); | |||
this.hourPicker = (NumberPickerView)rootView.findViewById(R.id.hour); | |||
this.hourWheel = new HourWheel(this.hourPicker, this); | |||
this.dateFormat = new SimpleDateFormat(this.getDateFormatTemplate(), Locale.US); | |||
this.changeAmPmWhenPassingMidnightOrNoon(); | |||
} | |||
private void changeAmPmWhenPassingMidnightOrNoon() { | |||
this.hourPicker.setOnValueChangeListenerInScrolling((NumberPickerView.OnValueChangeListenerInScrolling)new NumberPickerView.OnValueChangeListenerInScrolling() { | |||
public void onValueChangeInScrolling(final NumberPickerView picker, final int oldVal, final int newVal) { | |||
if (Utils.usesAmPm(PickerView.this.locale)) { | |||
final String oldValue = PickerView.this.hourWheel.getValueAtIndex(oldVal); | |||
final String newValue = PickerView.this.hourWheel.getValueAtIndex(newVal); | |||
final boolean passingNoonOrMidnight = (oldValue.equals("12") && newValue.equals("11")) || (oldValue.equals("11") && newValue.equals("12")); | |||
if (passingNoonOrMidnight) { | |||
PickerView.this.ampmPicker.smoothScrollToValue((PickerView.this.ampmPicker.getValue() + 1) % 2, false); | |||
} | |||
} | |||
} | |||
}); | |||
} | |||
public void setMinimumDate(final Date date) { | |||
this.minDate = DateUtils.truncate(date, 12); | |||
} | |||
public void setMaximumDate(final Date date) { | |||
this.maxDate = DateUtils.truncate(date, 12); | |||
} | |||
public void setDate(final Date date) { | |||
this.applyOnAllWheels(new SetDate(date)); | |||
} | |||
public void setLocale(final Locale locale) { | |||
this.locale = locale; | |||
this.dateFormat = new SimpleDateFormat(this.getDateFormatTemplate(), Locale.US); | |||
this.applyOnAllWheels(new Refresh()); | |||
} | |||
public void setMinuteInterval(final int interval) { | |||
this.minuteInterval = interval; | |||
this.applyOnVisibleWheels(new Refresh()); | |||
} | |||
public Calendar getInitialDate() { | |||
final Calendar cal = Calendar.getInstance(); | |||
if (this.minuteInterval <= 1) { | |||
return cal; | |||
} | |||
final int exactMinute = Integer.valueOf(this.minutesWheel.format.format(cal.getTime())); | |||
final int diffSinceLastInterval = exactMinute % this.minuteInterval; | |||
final int diffAhead = this.minuteInterval - diffSinceLastInterval; | |||
final int diffBehind = -diffSinceLastInterval; | |||
final boolean closerToPrevious = this.minuteInterval / 2 > diffSinceLastInterval; | |||
final int diffToExactValue = closerToPrevious ? diffBehind : diffAhead; | |||
cal.add(12, diffToExactValue); | |||
return (Calendar)cal.clone(); | |||
} | |||
private String getDateFormatTemplate() { | |||
return this.dayWheel.getFormatTemplate() + " " + this.hourWheel.getFormatTemplate() + " " + this.minutesWheel.getFormatTemplate() + this.ampmWheel.getFormatTemplate(); | |||
} | |||
private String getDateString() { | |||
return this.dayWheel.getValue() + " " + this.hourWheel.getValue() + " " + this.minutesWheel.getValue() + this.ampmWheel.getValue(); | |||
} | |||
public void setMode(final Mode mode) { | |||
this.mode = mode; | |||
this.applyOnAllWheels(new Refresh()); | |||
} | |||
public Collection<Wheel> getVisibleWheels() { | |||
final Collection<Wheel> visibleWheels = new ArrayList<Wheel>(); | |||
for (final Wheel wheel : this.getAllWheels()) { | |||
if (wheel.visible()) { | |||
visibleWheels.add(wheel); | |||
} | |||
} | |||
return visibleWheels; | |||
} | |||
public List<Wheel> getAllWheels() { | |||
return new ArrayList<Wheel>(Arrays.asList(this.dayWheel, this.hourWheel, this.minutesWheel, this.ampmWheel)); | |||
} | |||
public void applyOnAllWheels(final WheelFunction function) { | |||
for (final Wheel wheel : this.getAllWheels()) { | |||
function.apply(wheel); | |||
} | |||
} | |||
public void applyOnVisibleWheels(final WheelFunction function) { | |||
for (final Wheel wheel : this.getVisibleWheels()) { | |||
function.apply(wheel); | |||
} | |||
} | |||
public void requestLayout() { | |||
super.requestLayout(); | |||
this.post(this.measureAndLayout); | |||
} | |||
public WheelChangeListener getListener() { | |||
return this.onWheelChangeListener; | |||
} | |||
} | |||
@ -0,0 +1,100 @@ | |||
package com.henninghall.date_picker.wheels; | |||
import com.henninghall.date_picker.*; | |||
import cn.carbswang.android.numberpickerview.library.*; | |||
import java.text.*; | |||
import java.util.*; | |||
import org.apache.commons.lang3.*; | |||
public abstract class Wheel | |||
{ | |||
private final Wheel self; | |||
public PickerView pickerView; | |||
private String userSetValue; | |||
ArrayList<String> values; | |||
ArrayList<String> displayValues; | |||
public NumberPickerView picker; | |||
public SimpleDateFormat format; | |||
SimpleDateFormat displayFormat; | |||
abstract void init(); | |||
public abstract boolean visible(); | |||
abstract String getFormatTemplate(); | |||
public Wheel(final NumberPickerView picker, final PickerView pickerView) { | |||
this.self = this; | |||
this.pickerView = pickerView; | |||
this.picker = picker; | |||
this.refresh(false); | |||
picker.setOnValueChangedListener((NumberPickerView.OnValueChangeListener)new NumberPickerView.OnValueChangeListener() { | |||
public void onValueChange(final NumberPickerView picker, final int oldVal, final int newVal) { | |||
pickerView.getListener().onChange(Wheel.this.self); | |||
} | |||
}); | |||
} | |||
public int getIndexOfDate(final Date date) { | |||
return this.values.indexOf(this.format.format(date)); | |||
} | |||
public void animateToDate(final Date date) { | |||
this.picker.smoothScrollToValue(this.getIndexOfDate(date)); | |||
} | |||
public String getValue() { | |||
if (!this.visible()) { | |||
return this.userSetValue; | |||
} | |||
return this.getValueAtIndex(this.getIndex()); | |||
} | |||
public int getIndex() { | |||
return this.picker.getValue(); | |||
} | |||
public String getValueAtIndex(final int index) { | |||
return this.values.get(index); | |||
} | |||
public void setValue(final Date date) { | |||
this.userSetValue = this.format.format(date); | |||
final int index = this.getIndexOfDate(date); | |||
if (index > -1) { | |||
if (this.picker.getValue() == 0) { | |||
this.picker.setValue(index); | |||
} | |||
else { | |||
this.picker.smoothScrollToValue(index); | |||
} | |||
} | |||
} | |||
public void refresh(final boolean keepOldValue) { | |||
this.displayFormat = new SimpleDateFormat(this.getFormatTemplate(), this.pickerView.locale); | |||
this.format = new SimpleDateFormat(this.getFormatTemplate(), LocaleUtils.toLocale("en_US")); | |||
this.values = new ArrayList<String>(); | |||
this.displayValues = new ArrayList<String>(); | |||
final int oldValue = this.picker.getValue(); | |||
if (this.visible()) { | |||
this.add(); | |||
this.init(); | |||
if (keepOldValue) { | |||
this.picker.setValue(oldValue); | |||
} | |||
} | |||
else { | |||
this.remove(); | |||
} | |||
} | |||
private void remove() { | |||
this.picker.setVisibility(8); | |||
} | |||
private void add() { | |||
this.picker.setVisibility(0); | |||
} | |||
} | |||
@ -0,0 +1,56 @@ | |||
package com.henninghall.date_picker; | |||
import com.henninghall.date_picker.wheels.*; | |||
import java.util.*; | |||
import android.widget.*; | |||
import android.os.*; | |||
import android.view.*; | |||
public class WheelOrderUpdater | |||
{ | |||
private final PickerView pickerView; | |||
WheelOrderUpdater(final PickerView v) { | |||
this.pickerView = v; | |||
} | |||
public void update(final Locale locale, final Mode mode) { | |||
if (mode != Mode.date) { | |||
return; | |||
} | |||
final String ymdPattern = Utils.localeToYmdPattern(locale); | |||
final ArrayList<Wheel> wheelOrder = this.ymdPatternToWheelOrder(ymdPattern); | |||
this.placeWheelRightOf(wheelOrder.get(0), wheelOrder.get(1)); | |||
this.placeWheelRightOf(wheelOrder.get(1), wheelOrder.get(2)); | |||
} | |||
private void placeWheelRightOf(final Wheel leftWheel, final Wheel rightWheel) { | |||
final RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(-2, Utils.getWheelHeight((View)this.pickerView)); | |||
params.addRule(1, leftWheel.id); | |||
if (Build.VERSION.SDK_INT >= 17) { | |||
params.addRule(17, leftWheel.id); | |||
} | |||
rightWheel.picker.setLayoutParams((ViewGroup.LayoutParams)params); | |||
} | |||
private ArrayList<Wheel> ymdPatternToWheelOrder(final String ymdPattern) { | |||
final String[] parts = ymdPattern.split("/"); | |||
final ArrayList<Wheel> wheelList = new ArrayList<Wheel>(); | |||
for (final String s : parts) { | |||
switch (s.charAt(0)) { | |||
case 'y': { | |||
wheelList.add(this.pickerView.yearWheel); | |||
} | |||
case 'M': { | |||
wheelList.add(this.pickerView.monthWheel); | |||
} | |||
case 'd': { | |||
wheelList.add(this.pickerView.dateWheel); | |||
break; | |||
} | |||
} | |||
} | |||
return wheelList; | |||
} | |||
} | |||
@ -0,0 +1,58 @@ | |||
package com.henninghall.date_picker.wheels; | |||
import java.util.*; | |||
import com.henninghall.date_picker.*; | |||
public class YearWheel extends Wheel | |||
{ | |||
private int defaultStartYear; | |||
private int defaultEndYear; | |||
public YearWheel(final PickerView pickerView, final int id) { | |||
super(pickerView, id); | |||
this.defaultStartYear = 0; | |||
this.defaultEndYear = 2100; | |||
} | |||
@Override | |||
void init() { | |||
final int startYear = this.getStartYear(); | |||
final int endYear = this.getEndYear(); | |||
for (int i = startYear; i <= endYear; ++i) { | |||
this.values.add(String.valueOf(i)); | |||
this.displayValues.add(String.valueOf(i)); | |||
} | |||
this.picker.setDisplayedValues((String[])this.displayValues.toArray(new String[0])); | |||
final int year = Calendar.getInstance().get(1); | |||
this.picker.setMinValue(startYear); | |||
this.picker.setMaxValue(endYear); | |||
} | |||
private int getEndYear() { | |||
if (this.pickerView.maxDate == null) { | |||
return this.defaultEndYear; | |||
} | |||
final Calendar cal = Calendar.getInstance(); | |||
cal.setTime(this.pickerView.maxDate); | |||
return cal.get(1); | |||
} | |||
private int getStartYear() { | |||
if (this.pickerView.minDate != null) { | |||
final Calendar cal = Calendar.getInstance(); | |||
cal.setTime(this.pickerView.minDate); | |||
return cal.get(1); | |||
} | |||
return this.defaultStartYear; | |||
} | |||
@Override | |||
public boolean visible() { | |||
return this.pickerView.mode == Mode.date; | |||
} | |||
public String getFormatTemplate() { | |||
return "y"; | |||
} | |||
} | |||