source: josm/trunk/src/org/openstreetmap/josm/gui/preferences/imagery/AddWMSLayerPanel.java@ 10634

Last change on this file since 10634 was 10634, checked in by Don-vip, 8 years ago

sonar - pmd:UselessQualifiedThis - Useless qualified this usage in the same class

  • Property svn:eol-style set to native
File size: 6.9 KB
Line 
1// License: GPL. For details, see LICENSE file.
2package org.openstreetmap.josm.gui.preferences.imagery;
3
4import static org.openstreetmap.josm.tools.I18n.tr;
5
6import java.io.IOException;
7import java.net.MalformedURLException;
8import java.net.URL;
9
10import javax.swing.DefaultComboBoxModel;
11import javax.swing.JButton;
12import javax.swing.JCheckBox;
13import javax.swing.JComboBox;
14import javax.swing.JLabel;
15import javax.swing.JOptionPane;
16import javax.swing.JScrollPane;
17
18import org.openstreetmap.josm.Main;
19import org.openstreetmap.josm.data.imagery.ImageryInfo;
20import org.openstreetmap.josm.gui.bbox.SlippyMapBBoxChooser;
21import org.openstreetmap.josm.gui.util.GuiHelper;
22import org.openstreetmap.josm.gui.widgets.JosmTextArea;
23import org.openstreetmap.josm.io.imagery.WMSImagery;
24import org.openstreetmap.josm.tools.GBC;
25import org.openstreetmap.josm.tools.Utils;
26
27/**
28 * An imagery panel used to add WMS imagery sources.
29 * @since 2599
30 */
31public class AddWMSLayerPanel extends AddImageryPanel {
32
33 private final transient WMSImagery wms = new WMSImagery();
34 private final JCheckBox endpoint = new JCheckBox(tr("Store WMS endpoint only, select layers at usage"));
35 private final transient WMSLayerTree tree = new WMSLayerTree();
36 private final JComboBox<String> formats = new JComboBox<>();
37 private final JLabel wmsInstruction;
38 private final JosmTextArea wmsUrl = new JosmTextArea(3, 40);
39 private final JButton showBounds = new JButton(tr("Show bounds"));
40
41 /**
42 * Constructs a new {@code AddWMSLayerPanel}.
43 */
44 public AddWMSLayerPanel() {
45
46 add(new JLabel(tr("1. Enter service URL")), GBC.eol());
47 add(rawUrl, GBC.eol().fill());
48 rawUrl.setLineWrap(true);
49 JButton getLayers = new JButton(tr("Get layers"));
50 add(getLayers, GBC.eop().fill());
51
52 add(new JLabel(tr("2. Select layers")), GBC.eol());
53 add(endpoint, GBC.eol().fill());
54 add(new JScrollPane(tree.getLayerTree()), GBC.eol().fill().weight(1, 100));
55
56 showBounds.setEnabled(false);
57 add(showBounds, GBC.eop().fill());
58
59 add(new JLabel(tr("3. Select image format")), GBC.eol());
60 add(formats, GBC.eol().fill());
61
62 wmsInstruction = new JLabel(tr("4. Verify generated WMS URL"));
63 add(wmsInstruction, GBC.eol());
64 wmsInstruction.setLabelFor(wmsUrl);
65 add(wmsUrl, GBC.eop().fill());
66 wmsUrl.setLineWrap(true);
67
68 add(new JLabel(tr("5. Enter name for this layer")), GBC.eol());
69 add(name, GBC.eop().fill());
70
71 getLayers.addActionListener(e -> {
72 try {
73 wms.attemptGetCapabilities(rawUrl.getText());
74 tree.updateTree(wms);
75 formats.setModel(new DefaultComboBoxModel<>(wms.getFormats().toArray(new String[0])));
76 formats.setSelectedItem(wms.getPreferredFormats());
77 } catch (MalformedURLException ex1) {
78 Main.error(ex1, false);
79 JOptionPane.showMessageDialog(getParent(), tr("Invalid service URL."),
80 tr("WMS Error"), JOptionPane.ERROR_MESSAGE);
81 } catch (IOException ex2) {
82 Main.error(ex2, false);
83 JOptionPane.showMessageDialog(getParent(), tr("Could not retrieve WMS layer list."),
84 tr("WMS Error"), JOptionPane.ERROR_MESSAGE);
85 } catch (WMSImagery.WMSGetCapabilitiesException ex3) {
86 String incomingData = ex3.getIncomingData().trim();
87 String title = tr("WMS Error");
88 String message = tr("Could not parse WMS layer list.");
89 Main.error(ex3, "Could not parse WMS layer list. Incoming data:\n"+incomingData);
90 if ((incomingData.startsWith("<html>") || incomingData.startsWith("<HTML>"))
91 && (incomingData.endsWith("</html>") || incomingData.endsWith("</HTML>"))) {
92 GuiHelper.notifyUserHtmlError(this, title, message, incomingData);
93 } else {
94 if (ex3.getMessage() != null) {
95 message += '\n' + ex3.getMessage();
96 }
97 JOptionPane.showMessageDialog(getParent(), message, title, JOptionPane.ERROR_MESSAGE);
98 }
99 }
100 });
101
102 endpoint.addItemListener(e -> {
103 tree.getLayerTree().setEnabled(!endpoint.isSelected());
104 showBounds.setEnabled(!endpoint.isSelected());
105 wmsInstruction.setEnabled(!endpoint.isSelected());
106 formats.setEnabled(!endpoint.isSelected());
107 wmsUrl.setEnabled(!endpoint.isSelected());
108 if (endpoint.isSelected()) {
109 URL url = wms.getServiceUrl();
110 if (url != null) {
111 name.setText(url.getHost());
112 }
113 } else {
114 onLayerSelectionChanged();
115 }
116 });
117
118 tree.getLayerTree().addPropertyChangeListener("selectedLayers", evt -> onLayerSelectionChanged());
119
120 formats.addActionListener(e -> onLayerSelectionChanged());
121
122 showBounds.addActionListener(e -> {
123 if (tree.getSelectedLayers().get(0).bounds != null) {
124 SlippyMapBBoxChooser mapPanel = new SlippyMapBBoxChooser();
125 mapPanel.setBoundingBox(tree.getSelectedLayers().get(0).bounds);
126 JOptionPane.showMessageDialog(null, mapPanel, tr("Show Bounds"), JOptionPane.PLAIN_MESSAGE);
127 } else {
128 JOptionPane.showMessageDialog(null, tr("No bounding box was found for this layer."),
129 tr("WMS Error"), JOptionPane.ERROR_MESSAGE);
130 }
131 });
132
133 registerValidableComponent(endpoint);
134 registerValidableComponent(rawUrl);
135 registerValidableComponent(wmsUrl);
136 }
137
138 protected final void onLayerSelectionChanged() {
139 if (wms.getServiceUrl() != null) {
140 wmsUrl.setText(wms.buildGetMapUrl(tree.getSelectedLayers(), (String) formats.getSelectedItem()));
141 name.setText(wms.getServiceUrl().getHost() + ": " + Utils.join(", ", tree.getSelectedLayers()));
142 }
143 showBounds.setEnabled(tree.getSelectedLayers().size() == 1);
144 }
145
146 @Override
147 public ImageryInfo getImageryInfo() {
148 final ImageryInfo info;
149 if (endpoint.isSelected()) {
150 info = new ImageryInfo(getImageryName(), getImageryRawUrl());
151 info.setImageryType(ImageryInfo.ImageryType.WMS_ENDPOINT);
152 } else {
153 info = wms.toImageryInfo(getImageryName(), tree.getSelectedLayers());
154 info.setUrl(getWmsUrl());
155 }
156 return info;
157 }
158
159 protected final String getWmsUrl() {
160 return sanitize(wmsUrl.getText(), ImageryInfo.ImageryType.WMS);
161 }
162
163 @Override
164 protected boolean isImageryValid() {
165 if (getImageryName().isEmpty()) {
166 return false;
167 }
168 if (endpoint.isSelected()) {
169 return !getImageryRawUrl().isEmpty();
170 } else {
171 return !getWmsUrl().isEmpty();
172 }
173 }
174}
Note: See TracBrowser for help on using the repository browser.