/* * 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.gwt2.plugin.editing.client.controller; import org.geomajas.gwt2.client.controller.AbstractMapController; import org.geomajas.gwt2.client.controller.NavigationController; import org.geomajas.gwt2.client.map.MapPresenter; import org.geomajas.plugin.editing.client.controller.AbstractGeometryIndexController; import org.geomajas.plugin.editing.client.controller.GeometryIndexDragController; import org.geomajas.plugin.editing.client.controller.GeometryIndexInsertController; import org.geomajas.plugin.editing.client.service.GeometryEditService; import org.geomajas.plugin.editing.client.service.GeometryEditState; import org.geomajas.plugin.editing.client.snap.SnapService; 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; import com.google.gwt.event.dom.client.MouseWheelEvent; /** * Basic map controller used when editing geometries. * * @author Pieter De Graef */ public class EditGeometryBaseController extends AbstractMapController { private AbstractMapController idleController; private AbstractGeometryIndexController dragController; private AbstractGeometryIndexController insertController; private GeometryEditService service; private boolean isClickToStop; // ------------------------------------------------------------------------ // Constructors: // ------------------------------------------------------------------------ public EditGeometryBaseController(GeometryEditService service, SnapService snappingService) { super(false); this.service = service; idleController = new NavigationController(); dragController = new GeometryIndexDragController(service, snappingService, this); insertController = new GeometryIndexInsertController(service, snappingService, this); } // ------------------------------------------------------------------------ // GraphicsController implementation: // ------------------------------------------------------------------------ public void onActivate(MapPresenter mapPresenter) { super.onActivate(mapPresenter); idleController.onActivate(mapPresenter); insertController.setMaxBounds(mapPresenter.getConfiguration().getMaxBounds()); dragController.setMaxBounds(mapPresenter.getConfiguration().getMaxBounds()); } public void onDown(HumanInputEvent<?> event) { if (service.getEditingState() == GeometryEditState.IDLE) { // No shift key down, because we don't want to pan when deselecting vertices. // TODO remove the shift check somehow... (now replaced with a event.stopPropagation in selection handler) idleController.onDown(event); } else if (service.getEditingState() == GeometryEditState.DRAGGING) { dragController.onDown(event); } else if (service.getEditingState() == GeometryEditState.INSERTING) { insertController.onDown(event); } } public void onDrag(HumanInputEvent<?> event) { if (service.getEditingState() == GeometryEditState.IDLE) { idleController.onDrag(event); } else if (service.getEditingState() == GeometryEditState.DRAGGING) { dragController.onDrag(event); } else if (service.getEditingState() == GeometryEditState.INSERTING) { insertController.onDrag(event); } } public void onMouseMove(MouseMoveEvent event) { super.onMouseMove(event); if (service.getEditingState() == GeometryEditState.IDLE) { idleController.onMouseMove(event); } else if (service.getEditingState() == GeometryEditState.DRAGGING) { dragController.onMouseMove(event); } else if (service.getEditingState() == GeometryEditState.INSERTING) { insertController.onMouseMove(event); } } public void onMouseOut(MouseOutEvent event) { if (service.getEditingState() == GeometryEditState.IDLE) { idleController.onMouseOut(event); } else if (service.getEditingState() == GeometryEditState.DRAGGING) { dragController.onMouseOut(event); } else if (service.getEditingState() == GeometryEditState.INSERTING) { insertController.onMouseOut(event); } } public void onMouseOver(MouseOverEvent event) { if (service.getEditingState() == GeometryEditState.IDLE) { idleController.onMouseOver(event); } else if (service.getEditingState() == GeometryEditState.DRAGGING) { dragController.onMouseOver(event); } else if (service.getEditingState() == GeometryEditState.INSERTING) { insertController.onMouseOver(event); } } public void onUp(HumanInputEvent<?> event) { if (service.getEditingState() == GeometryEditState.IDLE) { if (isClickToStop() && service.isStarted()) { service.stop(); } idleController.onUp(event); } else if (service.getEditingState() == GeometryEditState.DRAGGING) { dragController.onUp(event); } else if (service.getEditingState() == GeometryEditState.INSERTING) { insertController.onUp(event); } } public void onDoubleClick(DoubleClickEvent event) { if (service.getEditingState() == GeometryEditState.IDLE) { idleController.onDoubleClick(event); } else if (service.getEditingState() == GeometryEditState.DRAGGING) { dragController.onDoubleClick(event); } else if (service.getEditingState() == GeometryEditState.INSERTING) { insertController.onDoubleClick(event); } } public void onMouseWheel(MouseWheelEvent event) { idleController.onMouseWheel(event); } // ------------------------------------------------------------------------ // Getters and setters: // ------------------------------------------------------------------------ public GeometryEditService getEditService() { return service; } public AbstractMapController getIdleController() { return idleController; } public AbstractGeometryIndexController getDragController() { return dragController; } public AbstractGeometryIndexController getInsertController() { return insertController; } public void setIdleController(AbstractMapController idleController) { this.idleController = idleController; } public void setDragController(AbstractGeometryIndexController dragController) { this.dragController = dragController; } public void setInsertController(AbstractGeometryIndexController insertController) { this.insertController = insertController; } /** * Set boolean that determines if a user can stop editing by clicking outside the geometry that is being edited. * * @param isClickToStop * true to stop, false otherwise. */ public void setClickToStop(boolean isClickToStop) { this.isClickToStop = isClickToStop; } /** * Get boolean that determines if a user can stop editing by clicking outside the geometry that is being edited. * * @return isClickToStop true to stop, false otherwise. */ public boolean isClickToStop() { return isClickToStop; } }