// License: GPL. For details, see LICENSE file. package org.openstreetmap.josm.gui.dialogs; import static org.openstreetmap.josm.tools.I18n.tr; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.util.Collections; import org.openstreetmap.josm.Main; import org.openstreetmap.josm.data.Bounds; import org.openstreetmap.josm.gui.MapView; import org.openstreetmap.josm.gui.NavigatableComponent; import org.openstreetmap.josm.gui.bbox.BBoxChooser; import org.openstreetmap.josm.gui.bbox.SlippyMapBBoxChooser; /** * A small map of the current edit location implemented as {@link ToggleDialog}. */ public class MinimapDialog extends ToggleDialog implements NavigatableComponent.ZoomChangeListener, PropertyChangeListener { private SlippyMapBBoxChooser slippyMap; private boolean skipEvents; /** * Constructs a new {@code MinimapDialog}. */ public MinimapDialog() { super(tr("Mini map"), "minimap", tr("Displays a small map of the current edit location"), null, 150); } private synchronized void initialize() { if (slippyMap != null) { return; } slippyMap = new SlippyMapBBoxChooser(); createLayout(slippyMap, false, Collections.emptyList()); slippyMap.setSizeButtonVisible(false); slippyMap.addPropertyChangeListener(BBoxChooser.BBOX_PROP, this); } @Override public void showDialog() { initialize(); NavigatableComponent.addZoomChangeListener(this); super.showDialog(); } @Override public void hideDialog() { NavigatableComponent.removeZoomChangeListener(this); super.hideDialog(); } @Override public void zoomChanged() { if (!skipEvents && Main.isDisplayingMapView()) { MapView mv = Main.map.mapView; final Bounds currentBounds = new Bounds( mv.getLatLon(0, mv.getHeight()), mv.getLatLon(mv.getWidth(), 0) ); skipEvents = true; slippyMap.setBoundingBox(currentBounds); slippyMap.zoomOut(); // to give a better overview skipEvents = false; } } @Override public void propertyChange(PropertyChangeEvent evt) { if (!skipEvents) { skipEvents = true; Main.map.mapView.zoomTo(slippyMap.getBoundingBox()); skipEvents = false; } } }