001package org.openstreetmap.gui.jmapviewer;
002
003//License: GPL. Copyright 2008 by Jan Peter Stotz
004
005import java.awt.BorderLayout;
006import java.awt.Cursor;
007import java.awt.Point;
008import java.awt.event.ActionEvent;
009import java.awt.event.ActionListener;
010import java.awt.event.ItemEvent;
011import java.awt.event.ItemListener;
012import java.awt.event.MouseAdapter;
013import java.awt.event.MouseEvent;
014import java.io.IOException;
015
016import javax.swing.JButton;
017import javax.swing.JCheckBox;
018import javax.swing.JComboBox;
019import javax.swing.JFrame;
020import javax.swing.JLabel;
021import javax.swing.JPanel;
022
023import org.openstreetmap.gui.jmapviewer.events.JMVCommandEvent;
024import org.openstreetmap.gui.jmapviewer.interfaces.JMapViewerEventListener;
025import org.openstreetmap.gui.jmapviewer.interfaces.MapPolygon;
026import org.openstreetmap.gui.jmapviewer.interfaces.TileLoader;
027import org.openstreetmap.gui.jmapviewer.interfaces.TileSource;
028import org.openstreetmap.gui.jmapviewer.tilesources.BingAerialTileSource;
029import org.openstreetmap.gui.jmapviewer.tilesources.MapQuestOpenAerialTileSource;
030import org.openstreetmap.gui.jmapviewer.tilesources.MapQuestOsmTileSource;
031import org.openstreetmap.gui.jmapviewer.tilesources.OsmTileSource;
032
033/**
034 *
035 * Demonstrates the usage of {@link JMapViewer}
036 *
037 * @author Jan Peter Stotz
038 *
039 */
040public class Demo extends JFrame implements JMapViewerEventListener  {
041
042    private static final long serialVersionUID = 1L;
043
044    private JMapViewerTree treeMap = null;
045
046    private JLabel zoomLabel=null;
047    private JLabel zoomValue=null;
048
049    private JLabel mperpLabelName=null;
050    private JLabel mperpLabelValue = null;
051
052    /**
053     * Constructs the {@code Demo}.
054     */
055    public Demo() {
056        super("JMapViewer Demo");
057        setSize(400, 400);
058
059        treeMap = new JMapViewerTree("Zones");
060
061        // Listen to the map viewer for user operations so components will
062        // recieve events and update
063        map().addJMVListener(this);
064
065        // final JMapViewer map = new JMapViewer(new MemoryTileCache(),4);
066        // map.setTileLoader(new OsmFileCacheTileLoader(map));
067        // new DefaultMapController(map);
068
069        setLayout(new BorderLayout());
070        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
071        setExtendedState(JFrame.MAXIMIZED_BOTH);
072        JPanel panel = new JPanel();
073        JPanel panelTop = new JPanel();
074        JPanel panelBottom = new JPanel();
075        JPanel helpPanel = new JPanel();
076
077        mperpLabelName=new JLabel("Meters/Pixels: ");
078        mperpLabelValue=new JLabel(String.format("%s",map().getMeterPerPixel()));
079
080        zoomLabel=new JLabel("Zoom: ");
081        zoomValue=new JLabel(String.format("%s", map().getZoom()));
082
083        add(panel, BorderLayout.NORTH);
084        add(helpPanel, BorderLayout.SOUTH);
085        panel.setLayout(new BorderLayout());
086        panel.add(panelTop, BorderLayout.NORTH);
087        panel.add(panelBottom, BorderLayout.SOUTH);
088        JLabel helpLabel = new JLabel("Use right mouse button to move,\n "
089                + "left double click or mouse wheel to zoom.");
090        helpPanel.add(helpLabel);
091        JButton button = new JButton("setDisplayToFitMapMarkers");
092        button.addActionListener(new ActionListener() {
093
094            public void actionPerformed(ActionEvent e) {
095                map().setDisplayToFitMapMarkers();
096            }
097        });
098        JComboBox tileSourceSelector = new JComboBox(new TileSource[] { new OsmTileSource.Mapnik(),
099                new OsmTileSource.CycleMap(), new BingAerialTileSource(), new MapQuestOsmTileSource(), new MapQuestOpenAerialTileSource() });
100        tileSourceSelector.addItemListener(new ItemListener() {
101            public void itemStateChanged(ItemEvent e) {
102                map().setTileSource((TileSource) e.getItem());
103            }
104        });
105        JComboBox tileLoaderSelector;
106        try {
107            tileLoaderSelector = new JComboBox(new TileLoader[] { new OsmFileCacheTileLoader(map()),
108                    new OsmTileLoader(map()) });
109        } catch (IOException e) {
110            tileLoaderSelector = new JComboBox(new TileLoader[] { new OsmTileLoader(map()) });
111        }
112        tileLoaderSelector.addItemListener(new ItemListener() {
113            public void itemStateChanged(ItemEvent e) {
114                map().setTileLoader((TileLoader) e.getItem());
115            }
116        });
117        map().setTileLoader((TileLoader) tileLoaderSelector.getSelectedItem());
118        panelTop.add(tileSourceSelector);
119        panelTop.add(tileLoaderSelector);
120        final JCheckBox showMapMarker = new JCheckBox("Map markers visible");
121        showMapMarker.setSelected(map().getMapMarkersVisible());
122        showMapMarker.addActionListener(new ActionListener() {
123            public void actionPerformed(ActionEvent e) {
124                map().setMapMarkerVisible(showMapMarker.isSelected());
125            }
126        });
127        panelBottom.add(showMapMarker);
128        ///
129        final JCheckBox showTreeLayers = new JCheckBox("Tree Layers visible");
130        showTreeLayers.addActionListener(new ActionListener() {
131            public void actionPerformed(ActionEvent e) {
132                treeMap.setTreeVisible(showTreeLayers.isSelected());
133            }
134        });
135        panelBottom.add(showTreeLayers);
136        ///
137        final JCheckBox showToolTip = new JCheckBox("ToolTip visible");
138        showToolTip.addActionListener(new ActionListener() {
139            public void actionPerformed(ActionEvent e) {
140                map().setToolTipText(null);
141            }
142        });
143        panelBottom.add(showToolTip);
144        ///
145        final JCheckBox showTileGrid = new JCheckBox("Tile grid visible");
146        showTileGrid.setSelected(map().isTileGridVisible());
147        showTileGrid.addActionListener(new ActionListener() {
148            public void actionPerformed(ActionEvent e) {
149                map().setTileGridVisible(showTileGrid.isSelected());
150            }
151        });
152        panelBottom.add(showTileGrid);
153        final JCheckBox showZoomControls = new JCheckBox("Show zoom controls");
154        showZoomControls.setSelected(map().getZoomContolsVisible());
155        showZoomControls.addActionListener(new ActionListener() {
156            public void actionPerformed(ActionEvent e) {
157                map().setZoomContolsVisible(showZoomControls.isSelected());
158            }
159        });
160        panelBottom.add(showZoomControls);
161        final JCheckBox scrollWrapEnabled = new JCheckBox("Scrollwrap enabled");
162        scrollWrapEnabled.addActionListener(new ActionListener() {
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(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.setDisplayPositionByLatLon(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    private JMapViewer map(){
236        return treeMap.getViewer();
237    }
238    private static Coordinate c(double lat, double lon){
239        return new Coordinate(lat, lon);
240    }
241
242    /**
243     * @param args
244     */
245    public static void main(String[] args) {
246        // java.util.Properties systemProperties = System.getProperties();
247        // systemProperties.setProperty("http.proxyHost", "localhost");
248        // systemProperties.setProperty("http.proxyPort", "8008");
249        new Demo().setVisible(true);
250    }
251
252    private void updateZoomParameters() {
253        if (mperpLabelValue!=null)
254            mperpLabelValue.setText(String.format("%s",map().getMeterPerPixel()));
255        if (zoomValue!=null)
256            zoomValue.setText(String.format("%s", map().getZoom()));
257    }
258
259    @Override
260    public void processCommand(JMVCommandEvent command) {
261        if (command.getCommand().equals(JMVCommandEvent.COMMAND.ZOOM) ||
262                command.getCommand().equals(JMVCommandEvent.COMMAND.MOVE)) {
263            updateZoomParameters();
264        }
265    }
266
267}