Ticket #8441: dynamic_imagery_menu.diff

File dynamic_imagery_menu.diff, 12.2 KB (added by bastiK, 12 years ago)
  • src/org/openstreetmap/josm/data/imagery/ImageryLayerInfo.java

     
    66import java.util.Arrays;
    77import java.util.Collection;
    88import java.util.Collections;
    9 import java.util.LinkedList;
    109import java.util.List;
    1110
     11import org.xml.sax.SAXException;
     12
    1213import org.openstreetmap.josm.Main;
    1314import org.openstreetmap.josm.data.imagery.ImageryInfo.ImageryPreferenceEntry;
     15import org.openstreetmap.josm.io.MirroredInputStream;
    1416import org.openstreetmap.josm.io.imagery.ImageryReader;
    15 import org.openstreetmap.josm.io.MirroredInputStream;
    1617import org.openstreetmap.josm.tools.Utils;
    17 import org.xml.sax.SAXException;
    1818
    1919/**
    2020 * Manages the list of imagery entries that are shown in the imagery menu.
     
    5959        }
    6060    }
    6161
     62    /**
     63     * Loads the available imagery entries.
     64     *
     65     * The data is downloaded from the JOSM website (or loaded from cache).
     66     * Entries marked as "default" are added to the user selection, if not
     67     * already present.
     68     *
     69     * @param clearCache if true, clear the cache and start a fresh download.
     70     */
    6271    public void loadDefaults(boolean clearCache) {
    6372        defaultLayers.clear();
    6473        for (String source : Main.pref.getCollection("imagery.layers.sites", Arrays.asList(DEFAULT_LAYER_SITES))) {
     
    147156    public static void addLayer(ImageryInfo info) {
    148157        instance.add(info);
    149158        instance.save();
    150         Main.main.menu.imageryMenu.refreshImageryMenu();
    151159    }
    152160
    153161    public static void addLayers(Collection<ImageryInfo> infos) {
     
    156164        }
    157165        instance.save();
    158166        Collections.sort(instance.layers);
    159         Main.main.menu.imageryMenu.refreshImageryMenu();
    160167    }
    161168}
  • src/org/openstreetmap/josm/actions/downloadtasks/DownloadOsmTask.java

     
    282282                computeBboxAndCenterScale();
    283283                targetLayer.onPostDownloadFromServer();
    284284            }
    285 
    286             // Suggest potential imagery data, except if the data is downloaded after a "data update" command (see #8307)
    287             if (!isUpdateData) {
    288                 suggestImageryLayers();
    289             }
    290285        }
    291286       
    292287        protected void computeBboxAndCenterScale() {
     
    305300                reader.cancel();
    306301            }
    307302        }
    308 
    309         protected void suggestImageryLayers() {
    310             if (currentBounds != null) {
    311                 final LatLon center = currentBounds.getCenter();
    312                 final Set<ImageryInfo> layers = new HashSet<ImageryInfo>();
    313    
    314                 for (ImageryInfo i : ImageryLayerInfo.instance.getDefaultLayers()) {
    315                     if (i.getBounds() != null && i.getBounds().contains(center)) {
    316                         layers.add(i);
    317                     }
    318                 }
    319                 // Do not suggest layers already in use
    320                 layers.removeAll(ImageryLayerInfo.instance.getLayers());
    321                 // For layers containing complex shapes, check that center is in one of its shapes (fix #7910)
    322                 for (Iterator<ImageryInfo> iti = layers.iterator(); iti.hasNext(); ) {
    323                     List<Shape> shapes = iti.next().getBounds().getShapes();
    324                     if (shapes != null && !shapes.isEmpty()) {
    325                         boolean found = false;
    326                         for (Iterator<Shape> its = shapes.iterator(); its.hasNext() && !found; ) {
    327                             found = its.next().contains(center);
    328                         }
    329                         if (!found) {
    330                             iti.remove();
    331                         }
    332                     }
    333                 }
    334    
    335                 if (layers.isEmpty()) {
    336                     return;
    337                 }
    338    
    339                 final List<String> layerNames = new ArrayList<String>();
    340                 for (ImageryInfo i : layers) {
    341                     layerNames.add(i.getName());
    342                 }
    343    
    344                 if (!ConditionalOptionPaneUtil.showConfirmationDialog(
    345                         "download.suggest-imagery-layer",
    346                         Main.parent,
    347                         tr("<html>For the downloaded area, the following additional imagery layers are available: {0}" +
    348                                 "Do you want to add those layers to the <em>Imagery</em> menu?" +
    349                                 "<br>(If needed, you can remove those entries in the <em>Preferences</em>.)",
    350                                 Utils.joinAsHtmlUnorderedList(layerNames)),
    351                         tr("Add imagery layers?"),
    352                         JOptionPane.YES_NO_OPTION,
    353                         JOptionPane.QUESTION_MESSAGE,
    354                         JOptionPane.YES_OPTION)) {
    355                     return;
    356                 }
    357    
    358                 ImageryLayerInfo.addLayers(layers);
    359             }
    360         }
    361303    }
    362304
    363305    @Override
  • src/org/openstreetmap/josm/gui/preferences/imagery/ImageryPreference.java

     
    139139        layerInfo.save();
    140140        ImageryLayerInfo.instance.clear();
    141141        ImageryLayerInfo.instance.load();
    142         Main.main.menu.imageryMenu.refreshImageryMenu();
    143142        Main.main.menu.imageryMenu.refreshOffsetMenu();
    144143        OffsetBookmark.saveBookmarks();
    145144
     
    830829        ImageryLayerInfo.instance.loadDefaults(false);
    831830        ImageryLayerInfo.instance.load();
    832831        OffsetBookmark.loadBookmarks();
    833         Main.main.menu.imageryMenu.refreshImageryMenu();
    834832        Main.main.menu.imageryMenu.refreshOffsetMenu();
    835833    }
    836834}
  • src/org/openstreetmap/josm/gui/ImageryMenu.java

     
    77import java.awt.Component;
    88import java.awt.Toolkit;
    99import java.awt.event.ActionEvent;
     10import java.util.HashSet;
     11import java.util.Iterator;
    1012import java.util.List;
     13import java.util.Set;
    1114
    1215import javax.swing.Action;
    1316import javax.swing.JComponent;
     
    1518import javax.swing.JMenuItem;
    1619import javax.swing.JPopupMenu;
    1720import javax.swing.MenuElement;
     21import javax.swing.event.MenuEvent;
     22import javax.swing.event.MenuListener;
    1823
    1924import org.openstreetmap.josm.Main;
    2025import org.openstreetmap.josm.actions.AddImageryLayerAction;
    2126import org.openstreetmap.josm.actions.JosmAction;
    2227import org.openstreetmap.josm.actions.Map_Rectifier_WMSmenuAction;
     28import org.openstreetmap.josm.data.coor.LatLon;
    2329import org.openstreetmap.josm.data.imagery.ImageryInfo;
    2430import org.openstreetmap.josm.data.imagery.ImageryLayerInfo;
     31import org.openstreetmap.josm.data.imagery.Shape;
    2532import org.openstreetmap.josm.gui.layer.ImageryLayer;
    2633import org.openstreetmap.josm.gui.layer.Layer;
    2734import org.openstreetmap.josm.tools.ImageProvider;
    2835
    2936public class ImageryMenu extends JMenu implements MapView.LayerChangeListener {
     37
    3038    private Action offsetAction = new JosmAction(
    3139            tr("Imagery offset"), "mapmode/adjustimg", tr("Adjust imagery offset"), null, false, false) {
    3240        {
     
    6573            popup.show(source, source.getWidth()/2, source.getHeight()/2);
    6674        }
    6775    };
     76
    6877    private JMenuItem singleOffset = new JMenuItem(offsetAction);
    6978    private JMenuItem offsetMenuItem = singleOffset;
    7079    private Map_Rectifier_WMSmenuAction rectaction = new Map_Rectifier_WMSmenuAction();
    71     private int offsPos;
    72     private MenuScroller menuScroller;
    7380
    7481    public ImageryMenu() {
    7582        super(tr("Imagery"));
    7683        setupMenuScroller();
    7784        MapView.addLayerChangeListener(this);
     85        // build dynamically
     86        addMenuListener(new MenuListener() {
     87            @Override
     88            public void menuSelected(MenuEvent e) {
     89                refreshImageryMenu();
     90            }
     91
     92            @Override
     93            public void menuDeselected(MenuEvent e) {
     94            }
     95
     96            @Override
     97            public void menuCanceled(MenuEvent e) {
     98            }
     99        });
    78100    }
    79101   
    80     private final void setupMenuScroller() {
     102    private void setupMenuScroller() {
    81103        int screenHeight = Toolkit.getDefaultToolkit().getScreenSize().height;
    82104        int menuItemHeight = singleOffset.getPreferredSize().height;
    83         menuScroller = MenuScroller.setScrollerFor(this, (screenHeight / menuItemHeight)-1);
     105        MenuScroller.setScrollerFor(this, (screenHeight / menuItemHeight)-1);
    84106    }
    85107
    86     public void refreshImageryMenu() {
    87         if (menuScroller != null) {
    88             menuScroller.dispose();
    89             menuScroller = null;
    90         }
    91         setupMenuScroller();
     108    protected void refreshImageryMenu() {
    92109        removeAll();
    93110
    94111        // for each configured ImageryInfo, add a menu entry.
    95112        for (final ImageryInfo u : ImageryLayerInfo.instance.getLayers()) {
    96113            add(new AddImageryLayerAction(u));
    97114        }
     115
     116        // list all imagery entries where the current map location
     117        // is within the imagery bounds
     118        if (Main.isDisplayingMapView()) {
     119            MapView mv = Main.map.mapView;
     120            LatLon pos = mv.getProjection().eastNorth2latlon(mv.getCenter());
     121            final Set<ImageryInfo> inViewLayers = new HashSet<ImageryInfo>();
     122
     123            for (ImageryInfo i : ImageryLayerInfo.instance.getDefaultLayers()) {
     124                if (i.getBounds() != null && i.getBounds().contains(pos)) {
     125                    inViewLayers.add(i);
     126                }
     127            }
     128            // Do not suggest layers already in use
     129            inViewLayers.removeAll(ImageryLayerInfo.instance.getLayers());
     130            // For layers containing complex shapes, check that center is in one
     131            // of its shapes (fix #7910)
     132            for (Iterator<ImageryInfo> iti = inViewLayers.iterator(); iti.hasNext(); ) {
     133                List<Shape> shapes = iti.next().getBounds().getShapes();
     134                if (shapes != null && !shapes.isEmpty()) {
     135                    boolean found = false;
     136                    for (Iterator<Shape> its = shapes.iterator(); its.hasNext() && !found; ) {
     137                        found = its.next().contains(pos);
     138                    }
     139                    if (!found) {
     140                        iti.remove();
     141                    }
     142                }
     143            }
     144            if (!inViewLayers.isEmpty()) {
     145                addSeparator();
     146                for (ImageryInfo i : inViewLayers) {
     147                    add(new AddImageryLayerAction(i));
     148                }
     149            }
     150        }
     151
    98152        addSeparator();
    99153        add(new JMenuItem(rectaction));
    100154
    101155        addSeparator();
    102         offsPos = getMenuComponentCount();
    103156        add(offsetMenuItem);
    104157    }
    105158
     
    136189    }
    137190
    138191    public void refreshOffsetMenu() {
    139         JMenuItem newItem = getNewOffsetMenu();
    140         remove(offsetMenuItem);
    141         add(newItem, offsPos);
    142         offsetMenuItem = newItem;
     192        offsetMenuItem = getNewOffsetMenu();
    143193    }
    144194
    145195    @Override
  • src/org/openstreetmap/josm/gui/io/RecentlyOpenedFilesMenu.java

     
    88import java.io.File;
    99import java.util.Collection;
    1010import java.util.Collections;
     11
    1112import javax.swing.AbstractAction;
    1213import javax.swing.JMenu;
    1314import javax.swing.JMenuItem;