package com.sksamuel.jqm4gwt.events;
import java.util.HashMap;
import java.util.Map;
import com.google.gwt.core.client.JavaScriptObject;
import com.google.gwt.event.shared.EventHandler;
import com.google.gwt.event.shared.GwtEvent;
import com.google.gwt.event.shared.GwtEvent.Type;
public class JQMEventFactory {
private JQMEventFactory() {} // static class
private interface EventInstantiator<T extends EventHandler> {
JQMEvent<T> create(JavaScriptObject jQueryEvent);
GwtEvent.Type<T> getType();
}
private static final Map<String, EventInstantiator<?>> instantiators =
new HashMap<String, EventInstantiator<?>>();
static {
instantiators.put(JQMComponentEvents.CHANGE, new EventInstantiator<JQMChangeHandler>() {
private final Type<JQMChangeHandler> TYPE = new Type<JQMChangeHandler>();
@Override
public JQMEvent<JQMChangeHandler> create(JavaScriptObject jQueryEvent) {
return new JQMEvent<JQMChangeHandler>(jQueryEvent, getType());
}
@Override
public Type<JQMChangeHandler> getType() {
return TYPE;
}});
instantiators.put(JQMComponentEvents.INPUT, new EventInstantiator<JQMInputHandler>() {
private final Type<JQMInputHandler> TYPE = new Type<JQMInputHandler>();
@Override
public JQMEvent<JQMInputHandler> create(JavaScriptObject jQueryEvent) {
return new JQMEvent<JQMInputHandler>(jQueryEvent, getType());
}
@Override
public Type<JQMInputHandler> getType() {
return TYPE;
}});
instantiators.put(JQMComponentEvents.VCLICK, new EventInstantiator<JQMVClickHandler>() {
private final Type<JQMVClickHandler> TYPE = new Type<JQMVClickHandler>();
@Override
public JQMEvent<JQMVClickHandler> create(JavaScriptObject jQueryEvent) {
return new JQMEvent<JQMVClickHandler>(jQueryEvent, getType());
}
@Override
public Type<JQMVClickHandler> getType() {
return TYPE;
}});
instantiators.put(JQMComponentEvents.TAP_EVENT, new EventInstantiator<TapHandler>() {
@Override
public JQMEvent<TapHandler> create(JavaScriptObject jQueryEvent) {
return new TapEvent(jQueryEvent);
}
@Override
public Type<TapHandler> getType() {
return TapEvent.getType();
}});
instantiators.put(JQMComponentEvents.TAP_HOLD_EVENT, new EventInstantiator<TapHoldHandler>() {
@Override
public JQMEvent<TapHoldHandler> create(JavaScriptObject jQueryEvent) {
return new TapHoldEvent(jQueryEvent);
}
@Override
public Type<TapHoldHandler> getType() {
return TapHoldEvent.getType();
}});
instantiators.put(JQMComponentEvents.ORIENTATIONCHANGE, new EventInstantiator<JQMOrientationChangeHandler>() {
private final Type<JQMOrientationChangeHandler> TYPE = new Type<JQMOrientationChangeHandler>();
@Override
public JQMEvent<JQMOrientationChangeHandler> create(JavaScriptObject jQueryEvent) {
return new JQMEvent<JQMOrientationChangeHandler>(jQueryEvent, getType());
}
@Override
public Type<JQMOrientationChangeHandler> getType() {
return TYPE;
}});
}
public static JQMEvent<?> createEvent(String jqmEventName, JavaScriptObject jQueryEvent) {
EventInstantiator<?> i = instantiators.get(jqmEventName);
if (i != null) return i.create(jQueryEvent);
throw new RuntimeException("Cannot create event: " + jqmEventName);
}
public static Type<?> getType(String jqmEventName) {
EventInstantiator<?> i = instantiators.get(jqmEventName);
if (i != null) return i.getType();
throw new RuntimeException("Unknown event: " + jqmEventName);
}
/**
* @param handlerClass - needed for getting typed result
*/
public static <T extends EventHandler> Type<T> getType(String jqmEventName, Class<T> handlerClass) {
Type<?> t = getType(jqmEventName);
@SuppressWarnings("unchecked")
Type<T> rslt = (Type<T>) t;
return rslt;
}
}