package com.project.website.canvas.client.worksheet;
import com.google.gwt.event.dom.client.HumanInputEvent;
import com.google.gwt.event.shared.HandlerRegistration;
import com.project.shared.client.events.SimpleEvent;
import com.project.shared.client.utils.EventUtils;
import com.project.shared.data.Point2D;
public class MouseDragHandler implements SimpleEvent.Handler<HumanInputEvent<?>>
{
private SimpleEvent.Handler<HumanInputEvent<?>> _currentHandler = null;
private int _dragStartSensitivity = 0;
private Point2D _initialPosition = null;
private SimpleEvent<HumanInputEvent<?>> _dragStartedEvent = new SimpleEvent<HumanInputEvent<?>>();
private SimpleEvent<HumanInputEvent<?>> _dragEvent = new SimpleEvent<HumanInputEvent<?>>();
public MouseDragHandler(Point2D initialPosition, int dragStartSensitivity)
{
this._initialPosition = initialPosition;
this._dragStartSensitivity = dragStartSensitivity;
this._currentHandler = new SimpleEvent.Handler<HumanInputEvent<?>>() {
@Override public void onFire(HumanInputEvent<?> arg) {
onInitialMouseMove(arg);
}};
}
public HandlerRegistration addDragStartedHandler(SimpleEvent.Handler<HumanInputEvent<?>> handler)
{
return this._dragStartedEvent.addHandler(handler);
}
public HandlerRegistration addDragHandler(SimpleEvent.Handler<HumanInputEvent<?>> handler)
{
return this._dragEvent.addHandler(handler);
}
private void onInitialMouseMove(HumanInputEvent<?> arg)
{
if (false == this.shouldStartDrag())
{
return;
}
this._currentHandler = new SimpleEvent.Handler<HumanInputEvent<?>>() {
@Override public void onFire(HumanInputEvent<?> arg) {
onActualMouseMove(arg);
}};
this._dragStartedEvent.dispatch(arg);
}
private boolean shouldStartDrag()
{
if (0 >= this._dragStartSensitivity){
return true;
}
if (null == this._initialPosition)
{
return true;
}
Point2D currentPosition = EventUtils.getCurrentMousePos();
if (currentPosition.minus(this._initialPosition).getRadius() > this._dragStartSensitivity)
{
return true;
}
return false;
}
private void onActualMouseMove(HumanInputEvent<?> event)
{
this._dragEvent.dispatch(event);
}
@Override
public void onFire(HumanInputEvent<?> arg)
{
this._currentHandler.onFire(arg);
}
}