// License: GPL. For details, see Readme.txt file.
package org.openstreetmap.gui.jmapviewer;
import java.awt.BorderLayout;
import java.awt.Cursor;
import java.awt.Point;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import org.openstreetmap.gui.jmapviewer.events.JMVCommandEvent;
import org.openstreetmap.gui.jmapviewer.interfaces.JMapViewerEventListener;
import org.openstreetmap.gui.jmapviewer.interfaces.MapPolygon;
import org.openstreetmap.gui.jmapviewer.interfaces.TileLoader;
import org.openstreetmap.gui.jmapviewer.interfaces.TileSource;
import org.openstreetmap.gui.jmapviewer.tilesources.BingAerialTileSource;
import org.openstreetmap.gui.jmapviewer.tilesources.OsmTileSource;
/**
* Demonstrates the usage of {@link JMapViewer}
*
* @author Jan Peter Stotz
*
*/
public class Demo extends JFrame implements JMapViewerEventListener {
private static final long serialVersionUID = 1L;
private final JMapViewerTree treeMap;
private final JLabel zoomLabel;
private final JLabel zoomValue;
private final JLabel mperpLabelName;
private final JLabel mperpLabelValue;
/**
* Constructs the {@code Demo}.
*/
public Demo() {
super("JMapViewer Demo");
setSize(400, 400);
treeMap = new JMapViewerTree("Zones");
// Listen to the map viewer for user operations so components will
// receive events and update
map().addJMVListener(this);
setLayout(new BorderLayout());
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setExtendedState(JFrame.MAXIMIZED_BOTH);
JPanel panel = new JPanel(new BorderLayout());
JPanel panelTop = new JPanel();
JPanel panelBottom = new JPanel();
JPanel helpPanel = new JPanel();
mperpLabelName = new JLabel("Meters/Pixels: ");
mperpLabelValue = new JLabel(String.format("%s", map().getMeterPerPixel()));
zoomLabel = new JLabel("Zoom: ");
zoomValue = new JLabel(String.format("%s", map().getZoom()));
add(panel, BorderLayout.NORTH);
add(helpPanel, BorderLayout.SOUTH);
panel.add(panelTop, BorderLayout.NORTH);
panel.add(panelBottom, BorderLayout.SOUTH);
JLabel helpLabel = new JLabel("Use right mouse button to move,\n "
+ "left double click or mouse wheel to zoom.");
helpPanel.add(helpLabel);
JButton button = new JButton("setDisplayToFitMapMarkers");
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
map().setDisplayToFitMapMarkers();
}
});
JComboBox<TileSource> tileSourceSelector = new JComboBox<>(new TileSource[] {
new OsmTileSource.Mapnik(),
new OsmTileSource.CycleMap(),
new BingAerialTileSource(),
});
tileSourceSelector.addItemListener(new ItemListener() {
@Override
public void itemStateChanged(ItemEvent e) {
map().setTileSource((TileSource) e.getItem());
}
});
JComboBox<TileLoader> tileLoaderSelector;
tileLoaderSelector = new JComboBox<>(new TileLoader[] {new OsmTileLoader(map())});
tileLoaderSelector.addItemListener(new ItemListener() {
@Override
public void itemStateChanged(ItemEvent e) {
map().setTileLoader((TileLoader) e.getItem());
}
});
map().setTileLoader((TileLoader) tileLoaderSelector.getSelectedItem());
panelTop.add(tileSourceSelector);
panelTop.add(tileLoaderSelector);
final JCheckBox showMapMarker = new JCheckBox("Map markers visible");
showMapMarker.setSelected(map().getMapMarkersVisible());
showMapMarker.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
map().setMapMarkerVisible(showMapMarker.isSelected());
}
});
panelBottom.add(showMapMarker);
///
final JCheckBox showTreeLayers = new JCheckBox("Tree Layers visible");
showTreeLayers.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
treeMap.setTreeVisible(showTreeLayers.isSelected());
}
});
panelBottom.add(showTreeLayers);
///
final JCheckBox showToolTip = new JCheckBox("ToolTip visible");
showToolTip.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
map().setToolTipText(null);
}
});
panelBottom.add(showToolTip);
///
final JCheckBox showTileGrid = new JCheckBox("Tile grid visible");
showTileGrid.setSelected(map().isTileGridVisible());
showTileGrid.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
map().setTileGridVisible(showTileGrid.isSelected());
}
});
panelBottom.add(showTileGrid);
final JCheckBox showZoomControls = new JCheckBox("Show zoom controls");
showZoomControls.setSelected(map().getZoomControlsVisible());
showZoomControls.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
map().setZoomContolsVisible(showZoomControls.isSelected());
}
});
panelBottom.add(showZoomControls);
final JCheckBox scrollWrapEnabled = new JCheckBox("Scrollwrap enabled");
scrollWrapEnabled.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
map().setScrollWrapEnabled(scrollWrapEnabled.isSelected());
}
});
panelBottom.add(scrollWrapEnabled);
panelBottom.add(button);
panelTop.add(zoomLabel);
panelTop.add(zoomValue);
panelTop.add(mperpLabelName);
panelTop.add(mperpLabelValue);
add(treeMap, BorderLayout.CENTER);
//
LayerGroup germanyGroup = new LayerGroup("Germany");
Layer germanyWestLayer = germanyGroup.addLayer("Germany West");
Layer germanyEastLayer = germanyGroup.addLayer("Germany East");
MapMarkerDot eberstadt = new MapMarkerDot(germanyEastLayer, "Eberstadt", 49.814284999, 8.642065999);
MapMarkerDot ebersheim = new MapMarkerDot(germanyWestLayer, "Ebersheim", 49.91, 8.24);
MapMarkerDot empty = new MapMarkerDot(germanyEastLayer, 49.71, 8.64);
MapMarkerDot darmstadt = new MapMarkerDot(germanyEastLayer, "Darmstadt", 49.8588, 8.643);
map().addMapMarker(eberstadt);
map().addMapMarker(ebersheim);
map().addMapMarker(empty);
Layer franceLayer = treeMap.addLayer("France");
map().addMapMarker(new MapMarkerDot(franceLayer, "La Gallerie", 48.71, -1));
map().addMapMarker(new MapMarkerDot(43.604, 1.444));
map().addMapMarker(new MapMarkerCircle(53.343, -6.267, 0.666));
map().addMapRectangle(new MapRectangleImpl(new Coordinate(53.343, -6.267), new Coordinate(43.604, 1.444)));
map().addMapMarker(darmstadt);
treeMap.addLayer(germanyWestLayer);
treeMap.addLayer(germanyEastLayer);
MapPolygon bermudas = new MapPolygonImpl(c(49, 1), c(45, 10), c(40, 5));
map().addMapPolygon(bermudas);
map().addMapPolygon(new MapPolygonImpl(germanyEastLayer, "Riedstadt", ebersheim, darmstadt, eberstadt, empty));
map().addMapMarker(new MapMarkerCircle(germanyWestLayer, "North of Suisse", new Coordinate(48, 7), .5));
Layer spain = treeMap.addLayer("Spain");
map().addMapMarker(new MapMarkerCircle(spain, "La Garena", new Coordinate(40.4838, -3.39), .002));
spain.setVisible(Boolean.FALSE);
Layer wales = treeMap.addLayer("UK");
map().addMapRectangle(new MapRectangleImpl(wales, "Wales", c(53.35, -4.57), c(51.64, -2.63)));
// map.setDisplayPosition(new Coordinate(49.807, 8.6), 11);
// map.setTileGridVisible(true);
map().addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
if (e.getButton() == MouseEvent.BUTTON1) {
map().getAttribution().handleAttribution(e.getPoint(), true);
}
}
});
map().addMouseMotionListener(new MouseAdapter() {
@Override
public void mouseMoved(MouseEvent e) {
Point p = e.getPoint();
boolean cursorHand = map().getAttribution().handleAttributionCursor(p);
if (cursorHand) {
map().setCursor(new Cursor(Cursor.HAND_CURSOR));
} else {
map().setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
}
if (showToolTip.isSelected()) map().setToolTipText(map().getPosition(p).toString());
}
});
}
private JMapViewer map() {
return treeMap.getViewer();
}
private static Coordinate c(double lat, double lon) {
return new Coordinate(lat, lon);
}
/**
* @param args Main program arguments
*/
public static void main(String[] args) {
new Demo().setVisible(true);
}
private void updateZoomParameters() {
if (mperpLabelValue != null)
mperpLabelValue.setText(String.format("%s", map().getMeterPerPixel()));
if (zoomValue != null)
zoomValue.setText(String.format("%s", map().getZoom()));
}
@Override
public void processCommand(JMVCommandEvent command) {
if (command.getCommand().equals(JMVCommandEvent.COMMAND.ZOOM) ||
command.getCommand().equals(JMVCommandEvent.COMMAND.MOVE)) {
updateZoomParameters();
}
}
}