package com.sksamuel.jqm4gwt.plugins.datebox; import java.util.Date; import com.google.gwt.event.logical.shared.HasAttachHandlers; import com.google.gwt.event.shared.EventHandler; import com.google.gwt.event.shared.GwtEvent; public class JQMCalBoxEvent extends GwtEvent<JQMCalBoxEvent.Handler> { public static class DisplayChangeData { /** the new date shown */ public final Date shownDate; /** current user-selected date */ public final Date selectedDate; /** Field Changed: <br> y - Year <br> m - Month <br> d - Date <br> h - Hour <br> i - Minute <br> s - Second <br> a - Meridiem <br> p - Special Case - offset changed by the picker controls (month/year) */ public final String thisChange; /** * Amount of change, +/- (0 in the case of thisChange == "p") */ public final int thisChangeAmount; public DisplayChangeData(Date shownDate, Date selectedDate, String thisChange, int thisChangeAmount) { this.shownDate = shownDate; this.selectedDate = selectedDate; this.thisChange = thisChange; this.thisChangeAmount = thisChangeAmount; } @Override public String toString() { return "DisplayChangeData [shownDate=" + shownDate + ", selectedDate=" + selectedDate + ", thisChange=" + thisChange + ", thisChangeAmount=" + thisChangeAmount + "]"; } } public static class OffsetData { public final Date newDate; /** * <br> y - Year * <br> m - Month * <br> d - Date * <br> h - Hour * <br> i - Minute * <br> s - Second * <br> a - Meridiem */ public final String changeType; /** Amount of change, +/- */ public final int changeAmount; public OffsetData(Date newDate, String changeType, int changeAmount) { this.newDate = newDate; this.changeType = changeType; this.changeAmount = changeAmount; } @Override public String toString() { return "OffsetData [newDate=" + newDate + ", changeType=" + changeType + ", changeAmount=" + changeAmount + "]"; } } public interface Handler extends EventHandler { /** * Triggered when the calendar display is changed - but only if the "selected" date * is not in the visible natural month. (If the date is still "visible", but in the previous * or next month, this event will still fire) */ void onDisplayChange(JQMCalBoxEvent event); /** * Triggered when the datebox control is changed. * <br> See <a href="http://dev.jtsage.com/jQM-DateBox/api/offset/">offset event</a> */ void onOffset(JQMCalBoxEvent event); } public static class DefaultHandler implements Handler { @Override public void onDisplayChange(JQMCalBoxEvent event) { } @Override public void onOffset(JQMCalBoxEvent event) { } } static Type<JQMCalBoxEvent.Handler> TYPE; /** * Fires an {@link JQMCalBoxEvent} on all registered handlers in the handler source. * * @param <S> The handler source type * @param source - the source of the handlers */ public static <S extends HasAttachHandlers> void fire(S source, DisplayChangeData data) { if (TYPE != null) { JQMCalBoxEvent event = new JQMCalBoxEvent(data); source.fireEvent(event); } } public static <S extends HasAttachHandlers> void fire(S source, OffsetData data) { if (TYPE != null) { JQMCalBoxEvent event = new JQMCalBoxEvent(data); source.fireEvent(event); } } public static Type<JQMCalBoxEvent.Handler> getType() { if (TYPE == null) { TYPE = new Type<JQMCalBoxEvent.Handler>(); } return TYPE; } private final DisplayChangeData dataDisplay; private final OffsetData dataOffset; protected JQMCalBoxEvent(DisplayChangeData data) { this.dataDisplay = data; this.dataOffset = null; } protected JQMCalBoxEvent(OffsetData data) { this.dataDisplay = null; this.dataOffset = data; } public DisplayChangeData getData() { return dataDisplay; } public OffsetData getDataOffset() { return dataOffset; } @Override public final Type<JQMCalBoxEvent.Handler> getAssociatedType() { return TYPE; } @Override public String toDebugString() { assertLive(); String s = super.toDebugString(); if (dataDisplay != null) { s += " dataDisplay = " + dataDisplay.toString(); } else if (dataOffset != null) { s += " dataOffset = " + dataOffset.toString(); } return s; } @Override protected void dispatch(JQMCalBoxEvent.Handler handler) { if (this.dataDisplay != null) handler.onDisplayChange(this); else if (this.dataOffset != null) handler.onOffset(this); } }