source: josm/trunk/src/org/openstreetmap/josm/actions/AddImageryLayerAction.java@ 8576

Last change on this file since 8576 was 8576, checked in by wiktorn, 9 years ago

wms_endpoint now forwards information about available projection to ImageryInfo

  • Property svn:eol-style set to native
File size: 7.5 KB
Line 
1// License: GPL. For details, see LICENSE file.
2package org.openstreetmap.josm.actions;
3
4import static org.openstreetmap.josm.gui.help.HelpUtil.ht;
5import static org.openstreetmap.josm.tools.I18n.tr;
6
7import java.awt.Dimension;
8import java.awt.GridBagLayout;
9import java.awt.event.ActionEvent;
10import java.io.IOException;
11import java.net.MalformedURLException;
12import java.util.HashSet;
13import java.util.Set;
14
15import javax.swing.JComboBox;
16import javax.swing.JOptionPane;
17import javax.swing.JPanel;
18import javax.swing.JScrollPane;
19
20import org.openstreetmap.josm.Main;
21import org.openstreetmap.josm.data.imagery.ImageryInfo;
22import org.openstreetmap.josm.data.imagery.ImageryInfo.ImageryType;
23import org.openstreetmap.josm.gui.ExtendedDialog;
24import org.openstreetmap.josm.gui.layer.AlignImageryPanel;
25import org.openstreetmap.josm.gui.layer.ImageryLayer;
26import org.openstreetmap.josm.gui.preferences.imagery.WMSLayerTree;
27import org.openstreetmap.josm.gui.util.GuiHelper;
28import org.openstreetmap.josm.io.imagery.WMSImagery;
29import org.openstreetmap.josm.io.imagery.WMSImagery.LayerDetails;
30import org.openstreetmap.josm.tools.GBC;
31import org.openstreetmap.josm.tools.ImageProvider;
32import org.openstreetmap.josm.tools.ImageProvider.ImageResourceCallback;
33import org.openstreetmap.josm.tools.ImageResource;
34
35/**
36 * Action displayed in imagery menu to add a new imagery layer.
37 * @since 3715
38 */
39public class AddImageryLayerAction extends JosmAction implements AdaptableAction {
40 private final transient ImageryInfo info;
41
42 /**
43 * Constructs a new {@code AddImageryLayerAction} for the given {@code ImageryInfo}.
44 * If an http:// icon is specified, it is fetched asynchronously.
45 * @param info The imagery info
46 */
47 public AddImageryLayerAction(ImageryInfo info) {
48 super(info.getMenuName(), /* ICON */"imagery_menu", tr("Add imagery layer {0}", info.getName()), null, false, false);
49 putValue("toolbar", "imagery_" + info.getToolbarName());
50 putValue("help", ht("/Preferences/Imagery"));
51 this.info = info;
52 installAdapters();
53
54 // change toolbar icon from if specified
55 try {
56 String icon = info.getIcon();
57 if (icon != null) {
58 new ImageProvider(icon).setOptional(true).getInBackground(new ImageResourceCallback() {
59 @Override
60 public void finished(final ImageResource result) {
61 if (result != null) {
62 GuiHelper.runInEDT(new Runnable() {
63 @Override
64 public void run() {
65 result.getImageIcon(AddImageryLayerAction.this);
66 }
67 });
68 }
69 }
70 });
71 }
72 } catch (Exception ex) {
73 throw new RuntimeException(ex.getMessage(), ex);
74 }
75 }
76
77 @Override
78 public void actionPerformed(ActionEvent e) {
79 if (!isEnabled()) return;
80 try {
81 final ImageryInfo infoToAdd = ImageryType.WMS_ENDPOINT.equals(info.getImageryType())
82 ? getWMSLayerInfo() : info;
83 if (infoToAdd != null) {
84 Main.main.addLayer(ImageryLayer.create(infoToAdd));
85 AlignImageryPanel.addNagPanelIfNeeded();
86 }
87 } catch (IllegalArgumentException ex) {
88 if (ex.getMessage() == null || ex.getMessage().isEmpty()) {
89 throw ex;
90 } else {
91 JOptionPane.showMessageDialog(Main.parent,
92 ex.getMessage(), tr("Error"),
93 JOptionPane.ERROR_MESSAGE);
94 }
95 }
96 }
97
98 protected ImageryInfo getWMSLayerInfo() {
99 try {
100 assert ImageryType.WMS_ENDPOINT.equals(info.getImageryType());
101 final WMSImagery wms = new WMSImagery();
102 wms.attemptGetCapabilities(info.getUrl());
103
104 final WMSLayerTree tree = new WMSLayerTree();
105 tree.updateTree(wms);
106 final JComboBox<String> formats = new JComboBox<>(wms.getFormats().toArray(new String[0]));
107 formats.setSelectedItem(wms.getPreferredFormats());
108 formats.setToolTipText(tr("Select image format for WMS layer"));
109
110 if (1 != new ExtendedDialog(Main.parent, tr("Select WMS layers"), new String[]{tr("Add layers"), tr("Cancel")}) { {
111 final JScrollPane scrollPane = new JScrollPane(tree.getLayerTree());
112 scrollPane.setPreferredSize(new Dimension(400, 400));
113 final JPanel panel = new JPanel(new GridBagLayout());
114 panel.add(scrollPane, GBC.eol().fill());
115 panel.add(formats, GBC.eol().fill(GBC.HORIZONTAL));
116 setContent(panel);
117 } }.showDialog().getValue()) {
118 return null;
119 }
120
121 final String url = wms.buildGetMapUrl(
122 tree.getSelectedLayers(), (String) formats.getSelectedItem());
123 Set<String> supportedCrs = new HashSet<>();
124 {
125 boolean first = true;
126 for(LayerDetails layer: tree.getSelectedLayers()) {
127 if (first) {
128 supportedCrs.addAll(layer.getProjections());
129 first = false;
130 }
131 supportedCrs.retainAll(layer.getProjections());
132 }
133 }
134 ImageryInfo ret = new ImageryInfo(info.getName(), url, "wms", info.getEulaAcceptanceRequired(), info.getCookies());
135 ret.setServerProjections(supportedCrs);
136 return ret;
137 } catch (MalformedURLException ex) {
138 JOptionPane.showMessageDialog(Main.parent, tr("Invalid service URL."),
139 tr("WMS Error"), JOptionPane.ERROR_MESSAGE);
140 } catch (IOException ex) {
141 JOptionPane.showMessageDialog(Main.parent, tr("Could not retrieve WMS layer list."),
142 tr("WMS Error"), JOptionPane.ERROR_MESSAGE);
143 } catch (WMSImagery.WMSGetCapabilitiesException ex) {
144 JOptionPane.showMessageDialog(Main.parent, tr("Could not parse WMS layer list."),
145 tr("WMS Error"), JOptionPane.ERROR_MESSAGE);
146 Main.error("Could not parse WMS layer list. Incoming data:\n"+ex.getIncomingData());
147 }
148 return null;
149 }
150
151 protected boolean isLayerAlreadyPresent() {
152 if (Main.isDisplayingMapView()) {
153 for (ImageryLayer layer : Main.map.mapView.getLayersOfType(ImageryLayer.class)) {
154 if (info.equals(layer.getInfo())) {
155 return true;
156 }
157 }
158 }
159 return false;
160 }
161
162 @Override
163 protected void updateEnabledState() {
164 ImageryType type = info.getImageryType();
165 // never enable blacklisted entries. Do not add same imagery layer twice (fix #2519)
166 if (info.isBlacklisted() /*|| isLayerAlreadyPresent()*/) {
167 // FIXME check disabled to allow several instances with different settings (see #7981)
168 setEnabled(false);
169 } else if (type == ImageryType.TMS || type == ImageryType.BING || type == ImageryType.SCANEX) {
170 setEnabled(true);
171 } else if (Main.isDisplayingMapView() && !Main.map.mapView.getAllLayers().isEmpty()) {
172 setEnabled(true);
173 } else {
174 setEnabled(false);
175 }
176 }
177}
Note: See TracBrowser for help on using the repository browser.