package org.vaadin.touchkit.gwt.client.ui; import java.util.Date; import com.google.gwt.dom.client.Document; import com.google.gwt.dom.client.NativeEvent; import com.google.gwt.event.dom.client.TouchCancelEvent; import com.google.gwt.event.dom.client.TouchCancelHandler; import com.google.gwt.event.dom.client.TouchEndEvent; import com.google.gwt.event.dom.client.TouchEndHandler; import com.google.gwt.event.dom.client.TouchMoveEvent; import com.google.gwt.event.dom.client.TouchMoveHandler; import com.google.gwt.event.dom.client.TouchStartEvent; import com.google.gwt.event.dom.client.TouchStartHandler; import com.google.gwt.user.client.Event; import com.vaadin.client.VConsole; import com.vaadin.client.ui.VButton; public class TouchButton extends VButton implements TouchStartHandler, TouchCancelHandler, TouchEndHandler, TouchMoveHandler { static final long IGNORE_SIMULATED_CLICKS_THRESHOLD = 1500; private boolean touchStarted; private Date fastClickAt; public TouchButton() { if(VNavigationButton.useFastClicks) { addTouchStartHandler(this); addTouchCancelHandler(this); addTouchMoveHandler(this); addTouchEndHandler(this); } } public void onTouchMove(TouchMoveEvent event) { touchStarted = false; } public void onTouchEnd(TouchEndEvent event) { if (touchStarted) { event.preventDefault(); event.stopPropagation(); NativeEvent nativeEvent = event.getNativeEvent(); NativeEvent evt = Document.get().createClickEvent(1, nativeEvent.getScreenX(), nativeEvent.getScreenY(), nativeEvent.getClientX(), nativeEvent.getClientY(), false, false, false, false); getElement().dispatchEvent(evt); touchStarted = false; fastClickAt = new Date(); } } public void onTouchCancel(TouchCancelEvent event) { touchStarted = false; } @Override public void onBrowserEvent(Event event) { if (fastClickAt != null && event.getTypeInt() == Event.ONCLICK && (new Date().getTime() - fastClickAt.getTime()) < IGNORE_SIMULATED_CLICKS_THRESHOLD) { VConsole.log("Ignored simulated event fired by old ios or android " + (new Date().getTime() - fastClickAt.getTime())); fastClickAt = null; return; } super.onBrowserEvent(event); } public void onTouchStart(TouchStartEvent event) { setFocus(true); touchStarted = true; fastClickAt = null; } }