From b77a39e01be8f4d1eba545fc293c9f108393a5d2 Mon Sep 17 00:00:00 2001 From: Mikael Capelle Date: Mon, 5 Mar 2018 18:35:01 +0100 Subject: [PATCH] Allow modification of color for overlays. --- .../drawing/components/BasicDrawing.java | 38 ++++++++----- .../drawing/components/MapViewDrawing.java | 55 ++++++++++++------- .../drawing/overlays/MarkerAutoScaling.java | 25 ++++++--- .../drawing/overlays/MarkerOverlay.java | 7 --- .../graphics/drawing/overlays/Overlay.java | 14 +++++ .../graphics/drawing/overlays/PaintUtils.java | 16 +++++- .../drawing/overlays/PointSetOverlay.java | 7 --- .../drawing/overlays/PolylineAutoScaling.java | 16 ++++++ 8 files changed, 124 insertions(+), 54 deletions(-) diff --git a/src/main/org/insa/graphics/drawing/components/BasicDrawing.java b/src/main/org/insa/graphics/drawing/components/BasicDrawing.java index 42a2796..3cbd885 100644 --- a/src/main/org/insa/graphics/drawing/components/BasicDrawing.java +++ b/src/main/org/insa/graphics/drawing/components/BasicDrawing.java @@ -21,8 +21,8 @@ import java.util.List; import javax.swing.JPanel; -import org.insa.graph.ArcForward; import org.insa.graph.Arc; +import org.insa.graph.ArcForward; import org.insa.graph.Graph; import org.insa.graph.Node; import org.insa.graph.Path; @@ -54,8 +54,22 @@ public class BasicDrawing extends JPanel implements Drawing { // Visible? protected boolean visible; - public BasicOverlay() { + // Color + protected Color color; + + public BasicOverlay(Color color) { this.visible = true; + this.color = color; + } + + @Override + public void setColor(Color color) { + this.color = color; + } + + @Override + public Color getColor() { + return this.color; } @Override @@ -98,14 +112,11 @@ public class BasicDrawing extends JPanel implements Drawing { // Point of the marker. private Point point; - // Color of the marker. - private final Color color; - // Image to draw - private final Image image; + private Image image; public BasicMarkerOverlay(Point point, Color color) { - super(); + super(color); this.point = point; this.color = color; this.image = MarkerUtils.getMarkerForColor(color); @@ -117,8 +128,9 @@ public class BasicDrawing extends JPanel implements Drawing { } @Override - public Color getColor() { - return color; + public void setColor(Color color) { + super.setColor(color); + this.image = MarkerUtils.getMarkerForColor(color); } @Override @@ -144,14 +156,12 @@ public class BasicDrawing extends JPanel implements Drawing { // List of points private final List points; - // Color for the path - private Color color; - // Origin / Destination markers. private BasicMarkerOverlay origin, destination; public BasicPathOverlay(List points, Color color, BasicMarkerOverlay origin, BasicMarkerOverlay destination) { + super(color); this.points = points; this.origin = origin; this.destination = destination; @@ -164,7 +174,7 @@ public class BasicDrawing extends JPanel implements Drawing { if (!points.isEmpty()) { graphics.setStroke(new BasicStroke(2)); - graphics.setColor(color); + graphics.setColor(getColor()); Iterator itPoint = points.iterator(); Point prev = itPoint.next(); @@ -206,6 +216,7 @@ public class BasicDrawing extends JPanel implements Drawing { private int width = DEFAULT_POINT_WIDTH; public BasicPointSetOverlay() { + super(Color.BLACK); this.image = new BufferedImage(BasicDrawing.this.width, BasicDrawing.this.height, BufferedImage.TYPE_4BYTE_ABGR); this.graphics = image.createGraphics(); @@ -214,6 +225,7 @@ public class BasicDrawing extends JPanel implements Drawing { @Override public void setColor(Color color) { + super.setColor(color); this.graphics.setColor(color); } diff --git a/src/main/org/insa/graphics/drawing/components/MapViewDrawing.java b/src/main/org/insa/graphics/drawing/components/MapViewDrawing.java index 0b59873..4eb76af 100644 --- a/src/main/org/insa/graphics/drawing/components/MapViewDrawing.java +++ b/src/main/org/insa/graphics/drawing/components/MapViewDrawing.java @@ -63,11 +63,25 @@ public class MapViewDrawing extends MapView implements Drawing { // Marker associated. protected Layer[] layers; - public MapViewOverlay(Layer[] layers) { + // Current color + protected Color color; + + public MapViewOverlay(Layer[] layers, Color color) { this.layers = layers; for (Layer layer: this.layers) { MapViewDrawing.this.getLayerManager().getLayers().add(layer); } + this.color = color; + } + + @Override + public void setColor(Color color) { + this.color = color; + } + + @Override + public Color getColor() { + return this.color; } @Override @@ -101,12 +115,8 @@ public class MapViewDrawing extends MapView implements Drawing { */ private class MapViewMarkerOverlay extends MapViewOverlay implements MarkerOverlay { - // Color of this marker - Color color; - public MapViewMarkerOverlay(Marker marker, Color color) { - super(new Layer[]{ marker }); - this.color = color; + super(new Layer[]{ marker }, color); } @Override @@ -117,8 +127,10 @@ public class MapViewDrawing extends MapView implements Drawing { } @Override - public Color getColor() { - return color; + public void setColor(Color color) { + super.setColor(color); + MarkerAutoScaling marker = (MarkerAutoScaling) super.layers[0]; + marker.setImage(MarkerUtils.getMarkerForColor(color)); } @Override @@ -138,12 +150,21 @@ public class MapViewDrawing extends MapView implements Drawing { */ private class MapViewPathOverlay extends MapViewOverlay implements PathOverlay { - public MapViewPathOverlay(PolylineAutoScaling path, Marker origin, Marker destination) { - super(new Layer[]{ path, origin, destination }); + public MapViewPathOverlay(PolylineAutoScaling path, MarkerAutoScaling origin, + MarkerAutoScaling destination) { + super(new Layer[]{ path, origin, destination }, path.getColor()); } public MapViewPathOverlay(PolylineAutoScaling path) { - super(new Layer[]{ path }); + super(new Layer[]{ path }, path.getColor()); + } + + @Override + public void setColor(Color color) { + super.setColor(color); + ((PolylineAutoScaling) this.layers[0]).setColor(color); + ((MarkerAutoScaling) this.layers[1]).setImage(MarkerUtils.getMarkerForColor(color)); + ((MarkerAutoScaling) this.layers[2]).setImage(MarkerUtils.getMarkerForColor(color)); } } @@ -155,11 +176,7 @@ public class MapViewDrawing extends MapView implements Drawing { private class MapViewPointSetOverlay extends MapViewOverlay implements PointSetOverlay { public MapViewPointSetOverlay() { - super(new Layer[0]); - } - - @Override - public void setColor(Color color) { + super(new Layer[0], Color.BLACK); } @Override @@ -304,9 +321,8 @@ public class MapViewDrawing extends MapView implements Drawing { repaint(); } - protected Marker createMarker(Point point, Color color) { + protected MarkerAutoScaling createMarker(Point point, Color color) { Image image = MarkerUtils.getMarkerForColor(color); - // Bitmap bitmap = new AwtBitmap(MarkerUtils.getMarkerForColor(color)); return new MarkerAutoScaling(convertPoint(point), image); } @@ -373,7 +389,8 @@ public class MapViewDrawing extends MapView implements Drawing { } PathOverlay overlay = null; if (markers) { - Marker origin = createMarker(path.getOrigin().getPoint(), DEFAULT_PATH_COLOR), + MarkerAutoScaling origin = createMarker(path.getOrigin().getPoint(), + DEFAULT_PATH_COLOR), destination = createMarker(path.getDestination().getPoint(), DEFAULT_PATH_COLOR); overlay = new MapViewPathOverlay(line, origin, destination); diff --git a/src/main/org/insa/graphics/drawing/overlays/MarkerAutoScaling.java b/src/main/org/insa/graphics/drawing/overlays/MarkerAutoScaling.java index a250662..70e1435 100644 --- a/src/main/org/insa/graphics/drawing/overlays/MarkerAutoScaling.java +++ b/src/main/org/insa/graphics/drawing/overlays/MarkerAutoScaling.java @@ -14,28 +14,39 @@ import org.mapsforge.map.layer.overlay.Marker; public class MarkerAutoScaling extends Marker { // Original image. - private final Image originalImage; + private Image image; public MarkerAutoScaling(LatLong latLong, Image image) { super(latLong, null, 0, 0); - this.originalImage = image; + this.image = image; } /** - * @return + * Set a new image for this marker overlay + * + * @param image New image to set. + */ + public void setImage(Image image) { + this.image = image; + } + + /** + * @return Current image (marker) of this overlay. */ public Image getImage() { - return originalImage; + return image; } @Override - public synchronized void draw(BoundingBox boundingBox, byte zoomLevel, Canvas canvas, Point topLeftPoint) { + public synchronized void draw(BoundingBox boundingBox, byte zoomLevel, Canvas canvas, + Point topLeftPoint) { int width = (int) PaintUtils.getStrokeWidth(8, zoomLevel), height = (int) PaintUtils.getStrokeWidth(16, zoomLevel); BufferedImage bfd = new BufferedImage(width, height, BufferedImage.TYPE_4BYTE_ABGR); Graphics2D g = bfd.createGraphics(); - g.drawImage(this.originalImage.getScaledInstance(bfd.getWidth(), bfd.getHeight(), Image.SCALE_SMOOTH), 0, 0, - null); + g.drawImage( + this.image.getScaledInstance(bfd.getWidth(), bfd.getHeight(), Image.SCALE_SMOOTH), + 0, 0, null); setBitmap(new AwtBitmap(bfd)); setVerticalOffset(-height / 2); diff --git a/src/main/org/insa/graphics/drawing/overlays/MarkerOverlay.java b/src/main/org/insa/graphics/drawing/overlays/MarkerOverlay.java index 6d1f1ee..a761af9 100644 --- a/src/main/org/insa/graphics/drawing/overlays/MarkerOverlay.java +++ b/src/main/org/insa/graphics/drawing/overlays/MarkerOverlay.java @@ -1,16 +1,9 @@ package org.insa.graphics.drawing.overlays; -import java.awt.Color; - import org.insa.graph.Point; public interface MarkerOverlay extends Overlay { - /** - * @return Color associated with this marker. - */ - public Color getColor(); - /** * @return The point associated with this marker. */ diff --git a/src/main/org/insa/graphics/drawing/overlays/Overlay.java b/src/main/org/insa/graphics/drawing/overlays/Overlay.java index 4c3bdce..b95645f 100644 --- a/src/main/org/insa/graphics/drawing/overlays/Overlay.java +++ b/src/main/org/insa/graphics/drawing/overlays/Overlay.java @@ -1,7 +1,21 @@ package org.insa.graphics.drawing.overlays; +import java.awt.Color; + public interface Overlay { + /** + * Set the color of this overlay. + * + * @param color New color for the overlay. + */ + public void setColor(Color color); + + /** + * @return The current color of this overlay. + */ + public Color getColor(); + /** * Show or hide this marker - A marker should be visible when created. * diff --git a/src/main/org/insa/graphics/drawing/overlays/PaintUtils.java b/src/main/org/insa/graphics/drawing/overlays/PaintUtils.java index 427f004..a4eae00 100644 --- a/src/main/org/insa/graphics/drawing/overlays/PaintUtils.java +++ b/src/main/org/insa/graphics/drawing/overlays/PaintUtils.java @@ -11,11 +11,24 @@ public class PaintUtils { private static final GraphicFactory GRAPHIC_FACTORY = AwtGraphicFactory.INSTANCE; /** + * Convert the given AWT color to a mapsforge compatible color. + * * @param color * @return */ public static int convertColor(Color color) { - return GRAPHIC_FACTORY.createColor(color.getAlpha(), color.getRed(), color.getGreen(), color.getBlue()); + return GRAPHIC_FACTORY.createColor(color.getAlpha(), color.getRed(), color.getGreen(), + color.getBlue()); + } + + /** + * Convert the given mapsforge color to an AWT Color. + * + * @param color + * @return + */ + public static Color convertColor(int color) { + return new Color(color, true); } /** @@ -38,4 +51,5 @@ public class PaintUtils { } return width * mul; } + } diff --git a/src/main/org/insa/graphics/drawing/overlays/PointSetOverlay.java b/src/main/org/insa/graphics/drawing/overlays/PointSetOverlay.java index d34c71c..c294972 100644 --- a/src/main/org/insa/graphics/drawing/overlays/PointSetOverlay.java +++ b/src/main/org/insa/graphics/drawing/overlays/PointSetOverlay.java @@ -6,13 +6,6 @@ import org.insa.graph.Point; public interface PointSetOverlay extends Overlay { - /** - * Set the color of this overlay for future addPoint(). - * - * @param color - */ - public void setColor(Color color); - /** * Set the width of this overlay for future addPoint(). * diff --git a/src/main/org/insa/graphics/drawing/overlays/PolylineAutoScaling.java b/src/main/org/insa/graphics/drawing/overlays/PolylineAutoScaling.java index 15d2427..e0b2f24 100644 --- a/src/main/org/insa/graphics/drawing/overlays/PolylineAutoScaling.java +++ b/src/main/org/insa/graphics/drawing/overlays/PolylineAutoScaling.java @@ -31,6 +31,22 @@ public class PolylineAutoScaling extends Polyline { this.width = width; } + /** + * Set the color for this polyline. + * + * @param color New color for this polyline. + */ + public void setColor(Color color) { + getPaintStroke().setColor(PaintUtils.convertColor(color)); + } + + /** + * @return Color of this polyline. + */ + public Color getColor() { + return PaintUtils.convertColor(getPaintStroke().getColor()); + } + /** * @param point */