/*
* Copyright 2013 Serdar.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package de.fub.mapviewer.ui;
import de.fub.mapviewer.shapes.WaypointMarker;
import de.fub.mapviewer.tilesources.OSMTileFactory;
import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.geom.Point2D;
import java.util.HashSet;
import java.util.Set;
import javax.swing.event.MouseInputListener;
import org.jdesktop.swingx.JXMapViewer;
import org.jdesktop.swingx.input.PanMouseInputListener;
import org.jdesktop.swingx.input.ZoomMouseWheelListenerCursor;
import org.jdesktop.swingx.mapviewer.GeoPosition;
import org.jdesktop.swingx.mapviewer.TileFactory;
import org.jdesktop.swingx.mapviewer.Waypoint;
import org.jdesktop.swingx.mapviewer.WaypointPainter;
import org.jdesktop.swingx.mapviewer.WaypointRenderer;
import org.jdesktop.swingx.painter.AbstractPainter;
import org.jdesktop.swingx.painter.CompoundPainter;
import org.jdesktop.swingx.painter.Painter;
/**
*
* @author Serdar
*/
public class MapViewer extends JXMapViewer {
private static final long serialVersionUID = 1L;
private final Set<WaypointMarker> waypoints = new HashSet<WaypointMarker>(200);
private final CompoundPainter<JXMapViewer> painters;
private WaypointPainter<WaypointMarker> waypointPainter;
public MapViewer() {
super();
this.painters = new CompoundPainter<JXMapViewer>();
init();
}
private void init() {
TileFactory defaultTileFactory = new OSMTileFactory();
setTileFactory(defaultTileFactory);
// Add interactions
MouseInputListener mia = new PanMouseInputListener(MapViewer.this);
addMouseListener(mia);
addMouseMotionListener(mia);
addMouseWheelListener(new ZoomMouseWheelListenerCursor(MapViewer.this));
waypointPainter = new WaypointPainter<WaypointMarker>();
waypointPainter.setRenderer(new CustomWaypointRenderer());
painters.addPainter(waypointPainter);
super.setOverlayPainter(painters);
}
public void setDisplayToFitMapMarkers() {
HashSet<GeoPosition> points = new HashSet<GeoPosition>();
for (Waypoint waypoint : waypoints) {
points.add(waypoint.getPosition());
}
calculateZoomFrom(points);
}
@Override
public void setOverlayPainter(Painter<? super JXMapViewer> overlay) {
}
public void addWaypoint(WaypointMarker waypoint) {
waypoints.add(waypoint);
waypointPainter.setWaypoints(waypoints);
repaint();
}
public void removeWaypoint(WaypointMarker waypoint) {
waypoints.remove(waypoint);
waypointPainter.setWaypoints(waypoints);
repaint();
}
public void clearWaypoints() {
waypoints.clear();
waypointPainter.setWaypoints(waypoints);
repaint();
}
public void addPainter(AbstractPainter<JXMapViewer> painter) {
assert painter != null;
painters.addPainter(painter);
repaint();
}
public void removePainter(AbstractPainter<JXMapViewer> painter) {
painters.removePainter(painter);
repaint();
}
private static class CustomWaypointRenderer implements WaypointRenderer<WaypointMarker> {
@Override
public void paintWaypoint(Graphics2D g, JXMapViewer map, WaypointMarker waypoint) {
Point2D point = map.getTileFactory().geoToPixel(waypoint.getPosition(), map.getZoom());
if (waypoint.isVisible()) {
int circleRadius = 5;
int circleDiameter = circleRadius * 2;
g.setColor(waypoint.isSelected() ? waypoint.getSelectedColor() : waypoint.getColor());
g.fillOval((int) point.getX() - circleDiameter, (int) point.getY() - circleDiameter, circleDiameter, circleDiameter);
g.setColor(Color.black);
g.drawOval((int) point.getX() - circleDiameter, (int) point.getY() - circleDiameter, circleDiameter, circleDiameter);
}
}
}
}