/* * 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.gwt.client.gfx; import org.geomajas.geometry.Coordinate; import org.geomajas.gwt.client.controller.MapEventParser; import org.geomajas.gwt.client.gfx.paintable.Composite; import org.geomajas.gwt.client.gfx.style.ShapeStyle; import org.geomajas.gwt.client.handler.MapDownHandler; import org.geomajas.gwt.client.map.RenderSpace; import org.geomajas.gwt.client.map.event.MapViewChangedEvent; import org.geomajas.gwt.client.map.event.MapViewChangedHandler; import org.geomajas.gwt.client.spatial.geometry.GeometryFactory; import org.geomajas.gwt.client.spatial.geometry.LineString; import org.geomajas.gwt.client.widget.MapWidget; import org.geomajas.gwt.client.widget.MapWidget.RenderGroup; import org.geomajas.plugin.editing.client.service.GeometryEditService; import org.geomajas.plugin.editing.client.service.GeometryEditState; import com.google.gwt.dom.client.Element; import com.google.gwt.event.dom.client.HumanInputEvent; import com.google.gwt.event.dom.client.MouseMoveEvent; import com.google.gwt.event.dom.client.MouseMoveHandler; import com.google.gwt.event.dom.client.MouseOutEvent; import com.google.gwt.event.dom.client.MouseOutHandler; import com.google.gwt.event.dom.client.MouseOverEvent; import com.google.gwt.event.dom.client.MouseOverHandler; /** * ... * * @author Pieter De Graef */ public class EdgeMarkerHandler implements MouseOutHandler, MouseOverHandler, MouseMoveHandler, MapDownHandler { private static final int MARKER_SIZE = 6; private Composite edgeMarkerGroup = new Composite("edge-marker"); private ShapeStyle style = new ShapeStyle("#444444", 0f, "#444444", 1f, 1); private MapWidget mapWidget; private GeometryEditService service; private MapEventParser eventParser; // ------------------------------------------------------------------------ // Constructors: // ------------------------------------------------------------------------ protected EdgeMarkerHandler(MapWidget mapWidget, GeometryEditService service, MapEventParser eventParser) { this.mapWidget = mapWidget; this.service = service; this.eventParser = eventParser; mapWidget.getMapModel().getMapView().addMapViewChangedHandler(new MapViewChangedHandler() { public void onMapViewChanged(MapViewChangedEvent event) { cleanup(); } }); } // ------------------------------------------------------------------------ // MapEventParser implementation: // ------------------------------------------------------------------------ public Coordinate getLocation(HumanInputEvent<?> event, RenderSpace renderSpace) { return eventParser.getLocation(event, renderSpace); } public Element getTarget(HumanInputEvent<?> event) { return eventParser.getTarget(event); } // ------------------------------------------------------------------------ // Handler implementations: // ------------------------------------------------------------------------ public void onDown(HumanInputEvent<?> event) { cleanup(); } public void onMouseOut(MouseOutEvent event) { cleanup(); } public void onMouseOver(MouseOverEvent event) { cleanup(); } public void onMouseMove(MouseMoveEvent event) { drawEdgeHighlightMarker(eventParser.getLocation(event, RenderSpace.SCREEN)); } // ------------------------------------------------------------------------ // Private methods: // ------------------------------------------------------------------------ private void cleanup() { mapWidget.getVectorContext().deleteGroup(edgeMarkerGroup); } private void drawEdgeHighlightMarker(Coordinate location) { if (service.getEditingState() == GeometryEditState.IDLE) { cleanup(); Coordinate tl = new Coordinate(location.getX() - MARKER_SIZE, location.getY() + MARKER_SIZE); Coordinate tr = new Coordinate(location.getX() + MARKER_SIZE, location.getY() + MARKER_SIZE); Coordinate bl = new Coordinate(location.getX() - MARKER_SIZE, location.getY() - MARKER_SIZE); Coordinate br = new Coordinate(location.getX() + MARKER_SIZE, location.getY() - MARKER_SIZE); GeometryFactory factory = mapWidget.getMapModel().getGeometryFactory(); LineString top = factory.createLineString(new Coordinate[] { tl, tr }); LineString right = factory.createLineString(new Coordinate[] { tr, br }); LineString bottom = factory.createLineString(new Coordinate[] { bl, br }); LineString left = factory.createLineString(new Coordinate[] { bl, tl }); mapWidget.getVectorContext().drawGroup(mapWidget.getGroup(RenderGroup.SCREEN), edgeMarkerGroup); mapWidget.getVectorContext().drawLine(edgeMarkerGroup, "top", top, style); mapWidget.getVectorContext().drawLine(edgeMarkerGroup, "right", right, style); mapWidget.getVectorContext().drawLine(edgeMarkerGroup, "bottom", bottom, style); mapWidget.getVectorContext().drawLine(edgeMarkerGroup, "left", left, style); } } }