package com.himamis.retex.editor.web; import com.google.gwt.core.client.JsArray; import com.google.gwt.dom.client.Touch; import com.google.gwt.event.dom.client.DoubleClickEvent; import com.google.gwt.event.dom.client.DoubleClickHandler; import com.google.gwt.event.dom.client.MouseDownEvent; import com.google.gwt.event.dom.client.MouseDownHandler; import com.google.gwt.event.dom.client.MouseMoveEvent; import com.google.gwt.event.dom.client.MouseMoveHandler; import com.google.gwt.event.dom.client.MouseUpEvent; import com.google.gwt.event.dom.client.MouseUpHandler; import com.google.gwt.event.dom.client.TouchEndEvent; import com.google.gwt.event.dom.client.TouchEndHandler; import com.google.gwt.event.dom.client.TouchEvent; 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.google.gwt.user.client.ui.Widget; import com.himamis.retex.editor.share.event.ClickListener; import com.himamis.retex.renderer.share.SelectionBox; public class ClickAdapterW implements MouseUpHandler, MouseDownHandler, MouseMoveHandler, TouchStartHandler, TouchMoveHandler, TouchEndHandler, DoubleClickHandler { private ClickListener handler; private boolean pointerIsDown = false; private Widget widget; private MathFieldW field; private long lastTouchDown; public ClickAdapterW(ClickListener handler, MathFieldW field) { this.handler = handler; this.field = field; } @Override public void onMouseDown(MouseDownEvent event) { if (!field.isEnabled() || lastTouchDown > System.currentTimeMillis() - 200) { return; } SelectionBox.touchSelection = false; handler.onPointerDown(event.getX(), event.getY()); Event.setCapture(widget.getElement()); this.pointerIsDown = true; } @Override public void onTouchStart(TouchStartEvent event) { if (!field.isEnabled()) { return; } SelectionBox.touchSelection = true; event.preventDefault(); handler.onPointerDown(getX(event), getY(event)); Event.setCapture(widget.getElement()); this.pointerIsDown = true; lastTouchDown = System.currentTimeMillis(); } private static int getX(TouchEvent<?> event) { Touch touch = getRelevantTouch(event); return touch == null ? 0 : touch.getClientX(); } private static int getY(TouchEvent<?> event) { Touch touch = getRelevantTouch(event); return touch == null ? 0 : touch.getClientY(); } public static Touch getRelevantTouch(TouchEvent<?> event) { JsArray<?> touches = event.getTouches().length() == 0 ? event.getChangedTouches() : event.getTouches(); return (Touch) touches.get(0); } @Override public void onMouseUp(MouseUpEvent event) { if (!field.isEnabled() || SelectionBox.touchSelection) { return; } Event.releaseCapture(widget.getElement()); this.pointerIsDown = false; handler.onPointerUp(event.getX(), event.getY()); } @Override public void onTouchEnd(TouchEndEvent event) { if (!field.isEnabled()) { return; } Event.releaseCapture(widget.getElement()); this.pointerIsDown = false; handler.onPointerUp(getX(event), getY(event)); } @Override public void onTouchMove(TouchMoveEvent event) { if (this.pointerIsDown) { handler.onPointerMove(getX(event), getY(event)); } } @Override public void onMouseMove(MouseMoveEvent event) { if (this.pointerIsDown) { handler.onPointerMove(event.getX(), event.getY()); } } public void listenTo(Widget html) { widget = html; html.addDomHandler(this, MouseDownEvent.getType()); html.addDomHandler(this, MouseMoveEvent.getType()); html.addDomHandler(this, MouseUpEvent.getType()); html.addDomHandler(this, TouchStartEvent.getType()); html.addDomHandler(this, TouchMoveEvent.getType()); html.addDomHandler(this, TouchEndEvent.getType()); html.addDomHandler(this, DoubleClickEvent.getType()); } @Override public void onDoubleClick(DoubleClickEvent event) { handler.onLongPress(event.getX(), event.getY()); } }