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}