package org.geogebra.web.web.euclidian; import org.geogebra.common.util.MyMath; import org.geogebra.web.html5.euclidian.EuclidianControllerW; import com.google.gwt.core.client.JsArray; import com.google.gwt.dom.client.Touch; 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; public class SmartTouchHandler implements TouchStartHandler, TouchEndHandler, TouchMoveHandler { private final EuclidianControllerW ec; private Touch t1, t2; public SmartTouchHandler(EuclidianControllerW ec) { this.ec = ec; } @Override public void onTouchMove(TouchMoveEvent event) { JsArray<Touch> touches = event.getTargetTouches(); if (touches.length() == 2) { event.stopPropagation(); event.preventDefault(); t1 = touches.get(0); t2 = touches.get(1); ec.twoTouchMove(t1, t2); } else if (touches.length() == 1 && t2 == null) { if (t1 == null) { // no TouchStart since the last TouchEnd return; } t1 = touches.get(0); ec.onTouchMove(event); } else if (touches.length() == 1) { Touch t3 = touches.get(0); if (distance(t1, t3) < distance(t2, t3)) { t1 = t3; } else { t2 = t3; } event.stopPropagation(); event.preventDefault(); ec.twoTouchMove(t1, t2); } else { ec.onTouchMove(event); } } private static double distance(Touch touch1, Touch touch2) { return MyMath.length(touch1.getClientX() - touch2.getClientX(), touch1.getClientY() - touch2.getClientY()); } @Override public void onTouchEnd(TouchEndEvent event) { t1 = null; t2 = null; ec.onTouchEnd(event); } @Override public void onTouchStart(TouchStartEvent event) { JsArray<Touch> touches = event.getTargetTouches(); if (touches.length() == 2) { t1 = touches.get(0); t2 = touches.get(1); ec.twoTouchStart(t1, t2); ec.preventTouchIfNeeded(event); } else if (touches.length() == 1 && t1 != null) { t2 = touches.get(0); ec.twoTouchStart(t1, t2); ec.preventTouchIfNeeded(event); } else if (touches.length() == 1) { t1 = touches.get(0); // we saved the touch, proceed normally ec.onTouchStart(event); } else { ec.onTouchStart(event); } } }