Here's one way to support arbitrary events:
// iOS & Android touch events:
private final static String TOUCHSTART = "touchstart";
private final static String TOUCHMOVE = "touchmove";
private final static String TOUCHEND = "touchend";
private final static String TOUCHCANCEL = "touchcancel";
private final static int TOUCHTIMER = 550;
private Timer touchTimer = null;
private boolean cancelClickEvent = false;
private void addTouchListeners(Element element)
{
if (TouchHandler.supportsTouch())
{
sinkEvents(Event.ONCLICK);
addEventListener(element, TOUCHSTART, this, false);
addEventListener(element, TOUCHMOVE, this, false);
addEventListener(element, TOUCHEND, this, false);
addEventListener(element, TOUCHCANCEL, this, false);
}
}
private static native void addEventListener(Element element,
String event,
EventListener
listener,
boolean capture)
/*-{
element.addEventListener(
event,
function(e)
{
listener.@com.google.gwt.user.client.EventListener::onBrowserEvent(Lcom/
google/gwt/user/client/Event;)(e);
},
capture);
}-*/;
@Override
public void onBrowserEvent(Event event)
{
String type = event.getType();
if (TOUCHSTART.equals(type))
{
TouchEvent touchEvent = event.cast();
if (touchEvent.getTouches().length() == 1)
startTouchTimer(event);
else
cancelTouchTimer();
}
else if (TOUCHMOVE.equals(type))
{
cancelTouchTimer();
}
else if (TOUCHEND.equals(type))
{
cancelTouchTimer();
}
else if (TOUCHCANCEL.equals(type))
{
cancelTouchTimer();
}
else if ("click".equals(type))
{
if (cancelClickEvent)
{
event.preventDefault();
event.stopPropagation();
}
else
{
super.onBrowserEvent(event);