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