package com.github.donkirkby.vograbulary.client; import com.github.donkirkby.vograbulary.russian.TargetDisplay; 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.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.AbsolutePanel; import com.google.gwt.user.client.ui.Image; public class GwtTargetDisplay extends TargetDisplay implements MouseDownHandler, MouseMoveHandler, MouseUpHandler, TouchStartHandler, TouchMoveHandler, TouchEndHandler { private static final int DRAG_MARGIN = 22; private Image insertButton; private Image dragButton; private AbsolutePanel panel; private boolean isDragging; public GwtTargetDisplay(Image insertButton, Image dragButton, AbsolutePanel panel) { super(new GwtLetterDisplayFactory(panel)); this.insertButton = insertButton; this.dragButton = dragButton; this.panel = panel; dragButton.addMouseDownHandler(this); dragButton.addMouseMoveHandler(this); dragButton.addMouseUpHandler(this); dragButton.addTouchStartHandler(this); dragButton.addTouchMoveHandler(this); dragButton.addTouchEndHandler(this); } @Override public int getDragX() { return panel.getWidgetLeft(dragButton); } @Override public void setDragX(int x) { panel.setWidgetPosition(dragButton, x, DRAG_MARGIN); } @Override public boolean isDragVisible() { return dragButton.isVisible(); } @Override public void setDragVisible(boolean isDragVisible) { dragButton.setVisible(isDragVisible); } @Override public boolean isInsertVisible() { return insertButton.isVisible(); } @Override public void setInsertVisible(boolean isInsertVisible) { insertButton.setVisible(isInsertVisible); } @Override public void onTouchStart(TouchStartEvent event) { event.preventDefault(); onStart(event.getTouches().get(0).getClientX()); } @Override public void onMouseDown(MouseDownEvent event) { event.preventDefault(); onStart(event.getClientX()); } private void onStart(int x) { Event.setCapture(dragButton.getElement()); isDragging = true; dragStart(x - panel.getWidgetLeft(dragButton)); } @Override public void onMouseMove(MouseMoveEvent event) { onMove(event.getClientX()); } @Override public void onTouchMove(TouchMoveEvent event) { onMove(event.getTouches().get(0).getClientX()); } private void onMove(int x) { if (isDragging) { drag(x - panel.getWidgetLeft(dragButton)); } } @Override public void onMouseUp(MouseUpEvent event) { onStop(); } @Override public void onTouchEnd(TouchEndEvent event) { onStop(); } private void onStop() { Event.releaseCapture(dragButton.getElement()); dragStop(); isDragging = false; } }