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