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}