package com.giftoftheembalmer.gotefarm.client;
import com.google.gwt.event.dom.client.ChangeEvent;
import com.google.gwt.event.dom.client.ChangeHandler;
import com.google.gwt.event.logical.shared.ValueChangeEvent;
import com.google.gwt.event.logical.shared.ValueChangeHandler;
import com.google.gwt.event.shared.HandlerRegistration;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.HasValue;
import com.google.gwt.user.client.ui.HasVerticalAlignment;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.ListBox;
import com.google.gwt.user.client.ui.TextBox;
public class DurationPicker extends Composite
implements ChangeHandler, HasValue<Integer> {
private int duration = 0;
private TextBox tb = new TextBox();
private ListBox lb = new ListBox();
private int current_unit = 0;
private final int DAYS = 0;
private final int HOURS = 1;
private final int MINUTES = 2;
private final int SECONDS = 3;
public DurationPicker() {
setValue(0);
HorizontalPanel hpanel = new HorizontalPanel();
hpanel.setVerticalAlignment(HasVerticalAlignment.ALIGN_MIDDLE);
tb.addChangeHandler(this);
tb.setText("0");
lb.addChangeHandler(this);
lb.addItem("Days");
lb.addItem("Hours");
lb.addItem("Minutes");
lb.addItem("Seconds");
lb.setSelectedIndex(SECONDS);
hpanel.add(tb);
hpanel.add(lb);
initWidget(hpanel);
setStyleName("DurationPicker");
}
public DurationPicker(int seconds) {
this();
setValue(seconds);
}
public void setVisibleLength(int len) {
tb.setVisibleLength(len);
}
public void setValue(Integer seconds, boolean fireEvents) {
if (seconds == null) {
throw new IllegalArgumentException("value must not be null");
}
if (duration == seconds) {
return;
}
duration = seconds;
if ((seconds % 86400) == 0) {
int days = seconds / 86400;
tb.setText("" + days);
lb.setSelectedIndex(DAYS);
current_unit = DAYS;
}
else if ((seconds % 3600) == 0) {
int hours = seconds / 3600;
tb.setText("" + hours);
lb.setSelectedIndex(HOURS);
current_unit = HOURS;
}
else if ((seconds % 60) == 0) {
int minutes = seconds / 60;
tb.setText("" + minutes);
lb.setSelectedIndex(MINUTES);
current_unit = MINUTES;
}
else {
tb.setText("" + seconds);
lb.setSelectedIndex(SECONDS);
current_unit = SECONDS;
}
if (fireEvents) {
ValueChangeEvent.fire(this, duration);
}
}
public void setValue(Integer value) {
setValue(value, false);
}
public void onChange(ChangeEvent event) {
Object sender = event.getSource();
if (sender == tb) {
try {
int amount = Integer.parseInt(tb.getText());
switch (lb.getSelectedIndex()) {
case DAYS:
setValue(amount * 86400, true);
break;
case HOURS:
setValue(amount * 3600, true);
break;
case MINUTES:
setValue(amount * 60, true);
break;
case SECONDS:
setValue(amount, true);
break;
}
}
catch (NumberFormatException e) {
setValue(getValue());
}
}
else if (sender == lb) {
int amount = Integer.parseInt(tb.getText());
switch (current_unit) {
case DAYS:
amount *= 86400;
break;
case HOURS:
amount *= 3600;
break;
case MINUTES:
amount *= 60;
break;
case SECONDS:
break;
}
int unit = lb.getSelectedIndex();
switch (unit) {
case DAYS:
amount /= 86400;
setValue(amount * 86400, true);
break;
case HOURS:
amount /= 3600;
setValue(amount * 3600, true);
break;
case MINUTES:
amount /= 60;
setValue(amount * 60, true);
break;
case SECONDS:
setValue(amount, true);
break;
}
tb.setText("" + amount);
current_unit = unit;
}
}
public Integer getValue() {
return duration;
}
public HandlerRegistration addValueChangeHandler(
ValueChangeHandler<Integer> handler) {
return addHandler(handler, ValueChangeEvent.getType());
}
}