001// License: GPL. For details, see Readme.txt file. 002package org.openstreetmap.gui.jmapviewer; 003 004import java.awt.BorderLayout; 005import java.awt.Cursor; 006import java.awt.Point; 007import java.awt.event.ItemEvent; 008import java.awt.event.ItemListener; 009import java.awt.event.MouseAdapter; 010import java.awt.event.MouseEvent; 011 012import javax.swing.JButton; 013import javax.swing.JCheckBox; 014import javax.swing.JComboBox; 015import javax.swing.JFrame; 016import javax.swing.JLabel; 017import javax.swing.JPanel; 018 019import org.openstreetmap.gui.jmapviewer.events.JMVCommandEvent; 020import org.openstreetmap.gui.jmapviewer.interfaces.JMapViewerEventListener; 021import org.openstreetmap.gui.jmapviewer.interfaces.MapPolygon; 022import org.openstreetmap.gui.jmapviewer.interfaces.TileLoader; 023import org.openstreetmap.gui.jmapviewer.interfaces.TileSource; 024import org.openstreetmap.gui.jmapviewer.tilesources.BingAerialTileSource; 025import org.openstreetmap.gui.jmapviewer.tilesources.OsmTileSource; 026 027/** 028 * Demonstrates the usage of {@link JMapViewer} 029 * 030 * @author Jan Peter Stotz 031 * 032 */ 033public class Demo extends JFrame implements JMapViewerEventListener { 034 035 private static final long serialVersionUID = 1L; 036 037 private final JMapViewerTree treeMap; 038 039 private final JLabel zoomLabel; 040 private final JLabel zoomValue; 041 042 private final JLabel mperpLabelName; 043 private final JLabel mperpLabelValue; 044 045 /** 046 * Constructs the {@code Demo}. 047 */ 048 public Demo() { 049 super("JMapViewer Demo"); 050 setSize(400, 400); 051 052 treeMap = new JMapViewerTree("Zones"); 053 054 // Listen to the map viewer for user operations so components will 055 // receive events and update 056 map().addJMVListener(this); 057 058 setLayout(new BorderLayout()); 059 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 060 setExtendedState(JFrame.MAXIMIZED_BOTH); 061 JPanel panel = new JPanel(new BorderLayout()); 062 JPanel panelTop = new JPanel(); 063 JPanel panelBottom = new JPanel(); 064 JPanel helpPanel = new JPanel(); 065 066 mperpLabelName = new JLabel("Meters/Pixels: "); 067 mperpLabelValue = new JLabel(String.format("%s", map().getMeterPerPixel())); 068 069 zoomLabel = new JLabel("Zoom: "); 070 zoomValue = new JLabel(String.format("%s", map().getZoom())); 071 072 add(panel, BorderLayout.NORTH); 073 add(helpPanel, BorderLayout.SOUTH); 074 panel.add(panelTop, BorderLayout.NORTH); 075 panel.add(panelBottom, BorderLayout.SOUTH); 076 JLabel helpLabel = new JLabel("Use right mouse button to move,\n " 077 + "left double click or mouse wheel to zoom."); 078 helpPanel.add(helpLabel); 079 JButton button = new JButton("setDisplayToFitMapMarkers"); 080 button.addActionListener(e -> map().setDisplayToFitMapMarkers()); 081 JComboBox<TileSource> tileSourceSelector = new JComboBox<>(new TileSource[] { 082 new OsmTileSource.Mapnik(), 083 new OsmTileSource.TransportMap(), 084 new BingAerialTileSource(), 085 }); 086 tileSourceSelector.addItemListener(new ItemListener() { 087 @Override 088 public void itemStateChanged(ItemEvent e) { 089 map().setTileSource((TileSource) e.getItem()); 090 } 091 }); 092 JComboBox<TileLoader> tileLoaderSelector; 093 tileLoaderSelector = new JComboBox<>(new TileLoader[] {new OsmTileLoader(map())}); 094 tileLoaderSelector.addItemListener(new ItemListener() { 095 @Override 096 public void itemStateChanged(ItemEvent e) { 097 map().setTileLoader((TileLoader) e.getItem()); 098 } 099 }); 100 map().setTileLoader((TileLoader) tileLoaderSelector.getSelectedItem()); 101 panelTop.add(tileSourceSelector); 102 panelTop.add(tileLoaderSelector); 103 final JCheckBox showMapMarker = new JCheckBox("Map markers visible"); 104 showMapMarker.setSelected(map().getMapMarkersVisible()); 105 showMapMarker.addActionListener(e -> map().setMapMarkerVisible(showMapMarker.isSelected())); 106 panelBottom.add(showMapMarker); 107 /// 108 final JCheckBox showTreeLayers = new JCheckBox("Tree Layers visible"); 109 showTreeLayers.addActionListener(e -> treeMap.setTreeVisible(showTreeLayers.isSelected())); 110 panelBottom.add(showTreeLayers); 111 /// 112 final JCheckBox showToolTip = new JCheckBox("ToolTip visible"); 113 showToolTip.addActionListener(e -> map().setToolTipText(null)); 114 panelBottom.add(showToolTip); 115 /// 116 final JCheckBox showTileGrid = new JCheckBox("Tile grid visible"); 117 showTileGrid.setSelected(map().isTileGridVisible()); 118 showTileGrid.addActionListener(e -> map().setTileGridVisible(showTileGrid.isSelected())); 119 panelBottom.add(showTileGrid); 120 final JCheckBox showZoomControls = new JCheckBox("Show zoom controls"); 121 showZoomControls.setSelected(map().getZoomControlsVisible()); 122 showZoomControls.addActionListener(e -> map().setZoomControlsVisible(showZoomControls.isSelected())); 123 panelBottom.add(showZoomControls); 124 final JCheckBox scrollWrapEnabled = new JCheckBox("Scrollwrap enabled"); 125 scrollWrapEnabled.addActionListener(e -> map().setScrollWrapEnabled(scrollWrapEnabled.isSelected())); 126 panelBottom.add(scrollWrapEnabled); 127 panelBottom.add(button); 128 129 panelTop.add(zoomLabel); 130 panelTop.add(zoomValue); 131 panelTop.add(mperpLabelName); 132 panelTop.add(mperpLabelValue); 133 134 add(treeMap, BorderLayout.CENTER); 135 136 // 137 LayerGroup germanyGroup = new LayerGroup("Germany"); 138 Layer germanyWestLayer = germanyGroup.addLayer("Germany West"); 139 Layer germanyEastLayer = germanyGroup.addLayer("Germany East"); 140 MapMarkerDot eberstadt = new MapMarkerDot(germanyEastLayer, "Eberstadt", 49.814284999, 8.642065999); 141 MapMarkerDot ebersheim = new MapMarkerDot(germanyWestLayer, "Ebersheim", 49.91, 8.24); 142 MapMarkerDot empty = new MapMarkerDot(germanyEastLayer, 49.71, 8.64); 143 MapMarkerDot darmstadt = new MapMarkerDot(germanyEastLayer, "Darmstadt", 49.8588, 8.643); 144 map().addMapMarker(eberstadt); 145 map().addMapMarker(ebersheim); 146 map().addMapMarker(empty); 147 Layer franceLayer = treeMap.addLayer("France"); 148 map().addMapMarker(new MapMarkerDot(franceLayer, "La Gallerie", 48.71, -1)); 149 map().addMapMarker(new MapMarkerDot(43.604, 1.444)); 150 map().addMapMarker(new MapMarkerCircle(53.343, -6.267, 0.666)); 151 map().addMapRectangle(new MapRectangleImpl(new Coordinate(53.343, -6.267), new Coordinate(43.604, 1.444))); 152 map().addMapMarker(darmstadt); 153 treeMap.addLayer(germanyWestLayer); 154 treeMap.addLayer(germanyEastLayer); 155 156 MapPolygon bermudas = new MapPolygonImpl(c(49, 1), c(45, 10), c(40, 5)); 157 map().addMapPolygon(bermudas); 158 map().addMapPolygon(new MapPolygonImpl(germanyEastLayer, "Riedstadt", ebersheim, darmstadt, eberstadt, empty)); 159 160 map().addMapMarker(new MapMarkerCircle(germanyWestLayer, "North of Suisse", new Coordinate(48, 7), .5)); 161 Layer spain = treeMap.addLayer("Spain"); 162 map().addMapMarker(new MapMarkerCircle(spain, "La Garena", new Coordinate(40.4838, -3.39), .002)); 163 spain.setVisible(Boolean.FALSE); 164 165 Layer wales = treeMap.addLayer("UK"); 166 map().addMapRectangle(new MapRectangleImpl(wales, "Wales", c(53.35, -4.57), c(51.64, -2.63))); 167 168 // map.setDisplayPosition(new Coordinate(49.807, 8.6), 11); 169 // map.setTileGridVisible(true); 170 171 map().addMouseListener(new MouseAdapter() { 172 @Override 173 public void mouseClicked(MouseEvent e) { 174 if (e.getButton() == MouseEvent.BUTTON1) { 175 map().getAttribution().handleAttribution(e.getPoint(), true); 176 } 177 } 178 }); 179 180 map().addMouseMotionListener(new MouseAdapter() { 181 @Override 182 public void mouseMoved(MouseEvent e) { 183 Point p = e.getPoint(); 184 boolean cursorHand = map().getAttribution().handleAttributionCursor(p); 185 if (cursorHand) { 186 map().setCursor(new Cursor(Cursor.HAND_CURSOR)); 187 } else { 188 map().setCursor(new Cursor(Cursor.DEFAULT_CURSOR)); 189 } 190 if (showToolTip.isSelected()) map().setToolTipText(map().getPosition(p).toString()); 191 } 192 }); 193 } 194 195 private JMapViewer map() { 196 return treeMap.getViewer(); 197 } 198 199 private static Coordinate c(double lat, double lon) { 200 return new Coordinate(lat, lon); 201 } 202 203 /** 204 * @param args Main program arguments 205 */ 206 public static void main(String[] args) { 207 new Demo().setVisible(true); 208 } 209 210 private void updateZoomParameters() { 211 if (mperpLabelValue != null) 212 mperpLabelValue.setText(String.format("%s", map().getMeterPerPixel())); 213 if (zoomValue != null) 214 zoomValue.setText(String.format("%s", map().getZoom())); 215 } 216 217 @Override 218 public void processCommand(JMVCommandEvent command) { 219 if (command.getCommand().equals(JMVCommandEvent.COMMAND.ZOOM) || 220 command.getCommand().equals(JMVCommandEvent.COMMAND.MOVE)) { 221 updateZoomParameters(); 222 } 223 } 224}