package org.geogebra.web.touch.gui.view;
import org.geogebra.web.html5.awt.GFontW;
import org.geogebra.web.html5.main.AppW;
import org.geogebra.web.web.gui.view.consprotocol.ConstructionProtocolViewW;
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.ui.FlowPanel;
import com.google.gwt.user.client.ui.RootPanel;
/**
* ConstructionProtocolView for touch-devices
* @see ConstructionProtocolViewW
*/
public class ConstructionProtocolViewT extends ConstructionProtocolViewW {
/** long press timeout in ms **/
private static final int LONG_PRESS_TIMEOUT = 500;
/** **/
private static final int LONG_PRESS_THRESHOLD = 10;
/** **/
private static final int DUMMY_DRAG_ELEM_OFFSET_Y = 15;
/** y coordinates of first tap, used to detect longTaps **/
int yStart;
/** x coordinates of first tap, used to detect longTaps **/
int xStart;
/** start of first tap, used to detect longTaps **/
long startOfTap;
/** current y coordinates of touchMove **/
int yMove;
/** current x coordinates of touchMove **/
int xMove;
/** if tap was detected as "dragging a row" **/
boolean isDragging;
/** a dummy drag-element **/
FlowPanel dummyDragElem;
/**
* @param app {@link AppW}
*/
public ConstructionProtocolViewT(AppW app) {
super(app);
}
@Override
protected void addDragDropHandlers() {
table.addDomHandler(new TouchStartHandler() {
@Override
public void onTouchStart(TouchStartEvent event) {
isDragging = false;
startOfTap = System.currentTimeMillis();
yStart = event.getTouches().get(0).getClientY();
xStart = event.getTouches().get(0).getClientX();
}
}, TouchStartEvent.getType());
table.addDomHandler(new TouchMoveHandler() {
@Override
public void onTouchMove(TouchMoveEvent event) {
// used to get coordinates for TouchEnd
yMove = event.getTouches().get(0).getClientY();
xMove = event.getTouches().get(0).getClientX();
if (!isDragging && isLongTap()) {
//start dragging, select row to drag, show dummyDragElement
isDragging = true;
handleDrag(yStart);
dummyDragElem = new FlowPanel();
dummyDragElem.addStyleName("dummyDragElem");
dummyDragElem.getElement().setInnerHTML(draggedRow.getInnerHTML());
RootPanel.get().add(dummyDragElem);
event.preventDefault(); //to avoid scrolling
} else if(isDragging) {
dummyDragElem.getElement().setAttribute("style", getStyleString());
event.preventDefault();
}
//TODO if end of table is reached with pressed finger, scroll!!!
}
/**
*
* @return String - the style for the {@link ConstructionProtocolViewW#dummyDragElem dummy drag-element}
*/
private String getStyleString() {
int width = draggedRow.getOffsetWidth();
String color = draggedRow.getAttribute("style");
return color + "; width: " + width +
"px; background-color: #CCCCFF; opacity: 0.5; z-index: 900; position: absolute; left: " +
table.getElement().getAbsoluteLeft() + "px; top: " + (yMove - DUMMY_DRAG_ELEM_OFFSET_Y) +
"px; overflow: hidden; display: -webkit-inline-box;font-family: "
+ GFontW.GEOGEBRA_FONT_SANSERIF + ";";
}
/**
* @return true if it is a long tap
*/
private boolean isLongTap() {
return xMove <= xStart + LONG_PRESS_THRESHOLD && xMove >= xStart - LONG_PRESS_THRESHOLD &&
yMove <= yStart + LONG_PRESS_THRESHOLD && yMove >= yStart - LONG_PRESS_THRESHOLD &&
System.currentTimeMillis() > startOfTap + LONG_PRESS_TIMEOUT;
}
}, TouchMoveEvent.getType());
table.addDomHandler(new TouchEndHandler() {
@Override
public void onTouchEnd(TouchEndEvent event) {
if(draggedRow != null) {
draggedRow.removeClassName("isDragging");
}
if (!isDragging) {
return;
}
RootPanel.get().remove(dummyDragElem);
handleDrop(yMove);
isDragging = false;
}
}, TouchEndEvent.getType());
}
}