You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

109 lines
3.5 KiB

package com.henninghall.date_picker;
import com.henninghall.date_picker.wheels.Wheel;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Locale;
public class WheelOrder
{
private final HashMap<WheelType, Wheel> wheelPerWheelType;
private PickerView pickerView;
private ArrayList<WheelType> orderedWheels;
WheelOrder(final PickerView view) {
this.pickerView = view;
this.wheelPerWheelType = new HashMap<WheelType, Wheel>() {{
put(WheelType.DAY, pickerView.dayWheel);
put(WheelType.YEAR, pickerView.yearWheel);
put(WheelType.MONTH, pickerView.monthWheel);
put(WheelType.DATE, pickerView.dateWheel);
put(WheelType.HOUR, pickerView.hourWheel);
put(WheelType.MINUTE, pickerView.minutesWheel);
put(WheelType.AM_PM, pickerView.ampmWheel);
}};
}
private void updateAllWheels(final Locale locale) {
try {
this.orderedWheels = getOrderedWheels(locale);
pickerView.wheelsWrapper.removeAllViews();
for (int i = 0; i < wheelPerWheelType.size(); i++) {
Wheel w = getWheels(i);
if(w.visible()) {
pickerView.wheelsWrapper.addView(w.picker);
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
void update(final Locale locale) {
updateAllWheels(locale);
pickerView.emptyWheelUpdater.update();
}
private Wheel getWheels(int index){
return wheelPerWheelType.get(orderedWheels.get(index));
}
Wheel getVisibleWheel(int index){
return getVisibleWheels().get(index);
}
private ArrayList<Wheel> getVisibleWheels() {
ArrayList<Wheel> visibleOrderedWheels = new ArrayList<>();
for (WheelType wheelType : orderedWheels){
Wheel wheel = wheelPerWheelType.get(wheelType);
if(wheel.visible()) {
visibleOrderedWheels.add(wheel);
}
}
return visibleOrderedWheels;
}
private ArrayList<WheelType> getOrderedWheels(Locale locale) throws Exception {
String dateTimePattern = LocaleUtils.getDateTimePattern(locale);
ArrayList<WheelType> unorderedTypes = new ArrayList(Arrays.asList(WheelType.values()));
ArrayList<WheelType> orderedWheels = new ArrayList<>();
// Always put day wheel first
unorderedTypes.remove(WheelType.DAY);
orderedWheels.add(WheelType.DAY);
for (char ch : dateTimePattern.toCharArray()){
try {
WheelType wheelType = Utils.patternCharToWheelType(ch);
if (unorderedTypes.contains(wheelType)) {
unorderedTypes.remove(wheelType);
orderedWheels.add(wheelType);
}
} catch (Exception e) {
// ignore unknown pattern chars that not correspond to any wheel type
}
}
// If AM/PM wheel remains it means that the locale does not have AM/PM by default and it
// should be put last.
if(unorderedTypes.contains(WheelType.AM_PM)){
unorderedTypes.remove(WheelType.AM_PM);
orderedWheels.add(WheelType.AM_PM);
}
if(!unorderedTypes.isEmpty()) {
throw new Exception(unorderedTypes.size() + " wheel types cannot be ordered. Wheel type 0: " + unorderedTypes.get(0));
}
return orderedWheels;
}
}