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