001 // License: GPL. For details, see LICENSE file. 002 package org.openstreetmap.josm.actions; 003 004 import static org.openstreetmap.josm.tools.I18n.tr; 005 006 import java.awt.event.ActionEvent; 007 import javax.swing.Action; 008 import javax.swing.ImageIcon; 009 import javax.swing.JOptionPane; 010 import org.openstreetmap.josm.Main; 011 import org.openstreetmap.josm.data.imagery.ImageryInfo; 012 import org.openstreetmap.josm.data.imagery.ImageryInfo.ImageryType; 013 import org.openstreetmap.josm.gui.actionsupport.AlignImageryPanel; 014 import org.openstreetmap.josm.gui.layer.ImageryLayer; 015 import org.openstreetmap.josm.tools.ImageProvider; 016 017 public class AddImageryLayerAction extends JosmAction implements AdaptableAction { 018 019 private static final int MAX_ICON_SIZE = 24; 020 private final ImageryInfo info; 021 022 public AddImageryLayerAction(ImageryInfo info) { 023 super(info.getMenuName(), /* ICON */"imagery_menu", tr("Add imagery layer {0}",info.getName()), null, false, false); 024 putValue("toolbar", "imagery_" + info.getToolbarName()); 025 this.info = info; 026 installAdapters(); 027 028 // change toolbar icon from if specified 029 try { 030 if (info.getIcon() != null) { 031 ImageIcon i = new ImageProvider(info.getIcon()).setOptional(true). 032 setMaxHeight(MAX_ICON_SIZE).setMaxWidth(MAX_ICON_SIZE).get(); 033 if (i != null) { 034 putValue(Action.SMALL_ICON, i); 035 } 036 } 037 } catch (Exception ex) { 038 throw new RuntimeException(ex.getMessage(), ex); 039 } 040 } 041 042 @Override 043 public void actionPerformed(ActionEvent e) { 044 if (!isEnabled()) return; 045 try { 046 Main.main.addLayer(ImageryLayer.create(info)); 047 AlignImageryPanel.addNagPanelIfNeeded(); 048 } catch (IllegalArgumentException ex) { 049 if (ex.getMessage() == null || ex.getMessage().isEmpty()) { 050 throw ex; 051 } else { 052 JOptionPane.showMessageDialog(Main.parent, 053 ex.getMessage(), tr("Error"), 054 JOptionPane.ERROR_MESSAGE); 055 } 056 } 057 } 058 059 protected boolean isLayerAlreadyPresent() { 060 if (Main.isDisplayingMapView()) { 061 for (ImageryLayer layer : Main.map.mapView.getLayersOfType(ImageryLayer.class)) { 062 if (info.equals(layer.getInfo())) { 063 return true; 064 } 065 } 066 } 067 return false; 068 } 069 070 @Override 071 protected void updateEnabledState() { 072 // never enable blacklisted entries. Do not add same imagery layer twice (fix #2519) 073 if (info.isBlacklisted() /*|| isLayerAlreadyPresent()*/) { // FIXME check disabled to allow several instances with different settings (see #7981) 074 setEnabled(false); 075 } else if (info.getImageryType() == ImageryType.TMS || info.getImageryType() == ImageryType.BING || info.getImageryType() == ImageryType.SCANEX) { 076 setEnabled(true); 077 } else if (Main.isDisplayingMapView() && !Main.map.mapView.getAllLayers().isEmpty()) { 078 setEnabled(true); 079 } else { 080 setEnabled(false); 081 } 082 } 083 }