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}