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