package com.project.shared.client.utils; import com.google.common.base.Objects; import com.google.gwt.dom.client.NativeEvent; import com.google.gwt.dom.client.Touch; import com.google.gwt.event.dom.client.DomEvent; import com.google.gwt.event.shared.EventHandler; import com.google.gwt.event.shared.HandlerRegistration; import com.google.gwt.user.client.Event; import com.google.gwt.user.client.Event.NativePreviewEvent; import com.google.gwt.user.client.Event.NativePreviewHandler; import com.project.shared.client.events.SimpleEvent.Handler; import com.project.shared.data.Point2D; import com.project.shared.utils.loggers.Logger; public class EventUtils { public static <H extends EventHandler> boolean nativePreviewEventTypeIsAny(NativePreviewEvent nativePreviewEvent, DomEvent.Type<?>... domEventTypes) { for (DomEvent.Type<?> domEventType : domEventTypes) { if (nativePreviewEventTypeEquals(nativePreviewEvent, domEventType)) { return true; } } return false; } public static <H extends EventHandler> boolean nativePreviewEventTypeEquals(NativePreviewEvent nativePreviewEvent, DomEvent.Type<H> domEventType) { if ((null == nativePreviewEvent) || (null == nativePreviewEvent.getNativeEvent()) || (null == nativePreviewEvent.getNativeEvent().getType())) { return false; } return (Objects.equal(nativePreviewEvent.getNativeEvent().getType(), domEventType.getName())); } private static Point2D _lastKnownTouch = null; public static Point2D getCurrentMousePos() { Event currentEvent = Event.getCurrentEvent(); if (null == currentEvent){ return null; } if (EventUtils.hasTouches(currentEvent)) { Logger.info(ElementUtils.class, "mouse event " + currentEvent.toString() + " has touches: " + String.valueOf(currentEvent.getTouches().length())); if (0 < currentEvent.getTouches().length()) { Touch touch = currentEvent.getTouches().get(0); Logger.info(ElementUtils.class, "touch: " + touch.getClientX()); Logger.info(ElementUtils.class, touch.toString()); _lastKnownTouch = new Point2D(touch.getClientX(), touch.getClientY()); } return _lastKnownTouch; } return new Point2D(currentEvent.getClientX(), currentEvent.getClientY()); } public static <H extends EventHandler> HandlerRegistration addNativePreviewEvent( final DomEvent.Type<H> domEventType, final Handler<NativePreviewEvent> handler) { return Event.addNativePreviewHandler(new NativePreviewHandler() { @Override public void onPreviewNativeEvent(NativePreviewEvent event) { NativeEvent nativeEvent = null == event ? null : event.getNativeEvent(); if (null == nativeEvent) { return; } if (false == EventUtils.nativePreviewEventTypeEquals(event, domEventType)) { return; } handler.onFire(event); }}); } public static native final boolean hasTouches(NativeEvent evt) /*-{ return (undefined !== evt.touches); }-*/; }