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(); 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.setLayout(new BorderLayout()); 079 panel.add(panelTop, BorderLayout.NORTH); 080 panel.add(panelBottom, BorderLayout.SOUTH); 081 JLabel helpLabel = new JLabel("Use right mouse button to move,\n " 082 + "left double click or mouse wheel to zoom."); 083 helpPanel.add(helpLabel); 084 JButton button = new JButton("setDisplayToFitMapMarkers"); 085 button.addActionListener(new ActionListener() { 086 @Override 087 public void actionPerformed(ActionEvent e) { 088 map().setDisplayToFitMapMarkers(); 089 } 090 }); 091 JComboBox<TileSource> tileSourceSelector = new JComboBox<>(new TileSource[] { 092 new OsmTileSource.Mapnik(), 093 new OsmTileSource.CycleMap(), 094 new BingAerialTileSource(), 095 new MapQuestOsmTileSource(), 096 new MapQuestOpenAerialTileSource() }); 097 tileSourceSelector.addItemListener(new ItemListener() { 098 @Override 099 public void itemStateChanged(ItemEvent e) { 100 map().setTileSource((TileSource) e.getItem()); 101 } 102 }); 103 JComboBox<TileLoader> tileLoaderSelector; 104 tileLoaderSelector = new JComboBox<>(new TileLoader[] {new OsmTileLoader(map())}); 105 tileLoaderSelector.addItemListener(new ItemListener() { 106 @Override 107 public void itemStateChanged(ItemEvent e) { 108 map().setTileLoader((TileLoader) e.getItem()); 109 } 110 }); 111 map().setTileLoader((TileLoader) tileLoaderSelector.getSelectedItem()); 112 panelTop.add(tileSourceSelector); 113 panelTop.add(tileLoaderSelector); 114 final JCheckBox showMapMarker = new JCheckBox("Map markers visible"); 115 showMapMarker.setSelected(map().getMapMarkersVisible()); 116 showMapMarker.addActionListener(new ActionListener() { 117 @Override 118 public void actionPerformed(ActionEvent e) { 119 map().setMapMarkerVisible(showMapMarker.isSelected()); 120 } 121 }); 122 panelBottom.add(showMapMarker); 123 /// 124 final JCheckBox showTreeLayers = new JCheckBox("Tree Layers visible"); 125 showTreeLayers.addActionListener(new ActionListener() { 126 @Override 127 public void actionPerformed(ActionEvent e) { 128 treeMap.setTreeVisible(showTreeLayers.isSelected()); 129 } 130 }); 131 panelBottom.add(showTreeLayers); 132 /// 133 final JCheckBox showToolTip = new JCheckBox("ToolTip visible"); 134 showToolTip.addActionListener(new ActionListener() { 135 @Override 136 public void actionPerformed(ActionEvent e) { 137 map().setToolTipText(null); 138 } 139 }); 140 panelBottom.add(showToolTip); 141 /// 142 final JCheckBox showTileGrid = new JCheckBox("Tile grid visible"); 143 showTileGrid.setSelected(map().isTileGridVisible()); 144 showTileGrid.addActionListener(new ActionListener() { 145 @Override 146 public void actionPerformed(ActionEvent e) { 147 map().setTileGridVisible(showTileGrid.isSelected()); 148 } 149 }); 150 panelBottom.add(showTileGrid); 151 final JCheckBox showZoomControls = new JCheckBox("Show zoom controls"); 152 showZoomControls.setSelected(map().getZoomControlsVisible()); 153 showZoomControls.addActionListener(new ActionListener() { 154 @Override 155 public void actionPerformed(ActionEvent e) { 156 map().setZoomContolsVisible(showZoomControls.isSelected()); 157 } 158 }); 159 panelBottom.add(showZoomControls); 160 final JCheckBox scrollWrapEnabled = new JCheckBox("Scrollwrap enabled"); 161 scrollWrapEnabled.addActionListener(new ActionListener() { 162 @Override 163 public void actionPerformed(ActionEvent e) { 164 map().setScrollWrapEnabled(scrollWrapEnabled.isSelected()); 165 } 166 }); 167 panelBottom.add(scrollWrapEnabled); 168 panelBottom.add(button); 169 170 panelTop.add(zoomLabel); 171 panelTop.add(zoomValue); 172 panelTop.add(mperpLabelName); 173 panelTop.add(mperpLabelValue); 174 175 add(treeMap, BorderLayout.CENTER); 176 177 // 178 LayerGroup germanyGroup = new LayerGroup("Germany"); 179 Layer germanyWestLayer = germanyGroup.addLayer("Germany West"); 180 Layer germanyEastLayer = germanyGroup.addLayer("Germany East"); 181 MapMarkerDot eberstadt = new MapMarkerDot(germanyEastLayer, "Eberstadt", 49.814284999, 8.642065999); 182 MapMarkerDot ebersheim = new MapMarkerDot(germanyWestLayer, "Ebersheim", 49.91, 8.24); 183 MapMarkerDot empty = new MapMarkerDot(germanyEastLayer, 49.71, 8.64); 184 MapMarkerDot darmstadt = new MapMarkerDot(germanyEastLayer, "Darmstadt", 49.8588, 8.643); 185 map().addMapMarker(eberstadt); 186 map().addMapMarker(ebersheim); 187 map().addMapMarker(empty); 188 Layer franceLayer = treeMap.addLayer("France"); 189 map().addMapMarker(new MapMarkerDot(franceLayer, "La Gallerie", 48.71, -1)); 190 map().addMapMarker(new MapMarkerDot(43.604, 1.444)); 191 map().addMapMarker(new MapMarkerCircle(53.343, -6.267, 0.666)); 192 map().addMapRectangle(new MapRectangleImpl(new Coordinate(53.343, -6.267), new Coordinate(43.604, 1.444))); 193 map().addMapMarker(darmstadt); 194 treeMap.addLayer(germanyWestLayer); 195 treeMap.addLayer(germanyEastLayer); 196 197 MapPolygon bermudas = new MapPolygonImpl(c(49, 1), c(45, 10), c(40, 5)); 198 map().addMapPolygon(bermudas); 199 map().addMapPolygon(new MapPolygonImpl(germanyEastLayer, "Riedstadt", ebersheim, darmstadt, eberstadt, empty)); 200 201 map().addMapMarker(new MapMarkerCircle(germanyWestLayer, "North of Suisse", new Coordinate(48, 7), .5)); 202 Layer spain = treeMap.addLayer("Spain"); 203 map().addMapMarker(new MapMarkerCircle(spain, "La Garena", new Coordinate(40.4838, -3.39), .002)); 204 spain.setVisible(Boolean.FALSE); 205 206 Layer wales = treeMap.addLayer("UK"); 207 map().addMapRectangle(new MapRectangleImpl(wales, "Wales", c(53.35, -4.57), c(51.64, -2.63))); 208 209 // map.setDisplayPosition(new Coordinate(49.807, 8.6), 11); 210 // map.setTileGridVisible(true); 211 212 map().addMouseListener(new MouseAdapter() { 213 @Override 214 public void mouseClicked(MouseEvent e) { 215 if (e.getButton() == MouseEvent.BUTTON1) { 216 map().getAttribution().handleAttribution(e.getPoint(), true); 217 } 218 } 219 }); 220 221 map().addMouseMotionListener(new MouseAdapter() { 222 @Override 223 public void mouseMoved(MouseEvent e) { 224 Point p = e.getPoint(); 225 boolean cursorHand = map().getAttribution().handleAttributionCursor(p); 226 if (cursorHand) { 227 map().setCursor(new Cursor(Cursor.HAND_CURSOR)); 228 } else { 229 map().setCursor(new Cursor(Cursor.DEFAULT_CURSOR)); 230 } 231 if (showToolTip.isSelected()) map().setToolTipText(map().getPosition(p).toString()); 232 } 233 }); 234 } 235 236 private JMapViewer map() { 237 return treeMap.getViewer(); 238 } 239 240 private static Coordinate c(double lat, double lon) { 241 return new Coordinate(lat, lon); 242 } 243 244 /** 245 * @param args Main program arguments 246 */ 247 public static void main(String[] args) { 248 new Demo().setVisible(true); 249 } 250 251 private void updateZoomParameters() { 252 if (mperpLabelValue != null) 253 mperpLabelValue.setText(String.format("%s", map().getMeterPerPixel())); 254 if (zoomValue != null) 255 zoomValue.setText(String.format("%s", map().getZoom())); 256 } 257 258 @Override 259 public void processCommand(JMVCommandEvent command) { 260 if (command.getCommand().equals(JMVCommandEvent.COMMAND.ZOOM) || 261 command.getCommand().equals(JMVCommandEvent.COMMAND.MOVE)) { 262 updateZoomParameters(); 263 } 264 } 265}