/* * Copyright (c) 2010, 2011 Itiner.pl. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. Itiner designates this * particular file as subject to the "Classpath" exception as provided * by Itiner in the LICENSE.txt file that accompanied this code. * * This code is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * version 2 for more details (a copy is included in the LICENSE file that * accompanied this code). * * You should have received a copy of the GNU General Public License version * 2 along with this work; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ package com.codename1.maps.layers; import com.codename1.ui.Graphics; import java.util.Vector; import com.codename1.maps.BoundingBox; import com.codename1.maps.Coord; import com.codename1.maps.Mercator; import com.codename1.maps.Projection; import com.codename1.ui.geom.Point; import com.codename1.maps.providers.MapProvider; import com.codename1.maps.Tile; /** * This is a Lines Layer * * @author Roman Kamyk <roman.kamyk@itiner.pl> */ public class LinesLayer extends AbstractLayer { private Vector _lineSegments; protected int _lineColor; /** * Constructor with default projection Mercator. */ public LinesLayer() { this(new Mercator(), ""); } /** * Constructor with default projection Mercator. */ public LinesLayer(String name) { this(new Mercator(), name); } /** * {@inheritDoc} */ public LinesLayer(Projection p, String name) { super(p, name); _lineSegments = new Vector(); _lineColor = 0x000000; } /** * {@inheritDoc} */ public void paint(Graphics g, Tile screenTile) { g.setColor(_lineColor); g.setAntiAliased(true); int segmentsNo = _lineSegments.size(); for (int i = 0; i < segmentsNo; i++) { paintSegment(g, (Coord[]) _lineSegments.elementAt(i), screenTile); } } /** * Paint a segment. * * @param g a Graphics Object to paint on * @param segment array of Coord to draw a Line. * @param tile */ protected void paintSegment(Graphics g, Coord[] segment, Tile tile) { int pointsNo = segment.length; for (int i = 1; i < pointsNo; i++) { Coord start = (Coord) segment[i - 1]; Coord end = (Coord) segment[i]; Point s = tile.pointPosition(start); Point e = tile.pointPosition(end); g.drawLine(s.getX(), s.getY(), e.getX(), e.getY()); // lame & simple way to make line thicker g.drawLine(s.getX() - 1, s.getY(), e.getX() - 1, e.getY()); g.drawLine(s.getX() + 1, s.getY(), e.getX() + 1, e.getY()); g.drawLine(s.getX(), s.getY() - 1, e.getX(), e.getY() - 1); g.drawLine(s.getX(), s.getY() + 1, e.getX(), e.getY() + 1); } } /** * Adds a Line segment to the Layer * @param coords */ public void addLineSegment(Coord[] coords) { if (coords == null || coords.length <= 1) { return; } if (!coords[0].isProjected()) { coords = getProjection().fromWGS84(coords); } _lineSegments.addElement(coords); } /** * Sets the color of the Lines * @param rgb */ public void lineColor(int rgb) { _lineColor = rgb; } /** * {@inheritDoc} */ public BoundingBox boundingBox() { BoundingBox bbox = null; for (int i = 0; i < _lineSegments.size(); i++) { Coord[] coords = (Coord[]) _lineSegments.elementAt(i); BoundingBox cBbox = BoundingBox.create(coords); if (bbox == null) { bbox = cBbox; } else { bbox = bbox.extend(cBbox); } } return bbox; } }