package org.geogebra.web.web.gui.view.algebra;
import org.geogebra.common.euclidian.event.AbstractEvent;
import org.geogebra.common.euclidian.event.PointerEventType;
import org.geogebra.common.gui.view.algebra.AlgebraController;
import org.geogebra.common.kernel.Kernel;
import org.geogebra.web.html5.event.PointerEvent;
import org.geogebra.web.html5.event.ZeroOffset;
import org.geogebra.web.html5.gui.util.CancelEventTimer;
import org.geogebra.web.html5.gui.util.LongTouchManager;
import org.geogebra.web.html5.gui.util.LongTouchTimer.LongTouchHandler;
import org.geogebra.web.web.gui.GuiManagerW;
import com.google.gwt.core.client.JsArray;
import com.google.gwt.dom.client.Element;
import com.google.gwt.dom.client.Touch;
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.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;
/**
* Algebra controller for web;
*
*/
public class AlgebraControllerW extends AlgebraController
implements MouseMoveHandler, MouseDownHandler, TouchStartHandler,
TouchEndHandler,
TouchMoveHandler, LongTouchHandler {
private LongTouchManager longTouchManager;
/**
* @param kernel
* kernel
*/
public AlgebraControllerW(Kernel kernel) {
super(kernel);
longTouchManager = LongTouchManager.getInstance();
}
@Override
public void handleLongTouch(int x, int y) {
PointerEvent event = new PointerEvent(x, y, PointerEventType.TOUCH, ZeroOffset.instance);
event.setIsRightClick(true);
mousePressed(event);
}
private void mousePressed(AbstractEvent e) {
getView().cancelEditItem();
boolean rightClick = app.isRightClickEnabled() && e.isRightClick();
// RIGHT CLICK
if (rightClick) {
// The default algebra menu will be created here (not for GeoElements).
// LEFT CLICK
} else {
//hide dialogs if they are open
((GuiManagerW)app.getGuiManager()).removePopup();
// When a single, new selection is made with no key modifiers
// we need to handle selection in mousePressed, not mouseClicked.
// By doing this selection early, a DnD drag will come afterwards
// and grab the new selection.
// All other selection types must be handled later in mouseClicked.
// In this case a DnD drag starts first and grabs the previously selected
// geos (e.g. cntrl-selected or EV selected) as the user expects.
// skipSelection = false; // flag to prevent duplicate selection in
// MouseClicked
// view.getPathForLocation is not yet implemented, but if it will be, note Window.getScrollLeft() (ticket #4049)
}
}
//=====================================================
// Drag and Drop
//=====================================================
@Override
public void onMouseDown(MouseDownEvent event) {
event.stopPropagation();
event.preventDefault();
if (CancelEventTimer.cancelMouseEvent()) {
return;
}
mousePressed(PointerEvent.wrapEventAbsolute(event, ZeroOffset.instance));
}
@Override
public void onTouchMove(TouchMoveEvent event) {
JsArray<Touch> targets = event.getTargetTouches();
AbstractEvent e = PointerEvent.wrapEvent(targets.get(targets.length()-1), ZeroOffset.instance);
Element el = Element.as(event.getNativeEvent().getEventTarget());
if (el == ((AlgebraViewW) getView()).getElement()) {
longTouchManager.rescheduleTimerIfRunning(this, e.getX(), e.getY());
}
CancelEventTimer.touchEventOccured();
}
@Override
public void onTouchEnd(TouchEndEvent event) {
longTouchManager.cancelTimer();
CancelEventTimer.touchEventOccured();
}
@Override
public void onTouchStart(TouchStartEvent event) {
JsArray<Touch> targets = event.getTargetTouches();
AbstractEvent e = PointerEvent.wrapEvent(targets.get(0), ZeroOffset.instance);
Element el = Element.as(event.getNativeEvent().getEventTarget());
if (el == ((AlgebraViewW) getView()).getElement()) {
longTouchManager.scheduleTimer(this, e.getX(), e.getY());
}
mousePressed(e);
CancelEventTimer.touchEventOccured();
}
@Override
public void onMouseMove(MouseMoveEvent event) {
event.preventDefault();
}
}