public void onMouseUp(MouseUpEvent event) { if (event.getNativeButton() != NativeEvent.BUTTON_RIGHT && dragging) { dragging = false; if (screenBounds != null) { Bbox worldBounds = viewPort.transform(screenBounds, RenderSpace.SCREEN, RenderSpace.WORLD); viewPort.applyBounds(worldBounds); } } event.stopPropagation(); } });
/** * Transform a pixel-length into a real-life distance expressed in map CRS. This depends on the current map scale. * * @param pixels * The number of pixels to calculate the distance for. * @return The distance the given number of pixels entails. */ private double pixelsToUnits(int pixels) { Coordinate c1 = mapPresenter.getViewPort().transform(new Coordinate(0, 0), RenderSpace.SCREEN, RenderSpace.WORLD); Coordinate c2 = mapPresenter.getViewPort().transform(new Coordinate(pixels, 0), RenderSpace.SCREEN, RenderSpace.WORLD); return MathService.distance(c1, c2); }
@Override public Bbox transform(Bbox bounds, Space from, Space to) { return mapPresenter.getViewPort().transform(bounds, convert(from), convert(to)); }
@Override public Coordinate transform(Coordinate coordinate, Space from, Space to) { return mapPresenter.getViewPort().transform(coordinate, convert(from), convert(to)); }
@Override public void onTouchMove(TouchMoveEvent event) { event.preventDefault(); midPoint = mapPresenter.getViewPort().transform(getMidPoint(event), RenderSpace.SCREEN, RenderSpace.WORLD); updateView(event, true); // TODO second argument should be false but onTouchEnd is not fired }
private VectorObject createGeometry(GeometryEditService editService, GeometryIndex index) throws GeometryIndexNotFoundException { Geometry geometry = editService.getGeometry(); if (index != null) { geometry = editService.getIndexService().getGeometry(geometry, index); } Geometry g = geometry; if (!targetSpace.equals(RenderSpace.WORLD)) { g = mapPresenter.getViewPort().transform(g, RenderSpace.WORLD, targetSpace); } return gfxUtil.toShape(g); }
private Shape createEdge(GeometryEditService editService, GeometryIndex index) throws GeometryIndexNotFoundException { Geometry geometry = editService.getGeometry(); Coordinate[] e = editService.getIndexService().getEdge(geometry, index); if (!targetSpace.equals(RenderSpace.WORLD)) { e[0] = mapPresenter.getViewPort().transform(e[0], RenderSpace.WORLD, targetSpace); e[1] = mapPresenter.getViewPort().transform(e[1], RenderSpace.WORLD, targetSpace); } Path edge = new Path(e[0].getX(), e[0].getY()); edge.lineTo(e[1].getX(), e[1].getY()); return edge; }
private void updateEdge(Shape shape, GeometryEditService editService, GeometryIndex index) throws GeometryIndexNotFoundException { if (shape instanceof Path) { Path path = (Path) shape; Geometry geometry = editService.getGeometry(); Coordinate[] edge = editService.getIndexService().getEdge(geometry, index); if (!targetSpace.equals(RenderSpace.WORLD)) { edge[0] = mapPresenter.getViewPort().transform(edge[0], RenderSpace.WORLD, targetSpace); edge[1] = mapPresenter.getViewPort().transform(edge[1], RenderSpace.WORLD, targetSpace); } path.setStep(0, new MoveTo(false, edge[0].getX(), edge[0].getY())); path.setStep(1, new LineTo(false, edge[1].getX(), edge[1].getY())); } }
private Shape createVertex(GeometryEditService editService, GeometryIndex index) throws GeometryIndexNotFoundException { Geometry geometry = editService.getGeometry(); Coordinate v = editService.getIndexService().getVertex(geometry, index); if (!targetSpace.equals(RenderSpace.WORLD)) { v = mapPresenter.getViewPort().transform(v, RenderSpace.WORLD, targetSpace); } return new Rectangle(v.getX() - VERTEX_HALF_SIZE, v.getY() - VERTEX_HALF_SIZE, VERTEX_SIZE, VERTEX_SIZE); }
/** * Renders a line from the last inserted point to the current mouse position, indicating what the new situation * would look like if a vertex where to be inserted at the mouse location. */ public void onTentativeMove(GeometryEditTentativeMoveEvent event) { try { Coordinate[] vertices = editService.getIndexService().getSiblingVertices(editService.getGeometry(), editService.getInsertIndex()); String geometryType = editService.getIndexService().getGeometryType(editService.getGeometry(), editService.getInsertIndex()); if (vertices != null && (Geometry.LINE_STRING.equals(geometryType) || Geometry.LINEAR_RING.equals(geometryType))) { Coordinate temp1 = event.getOrigin(); Coordinate temp2 = event.getCurrentPosition(); Coordinate c1 = mapPresenter.getViewPort().transform(temp1, RenderSpace.WORLD, RenderSpace.SCREEN); Coordinate c2 = mapPresenter.getViewPort().transform(temp2, RenderSpace.WORLD, RenderSpace.SCREEN); tentativeMoveLine.setStep(0, new MoveTo(false, c1.getX(), c1.getY())); tentativeMoveLine.setStep(1, new LineTo(false, c2.getX(), c2.getY())); } else if (vertices != null && Geometry.LINEAR_RING.equals(geometryType)) { // Draw the second line (as an option...) } } catch (GeometryIndexNotFoundException e) { throw new IllegalStateException(e); } }
private void updateVertex(Shape shape, GeometryEditService editService, GeometryIndex index) throws GeometryIndexNotFoundException { if (shape instanceof Rectangle) { Rectangle rectangle = (Rectangle) shape; Geometry geometry = editService.getGeometry(); Coordinate v = editService.getIndexService().getVertex(geometry, index); if (!targetSpace.equals(RenderSpace.WORLD)) { v = mapPresenter.getViewPort().transform(v, RenderSpace.WORLD, targetSpace); } rectangle.setUserX(v.getX() - VERTEX_HALF_SIZE); rectangle.setUserY(v.getY() - VERTEX_HALF_SIZE); } }
protected void updateView(HumanInputEvent<?> event) { Coordinate end = getLocation(event, RenderSpace.SCREEN); Coordinate beginWorld = mapPresenter.getViewPort().transform(dragOrigin, RenderSpace.SCREEN, RenderSpace.WORLD); Coordinate endWorld = mapPresenter.getViewPort().transform(end, RenderSpace.SCREEN, RenderSpace.WORLD); double x = mapPresenter.getViewPort().getPosition().getX() + beginWorld.getX() - endWorld.getX(); double y = mapPresenter.getViewPort().getPosition().getY() + beginWorld.getY() - endWorld.getY(); if (dragging) { mapPresenter.getViewPort().dragToPosition(new Coordinate(x, y)); } else { mapPresenter.getViewPort().applyPosition(new Coordinate(x, y)); } dragOrigin = end; } }
@Override public void onUp(HumanInputEvent<?> event) { // Assure dragging or clicking started inside this widget if (dragging) { shift |= event.isShiftKeyDown(); // shift is used when depressed either at beginning or end updateRectangle(event); Bbox bounds = new Bbox(rectangle.getX(), rectangle.getY(), rectangle.getWidth(), rectangle.getHeight()); execute(mapPresenter.getViewPort().transform(bounds, RenderSpace.SCREEN, RenderSpace.WORLD)); stopDragging(); dragging = false; } }
/** * * Update the view of the map when touching and dragging. * * @param event */ protected void updateView(TouchEvent<?> event, boolean isTouchEnded) { Coordinate end = getMidPoint(event); Coordinate beginWorld = mapPresenter.getViewPort().transform(touchedOrigin, RenderSpace.SCREEN, RenderSpace.WORLD); Coordinate endWorld = mapPresenter.getViewPort().transform(end, RenderSpace.SCREEN, RenderSpace.WORLD); double x = mapPresenter.getViewPort().getPosition().getX() + beginWorld.getX() - endWorld.getX(); double y = mapPresenter.getViewPort().getPosition().getY() + beginWorld.getY() - endWorld.getY(); if (isTouchEnded) { mapPresenter.getViewPort().applyPosition(new Coordinate(x, y)); } else { mapPresenter.getViewPort().dragToPosition(new Coordinate(x, y)); } touchedOrigin = end; }
@Override public void onUp(HumanInputEvent<?> event) { // Assure dragging or clicking started inside this widget if (dragging) { shift |= event.isShiftKeyDown(); // shift is used when depressed either at beginning or end updateCircle(event); Geometry geometry = new Geometry(Geometry.POINT, 0, -1); Coordinate[] coordinates = new Coordinate[]{new Coordinate(circle.getUserX(), circle.getUserY())}; geometry.setCoordinates(coordinates); ViewPort viewPort = mapPresenter.getViewPort(); execute(viewPort.transform(geometry, RenderSpace.SCREEN, RenderSpace.WORLD), circle.getRadius() / viewPort.getScale()); stopDragging(); dragging = false; } }
@Override public Coordinate getLocation(HumanInputEvent<?> event, RenderSpace renderSpace) { switch (renderSpace) { case WORLD: Coordinate screen = getLocation(event, RenderSpace.SCREEN); return mapPresenter.getViewPort().transform(screen, RenderSpace.SCREEN, RenderSpace.WORLD); case SCREEN: default: if (event instanceof MouseEvent<?>) { Element element = mapPresenter.asWidget().getElement(); double offsetX = ((MouseEvent<?>) event).getRelativeX(element); double offsetY = ((MouseEvent<?>) event).getRelativeY(element); return new Coordinate(offsetX, offsetY); } else if (event instanceof TouchEvent<?>) { Touch touch = ((TouchEvent<?>) event).getTouches().get(0); return new Coordinate(touch.getClientX(), touch.getClientY()); } return new Coordinate(event.getNativeEvent().getClientX(), event.getNativeEvent().getClientY()); } }
g = mapPresenter.getViewPort().transform(g, RenderSpace.WORLD, targetSpace);