001// License: GPL. For details, see LICENSE file. 002package org.openstreetmap.josm.gui.dialogs; 003 004import static org.openstreetmap.josm.tools.I18n.tr; 005 006import java.beans.PropertyChangeEvent; 007import java.beans.PropertyChangeListener; 008import java.util.Collections; 009 010import org.openstreetmap.josm.Main; 011import org.openstreetmap.josm.data.Bounds; 012import org.openstreetmap.josm.gui.MapView; 013import org.openstreetmap.josm.gui.NavigatableComponent; 014import org.openstreetmap.josm.gui.SideButton; 015import org.openstreetmap.josm.gui.bbox.BBoxChooser; 016import org.openstreetmap.josm.gui.bbox.SlippyMapBBoxChooser; 017 018/** 019 * A small map of the current edit location implemented as {@link ToggleDialog}. 020 */ 021public class MinimapDialog extends ToggleDialog implements NavigatableComponent.ZoomChangeListener, PropertyChangeListener { 022 023 protected final SlippyMapBBoxChooser slippyMap = new SlippyMapBBoxChooser(); 024 protected boolean skipEvents; 025 026 /** 027 * Constructs a new {@code MinimapDialog}. 028 */ 029 public MinimapDialog() { 030 super(tr("Mini map"), "minimap", tr("Displays a small map of the current edit location"), null, 150); 031 createLayout(slippyMap, false, Collections.<SideButton>emptyList()); 032 slippyMap.setSizeButtonVisible(false); 033 slippyMap.addPropertyChangeListener(BBoxChooser.BBOX_PROP, this); 034 } 035 036 @Override 037 public void showDialog() { 038 NavigatableComponent.addZoomChangeListener(this); 039 super.showDialog(); 040 } 041 042 @Override 043 public void hideDialog() { 044 NavigatableComponent.removeZoomChangeListener(this); 045 super.hideDialog(); 046 } 047 048 @Override 049 public void zoomChanged() { 050 if (Main.isDisplayingMapView() && !skipEvents) { 051 MapView mv = Main.map.mapView; 052 final Bounds currentBounds = new Bounds( 053 mv.getLatLon(0, mv.getHeight()), 054 mv.getLatLon(mv.getWidth(), 0) 055 ); 056 skipEvents = true; 057 slippyMap.setBoundingBox(currentBounds); 058 slippyMap.zoomOut(); // to give a better overview 059 skipEvents = false; 060 } 061 } 062 063 @Override 064 public void propertyChange(PropertyChangeEvent evt) { 065 if (!skipEvents) { 066 skipEvents = true; 067 Main.map.mapView.zoomTo(slippyMap.getBoundingBox()); 068 skipEvents = false; 069 } 070 } 071}