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}