/*
* 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.client.handler;
import java.util.Collections;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.geomajas.geometry.Coordinate;
import org.geomajas.gwt.client.controller.MapEventParser;
import org.geomajas.gwt.client.handler.MapDownHandler;
import org.geomajas.gwt.client.map.RenderSpace;
import org.geomajas.plugin.editing.client.operation.GeometryOperationFailedException;
import org.geomajas.plugin.editing.client.service.GeometryEditService;
import org.geomajas.plugin.editing.client.service.GeometryEditState;
import org.geomajas.plugin.editing.client.service.GeometryIndex;
import org.geomajas.plugin.editing.client.service.GeometryIndexType;
import com.google.gwt.event.dom.client.HumanInputEvent;
/**
* ...
*
* @author Pieter De Graef
*/
public class GeometryIndexInsertHandler extends AbstractGeometryIndexMapHandler implements MapDownHandler {
private static Logger logger = Logger.getLogger(GeometryIndexInsertHandler.class.getName());
private final GeometryIndexDragSelectionHandler dragHandler = new GeometryIndexDragSelectionHandler();
@Override
public void setService(GeometryEditService service) {
super.setService(service);
dragHandler.setService(service);
}
@Override
public void setEventParser(MapEventParser eventParser) {
super.setEventParser(eventParser);
dragHandler.setEventParser(eventParser);
}
public void onDown(HumanInputEvent<?> event) {
// This handler should only have been applied onto edges. Can't hurt to check again:
if (service.getEditingState() == GeometryEditState.IDLE
&& service.getIndexService().getType(index) == GeometryIndexType.TYPE_EDGE) {
List<GeometryIndex> indices = Collections.singletonList(index);
try {
// If this edge is highlighted, end it:
if (service.getIndexStateService().isHightlighted(index)) {
service.getIndexStateService().highlightEnd(indices);
}
// First insert the point into the geometry:
Coordinate location = getLocation(event, RenderSpace.WORLD);
service.insert(indices, Collections.singletonList(Collections.singletonList(location)));
// Then change the selection to the newly inserted point:
service.getIndexStateService().deselectAll();
GeometryIndex insertedIndex = service.getIndexService().getNextVertex(index);
service.getIndexStateService().select(Collections.singletonList(insertedIndex));
// Set status to dragging:
dragHandler.setIndex(insertedIndex);
dragHandler.onDown(event);
} catch (GeometryOperationFailedException e) {
logger.log(Level.WARNING, "Operation failed", e);
}
}
}
}