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.dom.client.ClickEvent; import com.google.gwt.event.dom.client.ClickHandler; 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.i18n.client.DateTimeFormat; import com.google.gwt.user.client.Command; import com.google.gwt.user.client.DOM; import com.google.gwt.user.client.DeferredCommand; import com.google.gwt.user.client.Event; import com.google.gwt.user.client.Timer; import com.google.gwt.user.client.ui.Composite; import com.google.gwt.user.client.ui.HasValue; import com.google.gwt.user.client.ui.ListBox; import com.google.gwt.user.client.ui.PopupPanel; import com.google.gwt.user.client.ui.TextBox; import java.util.Date; public class TimePicker extends Composite implements ChangeHandler, HasValue<Date> { public class TimePickerTB extends TextBox implements ClickHandler { private final DateTimeFormat dateFormatter; class PopupTime extends PopupPanel implements ChangeHandler { private boolean leave; private final TimePickerTB timePicker; private final ListBox lb; { this.leave = true; lb = new ListBox(); } @SuppressWarnings("deprecation") public PopupTime(TimePickerTB timePicker) { super(true); this.timePicker = timePicker; lb.addChangeHandler(this); lb.setVisibleItemCount(10); Date d = new Date(); for (int hour = 0; hour < 24; ++hour) { d.setHours(hour); d.setMinutes(0); lb.addItem(dateFormatter.format(d)); d.setMinutes(30); lb.addItem(dateFormatter.format(d)); } this.add(lb); sinkEvents(Event.ONBLUR); } public void hidePopup() { DeferredCommand.addCommand(new Command() { public void execute() { Timer t = new Timer() { public void run() { if (leave) { hide(); } else { leave = true; } } }; t.schedule(300); } }); } public void displayTime() { show(); } public void setDisplayedTime(Date d) { String t = dateFormatter.format(d); for (int i = 0; i < lb.getItemCount(); ++i) { if (lb.getItemText(i).equals(t)) { lb.setSelectedIndex(i); break; } } } public void onChange(ChangeEvent event) { ListBox lb = (ListBox)event.getSource(); Date sel = dateFormatter.parse(lb.getItemText(lb.getSelectedIndex())); timePicker.setSelectedDate(sel); timePicker.synchronizeFromDate(); hide(); leave = true; notifyListeners(); } } private PopupTime popup; private Date selectedDate; { dateFormatter = DateTimeFormat.getFormat("HH:mm"); popup = new PopupTime(this); } public TimePickerTB() { super(); setText(""); sinkEvents(Event.ONCHANGE | Event.ONKEYPRESS); addClickHandler(this); } public TimePickerTB(Date selectedDate) { this(); this.selectedDate = selectedDate; synchronizeFromDate(); } public void onBrowserEvent(Event event) { switch (DOM.eventGetType(event)) { case Event.ONBLUR: popup.hidePopup(); break; case Event.ONCHANGE: parseDate(); break; case Event.ONKEYPRESS: if (DOM.eventGetKeyCode(event) == 13) { parseDate(); showPopup(); } break; } super.onBrowserEvent(event); } public void onClick(ClickEvent event) { showPopup(); } public void synchronizeFromDate() { if (this.selectedDate != null) { this.setText(dateFormatter.format(this.selectedDate)); } else { this.setText(""); } } public void showPopup() { if (this.selectedDate != null) { popup.setDisplayedTime(this.selectedDate); } popup.setPopupPosition(this.getAbsoluteLeft()+150, this.getAbsoluteTop()); popup.displayTime(); } public void parseDate() { try { this.selectedDate = dateFormatter.parse(getText()); } catch (IllegalArgumentException e) { } synchronizeFromDate(); } public void setSelectedDate(Date value) { this.selectedDate = value; synchronizeFromDate(); } public Date getSelectedDate() { return (Date)this.selectedDate.clone(); } } TimePickerTB tptb; public TimePicker(Date selectedDate) { tptb = new TimePickerTB(selectedDate); tptb.addChangeHandler(this); initWidget(tptb); } public void onChange(ChangeEvent event) { notifyListeners(); } private void notifyListeners() { ValueChangeEvent.fire(this, getValue()); } public Date getValue() { return tptb.getSelectedDate(); } public void setValue(Date value) { setValue(value, false); } public void setValue(Date value, boolean fireEvents) { if (value == null) { throw new IllegalArgumentException("value must not be null"); } if (getValue().equals(value)) { return; } tptb.setSelectedDate(value); if (fireEvents) { ValueChangeEvent.fire(this, value); } } public HandlerRegistration addValueChangeHandler( ValueChangeHandler<Date> handler) { return addHandler(handler, ValueChangeEvent.getType()); } }