/*
* 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.jsapi.client.map.controller;
import org.geomajas.annotation.Api;
import org.geomajas.geometry.Coordinate;
import org.geomajas.gwt.client.controller.AbstractController;
import org.geomajas.gwt.client.controller.Controller;
import org.geomajas.plugin.jsapi.client.map.ExportableFunction;
import org.geomajas.plugin.jsapi.client.map.Map;
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.dom.client.Element;
import com.google.gwt.event.dom.client.DoubleClickEvent;
import com.google.gwt.event.dom.client.HumanInputEvent;
import com.google.gwt.event.dom.client.MouseDownEvent;
import com.google.gwt.event.dom.client.MouseEvent;
import com.google.gwt.event.dom.client.MouseMoveEvent;
import com.google.gwt.event.dom.client.MouseOutEvent;
import com.google.gwt.event.dom.client.MouseOverEvent;
import com.google.gwt.event.dom.client.MouseUpEvent;
import com.google.gwt.event.dom.client.TouchEndEvent;
import com.google.gwt.event.dom.client.TouchEvent;
import com.google.gwt.event.dom.client.TouchStartEvent;
import com.google.gwt.user.client.DOM;
/**
* General definition of a controller on the map. It defines a series of handlers to catch mouse/touch events, but also
* has 2 extra handlers executed on activation and deactivation of this controller on the map.
*
* @author Pieter De Graef
* @author Jan De Moerloose
* @since 1.0.0
*/
@Api
@Export
@ExportPackage("org.geomajas.jsapi.controller")
public class MapController implements Exportable {
private Map map;
private MouseMoveHandler mouseMoveHandler;
private MouseOutHandler mouseOutHandler;
private MouseOverHandler mouseOverHandler;
private DownHandler downHandler;
private UpHandler upHandler;
private DragHandler dragHandler;
private DoubleClickHandler doubleClickHandler;
private ExportableFunction activationHandler;
private ExportableFunction deactivationHandler;
// ------------------------------------------------------------------------
// Constructors:
// ------------------------------------------------------------------------
public MapController() {
}
public MapController(Map map, final Controller controller) {
this.map = map;
mouseMoveHandler = new MouseMoveHandler() {
public void onMouseMove(MouseMoveEvent event) {
controller.onMouseMove(event);
}
};
mouseOutHandler = new MouseOutHandler() {
public void onMouseOut(MouseOutEvent event) {
controller.onMouseOut(event);
}
};
mouseOverHandler = new MouseOverHandler() {
public void onMouseOver(MouseOverEvent event) {
controller.onMouseOver(event);
}
};
downHandler = new DownHandler() {
public void onDown(HumanInputEvent<?> event) {
if (event instanceof MouseDownEvent) {
controller.onMouseDown((MouseDownEvent) event);
} else if (event instanceof TouchStartEvent) {
controller.onTouchStart((TouchStartEvent) event);
}
}
};
upHandler = new UpHandler() {
public void onUp(HumanInputEvent<?> event) {
if (event instanceof MouseUpEvent) {
controller.onMouseUp((MouseUpEvent) event);
} else if (event instanceof TouchEndEvent) {
controller.onTouchEnd((TouchEndEvent) event);
}
}
};
dragHandler = new DragHandler() {
public void onDrag(HumanInputEvent<?> event) {
if (controller instanceof AbstractController) {
((AbstractController) controller).onDrag(event);
}
}
};
doubleClickHandler = new DoubleClickHandler() {
public void onDoubleClick(DoubleClickEvent event) {
controller.onDoubleClick(event);
}
};
}
// ------------------------------------------------------------------------
// Registering mouse event handlers:
// ------------------------------------------------------------------------
public void setMouseMoveHandler(MouseMoveHandler mouseMoveHandler) {
this.mouseMoveHandler = mouseMoveHandler;
}
public void setMouseOutHandler(MouseOutHandler mouseOutHandler) {
this.mouseOutHandler = mouseOutHandler;
}
public void setMouseOverHandler(MouseOverHandler mouseOverHandler) {
this.mouseOverHandler = mouseOverHandler;
}
public void setDownHandler(DownHandler downHandler) {
this.downHandler = downHandler;
}
public void setUpHandler(UpHandler upHandler) {
this.upHandler = upHandler;
}
public void setDragHandler(DragHandler dragHandler) {
this.dragHandler = dragHandler;
}
public void setDoubleClickHandler(DoubleClickHandler doubleClickHandler) {
this.doubleClickHandler = doubleClickHandler;
}
/**
* Set the info handler for this controller. Subclasses that support info should override this method.
*
* @param infoHandler the information handler
* @since 1.15.0
*/
public void setInfoHandler(InfoHandler infoHandler) {
// override for controllers that support info
}
public void setActivationHandler(ExportableFunction activationHandler) {
this.activationHandler = activationHandler;
}
public void setDeactivationHandler(ExportableFunction deactivationHandler) {
this.deactivationHandler = deactivationHandler;
}
public Coordinate getLocation(HumanInputEvent<?> event, String renderSpace) {
Element el = DOM.getElementById(map.getHtmlElementId()).getFirstChildElement();
Coordinate location = null;
if (event instanceof MouseEvent) {
MouseEvent<?> mEvent = (MouseEvent<?>) event;
event.setRelativeElement(el);
location = new Coordinate(mEvent.getX(), mEvent.getY());
} else if (event instanceof TouchEvent) {
TouchEvent<?> tEvent = (TouchEvent<?>) event;
if (tEvent.getTouches().length() > 0) {
location = new Coordinate(tEvent.getTouches().get(0).getRelativeX(el), tEvent.getTouches().get(0)
.getRelativeY(el));
}
}
if (location == null) {
location = new Coordinate(event.getNativeEvent().getClientX(), event.getNativeEvent().getClientY());
}
if ("world".equalsIgnoreCase(renderSpace)) {
return map.getViewPort().transform(location, "screen", renderSpace);
}
return location;
}
// ------------------------------------------------------------------------
// Extra public methods:
// ------------------------------------------------------------------------
public MouseMoveHandler getMouseMoveHandler() {
return mouseMoveHandler;
}
public MouseOutHandler getMouseOutHandler() {
return mouseOutHandler;
}
public MouseOverHandler getMouseOverHandler() {
return mouseOverHandler;
}
public DownHandler getDownHandler() {
return downHandler;
}
public UpHandler getUpHandler() {
return upHandler;
}
public DragHandler getDragHandler() {
return dragHandler;
}
public DoubleClickHandler getDoubleClickHandler() {
return doubleClickHandler;
}
public ExportableFunction getActivationHandler() {
return activationHandler;
}
public ExportableFunction getDeactivationHandler() {
return deactivationHandler;
}
@NoExport
public Map getMap() {
return map;
}
@NoExport
public void setMap(Map map) {
this.map = map;
}
}