001// License: GPL. For details, see LICENSE file. 002package org.openstreetmap.gui.jmapviewer; 003 004import java.awt.AlphaComposite; 005import java.awt.BasicStroke; 006import java.awt.Color; 007import java.awt.Composite; 008import java.awt.Graphics; 009import java.awt.Graphics2D; 010import java.awt.Point; 011import java.awt.Polygon; 012import java.awt.Rectangle; 013import java.awt.Stroke; 014import java.util.Arrays; 015import java.util.List; 016 017import org.openstreetmap.gui.jmapviewer.interfaces.ICoordinate; 018import org.openstreetmap.gui.jmapviewer.interfaces.MapPolygon; 019 020/** 021 * @author Vincent 022 * 023 */ 024public class MapPolygonImpl extends MapObjectImpl implements MapPolygon { 025 026 private List<? extends ICoordinate> points; 027 028 public MapPolygonImpl(ICoordinate ... points) { 029 this(null, null, points); 030 } 031 public MapPolygonImpl(List<? extends ICoordinate> points) { 032 this(null, null, points); 033 } 034 public MapPolygonImpl(String name, List<? extends ICoordinate> points) { 035 this(null, name, points); 036 } 037 public MapPolygonImpl(String name, ICoordinate ... points) { 038 this(null, name, points); 039 } 040 public MapPolygonImpl(Layer layer, List<? extends ICoordinate> points) { 041 this(layer, null, points); 042 } 043 public MapPolygonImpl(Layer layer, String name, List<? extends ICoordinate> points) { 044 this(layer, name, points, getDefaultStyle()); 045 } 046 public MapPolygonImpl(Layer layer, String name, ICoordinate ... points) { 047 this(layer, name, Arrays.asList(points), getDefaultStyle()); 048 } 049 public MapPolygonImpl(Layer layer, String name, List<? extends ICoordinate> points, Style style) { 050 super(layer, name, style); 051 this.points = points; 052 } 053 054 /* (non-Javadoc) 055 * @see org.openstreetmap.gui.jmapviewer.interfaces.MapPolygon#getPoints() 056 */ 057 @Override 058 public List<? extends ICoordinate> getPoints() { 059 return this.points; 060 } 061 062 /* (non-Javadoc) 063 * @see org.openstreetmap.gui.jmapviewer.interfaces.MapPolygon#paint(java.awt.Graphics, java.util.List) 064 */ 065 @Override 066 public void paint(Graphics g, List<Point> points) { 067 Polygon polygon = new Polygon(); 068 for (Point p : points) { 069 polygon.addPoint(p.x, p.y); 070 } 071 paint(g, polygon); 072 } 073 074 /* (non-Javadoc) 075 * @see org.openstreetmap.gui.jmapviewer.interfaces.MapPolygon#paint(java.awt.Graphics, java.awt.Polygon) 076 */ 077 @Override 078 public void paint(Graphics g, Polygon polygon) { 079 // Prepare graphics 080 Color oldColor = g.getColor(); 081 g.setColor(getColor()); 082 083 Stroke oldStroke = null; 084 if (g instanceof Graphics2D) { 085 Graphics2D g2 = (Graphics2D) g; 086 oldStroke = g2.getStroke(); 087 g2.setStroke(getStroke()); 088 } 089 // Draw 090 g.drawPolygon(polygon); 091 if (g instanceof Graphics2D && getBackColor()!=null) { 092 Graphics2D g2 = (Graphics2D) g; 093 Composite oldComposite = g2.getComposite(); 094 g2.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER)); 095 g2.setPaint(getBackColor()); 096 g2.fillPolygon(polygon); 097 g2.setComposite(oldComposite); 098 } 099 // Restore graphics 100 g.setColor(oldColor); 101 if (g instanceof Graphics2D) { 102 ((Graphics2D) g).setStroke(oldStroke); 103 } 104 Rectangle rec = polygon.getBounds(); 105 Point corner = rec.getLocation(); 106 Point p= new Point(corner.x+(rec.width/2), corner.y+(rec.height/2)); 107 if(getLayer()==null||getLayer().isVisibleTexts()) paintText(g, p); 108 } 109 110 public static Style getDefaultStyle(){ 111 return new Style(Color.BLUE, new Color(100,100,100,50), new BasicStroke(2), getDefaultFont()); 112 } 113 /* (non-Javadoc) 114 * @see java.lang.Object#toString() 115 */ 116 @Override 117 public String toString() { 118 return "MapPolygon [points=" + points + "]"; 119 } 120}