Ignore:
Timestamp:
2013-02-19T10:04:40+01:00 (11 years ago)
Author:
bastiK
Message:

applied #8441 - show local imagery sources in menu instead of popup

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/org/openstreetmap/josm/gui/ImageryMenu.java

    r5664 r5729  
    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;
     
    1619import javax.swing.JPopupMenu;
    1720import javax.swing.MenuElement;
     21import javax.swing.event.MenuEvent;
     22import javax.swing.event.MenuListener;
    1823
    1924import org.openstreetmap.josm.Main;
     
    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;
     
    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) {
     
    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() {
     
    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);
    84     }
    85 
    86     public void refreshImageryMenu() {
    87         if (menuScroller != null) {
    88             menuScroller.dispose();
    89             menuScroller = null;
    90         }
    91         setupMenuScroller();
     105        MenuScroller.setScrollerFor(this, (screenHeight / menuItemHeight)-1);
     106    }
     107
     108    protected void refreshImageryMenu() {
    92109        removeAll();
    93110
     
    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    }
     
    137190
    138191    public void refreshOffsetMenu() {
    139         JMenuItem newItem = getNewOffsetMenu();
    140         remove(offsetMenuItem);
    141         add(newItem, offsPos);
    142         offsetMenuItem = newItem;
     192        offsetMenuItem = getNewOffsetMenu();
    143193    }
    144194
Note: See TracChangeset for help on using the changeset viewer.