/*
* This is part of Geomajas, a GIS framework, http://www.geomajas.org/.
*
* Copyright 2008-2015 Geosparc nv, http://www.geosparc.com/, Belgium.
*
* The program is available in open source according to the GNU Affero
* General Public License. All contributions in this program are covered
* by the Geomajas Contributors License Agreement. For full licensing
* details, see LICENSE.txt in the project root.
*/
package org.geomajas.plugin.editing.jsapi.client.handler;
import org.geomajas.annotation.Api;
import org.geomajas.gwt.client.handler.MapDownHandler;
import org.geomajas.gwt.client.handler.MapDragHandler;
import org.geomajas.gwt.client.handler.MapUpHandler;
import org.geomajas.plugin.editing.client.handler.AbstractGeometryIndexMapHandler;
import org.geomajas.plugin.editing.client.handler.GeometryIndexMapHandlerFactory;
import org.geomajas.plugin.editing.client.service.GeometryIndex;
import org.geomajas.plugin.jsapi.client.map.controller.DoubleClickHandler;
import org.geomajas.plugin.jsapi.client.map.controller.DownHandler;
import org.geomajas.plugin.jsapi.client.map.controller.DragHandler;
import org.geomajas.plugin.jsapi.client.map.controller.MouseMoveHandler;
import org.geomajas.plugin.jsapi.client.map.controller.MouseOutHandler;
import org.geomajas.plugin.jsapi.client.map.controller.MouseOverHandler;
import org.geomajas.plugin.jsapi.client.map.controller.UpHandler;
import org.timepedia.exporter.client.Export;
import org.timepedia.exporter.client.ExportPackage;
import org.timepedia.exporter.client.Exportable;
import org.timepedia.exporter.client.NoExport;
import com.google.gwt.event.dom.client.DoubleClickEvent;
import com.google.gwt.event.dom.client.HumanInputEvent;
import com.google.gwt.event.dom.client.MouseMoveEvent;
import com.google.gwt.event.dom.client.MouseOutEvent;
import com.google.gwt.event.dom.client.MouseOverEvent;
/**
* JavaScript wrapper of {@link GeometryHandlerFactory}. This factory creates a singleton object.
*
* @author Jan De Moerloose
* @since 1.0.0
*
*/
@Api
@Export("GeometryHandlerFactory")
@ExportPackage("org.geomajas.plugin.editing.handler")
public class JsGeometryIndexMapHandlerFactory implements GeometryIndexMapHandlerFactory, Exportable {
private MouseMoveHandler mouseMoveHandler = new MouseAdapter();
private MouseOutHandler mouseOutHandler = new MouseAdapter();
private MouseOverHandler mouseOverHandler = new MouseAdapter();
private DownHandler downHandler = new MouseAdapter();
private UpHandler upHandler = new MouseAdapter();
private DragHandler dragHandler = new MouseAdapter();
private DoubleClickHandler doubleClickHandler = new MouseAdapter();
private GeometryIndex currentIndex;
public JsGeometryIndexMapHandlerFactory() {
}
@NoExport
public AbstractGeometryIndexMapHandler create() {
return new GeometryIndexMapAdapter();
}
/**
* Set the closure that handles {@link MouseMoveEvent} events.
*
* @param mouseMoveHandler the closure
*/
@Api
public void setMouseMoveHandler(MouseMoveHandler mouseMoveHandler) {
this.mouseMoveHandler = mouseMoveHandler;
}
/**
* Set the closure that handles {@link MouseOutEvent} events.
*
* @param mouseOutHandler the closure
*/
@Api
public void setMouseOutHandler(MouseOutHandler mouseOutHandler) {
this.mouseOutHandler = mouseOutHandler;
}
/**
* Set the closure that handles {@link MouseOverEvent} events.
*
* @param mouseOverHandler the closure
*/
@Api
public void setMouseOverHandler(MouseOverHandler mouseOverHandler) {
this.mouseOverHandler = mouseOverHandler;
}
/**
* Set the closure that handles mouse down or touch start events.
*
* @param downHandler the closure
*/
@Api
public void setDownHandler(DownHandler downHandler) {
this.downHandler = downHandler;
}
/**
* Set the closure that handles mouse up or touch end events.
*
* @param upHandler the closure
*/
@Api
public void setUpHandler(UpHandler upHandler) {
this.upHandler = upHandler;
}
/**
* Set the closure that handles drag events.
*
* @param dragHandler the closure
*/
@Api
public void setDragHandler(DragHandler dragHandler) {
this.dragHandler = dragHandler;
}
/**
* Set the closure that handles {@link DoubleClickEvent} events.
*
* @param doubleClickHandler the closure
*/
@Api
public void setDoubleClickHandler(DoubleClickHandler doubleClickHandler) {
this.doubleClickHandler = doubleClickHandler;
}
/**
* Returns the index of the geometry part on which the event occurs.
*
* @return the index
*/
@Api
public GeometryIndex getIndex() {
return currentIndex;
}
/**
* Forwards events to the closure functions.
*
* @author Jan De Moerloose
*
*/
private class GeometryIndexMapAdapter extends AbstractGeometryIndexMapHandler implements
com.google.gwt.event.dom.client.MouseMoveHandler, com.google.gwt.event.dom.client.MouseOutHandler,
com.google.gwt.event.dom.client.MouseOverHandler, MapDownHandler, MapUpHandler, MapDragHandler,
com.google.gwt.event.dom.client.DoubleClickHandler {
@Override
public void onDoubleClick(DoubleClickEvent event) {
currentIndex = getIndex();
doubleClickHandler.onDoubleClick(event);
}
@Override
public void onDrag(HumanInputEvent<?> event) {
currentIndex = getIndex();
dragHandler.onDrag(event);
}
@Override
public void onUp(HumanInputEvent<?> event) {
currentIndex = getIndex();
upHandler.onUp(event);
}
@Override
public void onDown(HumanInputEvent<?> event) {
currentIndex = getIndex();
downHandler.onDown(event);
}
@Override
public void onMouseOver(MouseOverEvent event) {
currentIndex = getIndex();
mouseOverHandler.onMouseOver(event);
}
@Override
public void onMouseOut(MouseOutEvent event) {
currentIndex = getIndex();
mouseOutHandler.onMouseOut(event);
}
@Override
public void onMouseMove(MouseMoveEvent event) {
currentIndex = getIndex();
mouseMoveHandler.onMouseMove(event);
}
}
/**
* Noop implementation of all mouse events.
*
* @author Jan De Moerloose
*
*/
private class MouseAdapter implements MouseMoveHandler, MouseOutHandler, MouseOverHandler, DownHandler, UpHandler,
DragHandler, DoubleClickHandler {
@Override
public void onDoubleClick(DoubleClickEvent event) {
}
@Override
public void onDrag(HumanInputEvent<?> event) {
}
@Override
public void onUp(HumanInputEvent<?> event) {
}
@Override
public void onDown(HumanInputEvent<?> event) {
}
@Override
public void onMouseOver(MouseOverEvent event) {
}
@Override
public void onMouseOut(MouseOutEvent event) {
}
@Override
public void onMouseMove(MouseMoveEvent event) {
}
}
}