// License: GPL. For details, see Readme.txt file. package org.openstreetmap.gui.jmapviewer; import java.awt.AlphaComposite; import java.awt.BasicStroke; import java.awt.Color; import java.awt.Composite; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Point; import java.awt.Polygon; import java.awt.Rectangle; import java.awt.Stroke; import java.util.Arrays; import java.util.List; import org.openstreetmap.gui.jmapviewer.interfaces.ICoordinate; import org.openstreetmap.gui.jmapviewer.interfaces.MapPolygon; public class MapPolygonImpl extends MapObjectImpl implements MapPolygon { private List<? extends ICoordinate> points; public MapPolygonImpl(ICoordinate ... points) { this(null, null, points); } public MapPolygonImpl(List<? extends ICoordinate> points) { this(null, null, points); } public MapPolygonImpl(String name, List<? extends ICoordinate> points) { this(null, name, points); } public MapPolygonImpl(String name, ICoordinate ... points) { this(null, name, points); } public MapPolygonImpl(Layer layer, List<? extends ICoordinate> points) { this(layer, null, points); } public MapPolygonImpl(Layer layer, String name, List<? extends ICoordinate> points) { this(layer, name, points, getDefaultStyle()); } public MapPolygonImpl(Layer layer, String name, ICoordinate ... points) { this(layer, name, Arrays.asList(points), getDefaultStyle()); } public MapPolygonImpl(Layer layer, String name, List<? extends ICoordinate> points, Style style) { super(layer, name, style); this.points = points; } @Override public List<? extends ICoordinate> getPoints() { return this.points; } @Override public void paint(Graphics g, List<Point> points) { Polygon polygon = new Polygon(); for (Point p : points) { polygon.addPoint(p.x, p.y); } paint(g, polygon); } @Override public void paint(Graphics g, Polygon polygon) { // Prepare graphics Color oldColor = g.getColor(); g.setColor(getColor()); Stroke oldStroke = null; if (g instanceof Graphics2D) { Graphics2D g2 = (Graphics2D) g; oldStroke = g2.getStroke(); g2.setStroke(getStroke()); } // Draw g.drawPolygon(polygon); if (g instanceof Graphics2D && getBackColor() != null) { Graphics2D g2 = (Graphics2D) g; Composite oldComposite = g2.getComposite(); g2.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER)); g2.setPaint(getBackColor()); g2.fillPolygon(polygon); g2.setComposite(oldComposite); } // Restore graphics g.setColor(oldColor); if (g instanceof Graphics2D) { ((Graphics2D) g).setStroke(oldStroke); } Rectangle rec = polygon.getBounds(); Point corner = rec.getLocation(); Point p = new Point(corner.x+(rec.width/2), corner.y+(rec.height/2)); if (getLayer() == null || getLayer().isVisibleTexts()) paintText(g, p); } public static Style getDefaultStyle() { return new Style(Color.BLUE, new Color(100, 100, 100, 50), new BasicStroke(2), getDefaultFont()); } @Override public String toString() { return "MapPolygon [points=" + points + ']'; } }