001 // License: GPL. For details, see LICENSE file. 002 package org.openstreetmap.josm.gui; 003 004 import static org.openstreetmap.josm.tools.I18n.tr; 005 import static org.openstreetmap.josm.tools.I18n.trc; 006 007 import java.awt.Component; 008 import java.awt.event.ActionEvent; 009 import java.util.List; 010 011 import javax.swing.Action; 012 import javax.swing.JComponent; 013 import javax.swing.JMenu; 014 import javax.swing.JMenuItem; 015 import javax.swing.JPopupMenu; 016 import javax.swing.MenuElement; 017 018 import org.openstreetmap.josm.Main; 019 import org.openstreetmap.josm.actions.AddImageryLayerAction; 020 import org.openstreetmap.josm.actions.JosmAction; 021 import org.openstreetmap.josm.actions.Map_Rectifier_WMSmenuAction; 022 import org.openstreetmap.josm.data.imagery.ImageryInfo; 023 import org.openstreetmap.josm.data.imagery.ImageryLayerInfo; 024 import org.openstreetmap.josm.gui.layer.ImageryLayer; 025 import org.openstreetmap.josm.gui.layer.Layer; 026 import org.openstreetmap.josm.tools.ImageProvider; 027 028 public class ImageryMenu extends JMenu implements MapView.LayerChangeListener { 029 private Action offsetAction = new JosmAction( 030 tr("Imagery offset"), "mapmode/adjustimg", tr("Adjust imagery offset"), null, false, false) { 031 { 032 putValue("toolbar", "imagery-offset"); 033 Main.toolbar.register(this); 034 } 035 @Override 036 public void actionPerformed(ActionEvent e) { 037 List<ImageryLayer> layers = Main.map.mapView.getLayersOfType(ImageryLayer.class); 038 if (layers.isEmpty()) { 039 setEnabled(false); 040 return; 041 } 042 Component source = null; 043 if (e.getSource() instanceof Component) { 044 source = (Component)e.getSource(); 045 } 046 JPopupMenu popup = new JPopupMenu(); 047 if (layers.size() == 1) { 048 JComponent c = layers.get(0).getOffsetMenuItem(popup); 049 if (c instanceof JMenuItem) { 050 ((JMenuItem) c).getAction().actionPerformed(e); 051 } else { 052 if (source == null) return; 053 popup.show(source, source.getWidth()/2, source.getHeight()/2); 054 } 055 return; 056 } 057 if (source == null) return; 058 for (ImageryLayer layer : layers) { 059 JMenuItem layerMenu = layer.getOffsetMenuItem(); 060 layerMenu.setText(layer.getName()); 061 layerMenu.setIcon(layer.getIcon()); 062 popup.add(layerMenu); 063 } 064 popup.show(source, source.getWidth()/2, source.getHeight()/2); 065 } 066 }; 067 private JMenuItem singleOffset = new JMenuItem(offsetAction); 068 private JMenuItem offsetMenuItem = singleOffset; 069 private Map_Rectifier_WMSmenuAction rectaction = new Map_Rectifier_WMSmenuAction(); 070 private int offsPos; 071 072 public ImageryMenu() { 073 super(tr("Imagery")); 074 MapView.addLayerChangeListener(this); 075 } 076 077 public void refreshImageryMenu() { 078 removeAll(); 079 080 // for each configured ImageryInfo, add a menu entry. 081 for (final ImageryInfo u : ImageryLayerInfo.instance.getLayers()) { 082 add(new AddImageryLayerAction(u)); 083 } 084 addSeparator(); 085 add(new JMenuItem(rectaction)); 086 087 addSeparator(); 088 offsPos = getMenuComponentCount(); 089 add(offsetMenuItem); 090 } 091 092 private JMenuItem getNewOffsetMenu(){ 093 if (Main.map == null || Main.map.mapView == null) { 094 offsetAction.setEnabled(false); 095 return singleOffset; 096 } 097 List<ImageryLayer> layers = Main.map.mapView.getLayersOfType(ImageryLayer.class); 098 if (layers.isEmpty()) { 099 offsetAction.setEnabled(false); 100 return singleOffset; 101 } 102 offsetAction.setEnabled(true); 103 JMenu newMenu = new JMenu(trc("layer","Offset")) { 104 // Hack to prevent ToolbarPreference from tracing this menu 105 // TODO: Modify ToolbarPreference to not to trace such dynamic submenus? 106 @Override 107 public MenuElement[] getSubElements() { 108 return new MenuElement[0]; 109 } 110 }; 111 newMenu.setIcon(ImageProvider.get("mapmode", "adjustimg")); 112 newMenu.setAction(offsetAction); 113 if (layers.size() == 1) 114 return (JMenuItem)layers.get(0).getOffsetMenuItem(newMenu); 115 for (ImageryLayer layer : layers) { 116 JMenuItem layerMenu = layer.getOffsetMenuItem(); 117 layerMenu.setText(layer.getName()); 118 layerMenu.setIcon(layer.getIcon()); 119 newMenu.add(layerMenu); 120 } 121 return newMenu; 122 } 123 124 public void refreshOffsetMenu() { 125 JMenuItem newItem = getNewOffsetMenu(); 126 remove(offsetMenuItem); 127 add(newItem, offsPos); 128 offsetMenuItem = newItem; 129 } 130 131 @Override 132 public void activeLayerChange(Layer oldLayer, Layer newLayer) { 133 } 134 135 @Override 136 public void layerAdded(Layer newLayer) { 137 if (newLayer instanceof ImageryLayer) { 138 refreshOffsetMenu(); 139 } 140 } 141 142 @Override 143 public void layerRemoved(Layer oldLayer) { 144 if (oldLayer instanceof ImageryLayer) { 145 refreshOffsetMenu(); 146 } 147 } 148 }