Ignore:
Timestamp:
2016-11-04T09:58:50+01:00 (3 years ago)
Author:
wiktorn
Message:

Move WMTS layer selection out of WMTSLayer constructor and hookUpMapView.

When user declines to choose any WMTSLayer we should just not add the layer at all instead of showing a warning & empty layer content.

This change alignes behaviour of layer between WMTS and WMS_ENDPOINT imagery sources.

This change includes some parts of Work In Progress to unify WMS and WMS_ENDPOINT sources.

Closes: #13868

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/org/openstreetmap/josm/actions/AddImageryLayerAction.java

    r11181 r11216  
    1111import java.io.IOException;
    1212import java.net.MalformedURLException;
     13import java.util.ArrayList;
     14import java.util.Collection;
    1315import java.util.HashSet;
    1416import java.util.List;
     
    2325import org.openstreetmap.josm.data.imagery.ImageryInfo;
    2426import org.openstreetmap.josm.data.imagery.ImageryInfo.ImageryType;
     27import org.openstreetmap.josm.data.imagery.WMTSTileSource;
    2528import org.openstreetmap.josm.gui.ExtendedDialog;
    2629import org.openstreetmap.josm.gui.layer.AlignImageryPanel;
     
    3134import org.openstreetmap.josm.io.imagery.WMSImagery.LayerDetails;
    3235import org.openstreetmap.josm.io.imagery.WMSImagery.WMSGetCapabilitiesException;
     36import org.openstreetmap.josm.tools.CheckParameterUtil;
    3337import org.openstreetmap.josm.tools.GBC;
    3438import org.openstreetmap.josm.tools.ImageProvider;
     
    6468    }
    6569
    66     @Override
    67     public void actionPerformed(ActionEvent e) {
    68         if (!isEnabled()) return;
     70    /**
     71     * Converts general ImageryInfo to specific one, that does not need any user action to initialize
     72     * see: https://josm.openstreetmap.de/ticket/13868
     73     * @param info
     74     * @return
     75     */
     76    private ImageryInfo convertImagery(ImageryInfo info) {
    6977        try {
    70             final ImageryInfo infoToAdd = ImageryType.WMS_ENDPOINT.equals(info.getImageryType())
    71                     ? getWMSLayerInfo() : info;
    72             if (infoToAdd != null) {
    73                 Main.getLayerManager().addLayer(ImageryLayer.create(infoToAdd));
    74                 AlignImageryPanel.addNagPanelIfNeeded(infoToAdd);
     78            switch(info.getImageryType()) {
     79            case WMS_ENDPOINT:
     80                // convert to WMS type
     81                return getWMSLayerInfo();
     82            case WMTS:
     83                // specify which layer to use
     84                String layerId = new WMTSTileSource(info).userSelectLayer();
     85                if (layerId != null) {
     86                    ImageryInfo copy = new ImageryInfo(info);
     87                    Collection<String> defaultLayers = new ArrayList<>(1);
     88                    defaultLayers.add(layerId);
     89                    copy.setDefaultLayers(defaultLayers);
     90                    return copy;
     91                }
     92                // layer not selected - refuse to add
     93                return null;
     94            default:
     95                return info;
    7596            }
    76         } catch (IllegalArgumentException ex) {
    77             if (ex.getMessage() == null || ex.getMessage().isEmpty() || GraphicsEnvironment.isHeadless()) {
    78                 throw ex;
    79             } else {
    80                 JOptionPane.showMessageDialog(Main.parent,
    81                         ex.getMessage(), tr("Error"),
    82                         JOptionPane.ERROR_MESSAGE);
    83             }
    84         }
    85     }
    86 
    87     protected ImageryInfo getWMSLayerInfo() {
    88         try {
    89             assert ImageryType.WMS_ENDPOINT.equals(info.getImageryType());
    90             final WMSImagery wms = new WMSImagery();
    91             wms.attemptGetCapabilities(info.getUrl());
    92 
    93             final WMSLayerTree tree = new WMSLayerTree();
    94             tree.updateTree(wms);
    95             List<String> wmsFormats = wms.getFormats();
    96             final JComboBox<String> formats = new JComboBox<>(wmsFormats.toArray(new String[wmsFormats.size()]));
    97             formats.setSelectedItem(wms.getPreferredFormats());
    98             formats.setToolTipText(tr("Select image format for WMS layer"));
    99 
    100             if (!GraphicsEnvironment.isHeadless()) {
    101                 if (1 != new ExtendedDialog(Main.parent, tr("Select WMS layers"), new String[]{tr("Add layers"), tr("Cancel")}) { {
    102                     final JScrollPane scrollPane = new JScrollPane(tree.getLayerTree());
    103                     scrollPane.setPreferredSize(new Dimension(400, 400));
    104                     final JPanel panel = new JPanel(new GridBagLayout());
    105                     panel.add(scrollPane, GBC.eol().fill());
    106                     panel.add(formats, GBC.eol().fill(GBC.HORIZONTAL));
    107                     setContent(panel);
    108                 } }.showDialog().getValue()) {
    109                     return null;
    110                 }
    111             }
    112 
    113             final String url = wms.buildGetMapUrl(
    114                     tree.getSelectedLayers(), (String) formats.getSelectedItem());
    115             Set<String> supportedCrs = new HashSet<>();
    116             boolean first = true;
    117             StringBuilder layersString = new StringBuilder();
    118             for (LayerDetails layer: tree.getSelectedLayers()) {
    119                 if (first) {
    120                     supportedCrs.addAll(layer.getProjections());
    121                     first = false;
    122                 }
    123                 layersString.append(layer.name);
    124                 layersString.append(", ");
    125                 supportedCrs.retainAll(layer.getProjections());
    126             }
    127 
    128             ImageryInfo ret = new ImageryInfo(info.getName(), url, "wms", info.getEulaAcceptanceRequired(), info.getCookies());
    129             if (layersString.length() > 2) {
    130                 ret.setName(ret.getName() + ' ' + layersString.substring(0, layersString.length() - 2));
    131             }
    132             ret.setServerProjections(supportedCrs);
    133             return ret;
    13497        } catch (MalformedURLException ex) {
    13598            if (!GraphicsEnvironment.isHeadless()) {
     
    155118
    156119    @Override
     120    public void actionPerformed(ActionEvent e) {
     121        if (!isEnabled()) return;
     122        try {
     123            final ImageryInfo infoToAdd = convertImagery(info);
     124            if (infoToAdd != null) {
     125                Main.getLayerManager().addLayer(ImageryLayer.create(infoToAdd));
     126                AlignImageryPanel.addNagPanelIfNeeded(infoToAdd);
     127            }
     128        } catch (IllegalArgumentException ex) {
     129            if (ex.getMessage() == null || ex.getMessage().isEmpty() || GraphicsEnvironment.isHeadless()) {
     130                throw ex;
     131            } else {
     132                JOptionPane.showMessageDialog(Main.parent,
     133                        ex.getMessage(), tr("Error"),
     134                        JOptionPane.ERROR_MESSAGE);
     135            }
     136        }
     137    }
     138
     139    protected ImageryInfo getWMSLayerInfo() throws IOException, WMSGetCapabilitiesException {
     140        CheckParameterUtil.ensureThat(ImageryType.WMS_ENDPOINT.equals(info.getImageryType()), "wms_endpoint imagery type expected");
     141
     142        final WMSImagery wms = new WMSImagery();
     143        wms.attemptGetCapabilities(info.getUrl());
     144
     145        final WMSLayerTree tree = new WMSLayerTree();
     146        tree.updateTree(wms);
     147        List<String> wmsFormats = wms.getFormats();
     148        final JComboBox<String> formats = new JComboBox<>(wmsFormats.toArray(new String[wmsFormats.size()]));
     149        formats.setSelectedItem(wms.getPreferredFormats());
     150        formats.setToolTipText(tr("Select image format for WMS layer"));
     151
     152        if (!GraphicsEnvironment.isHeadless()) {
     153            if (1 != new ExtendedDialog(Main.parent, tr("Select WMS layers"), new String[]{tr("Add layers"), tr("Cancel")}) { {
     154                final JScrollPane scrollPane = new JScrollPane(tree.getLayerTree());
     155                scrollPane.setPreferredSize(new Dimension(400, 400));
     156                final JPanel panel = new JPanel(new GridBagLayout());
     157                panel.add(scrollPane, GBC.eol().fill());
     158                panel.add(formats, GBC.eol().fill(GBC.HORIZONTAL));
     159                setContent(panel);
     160            } }.showDialog().getValue()) {
     161                return null;
     162            }
     163        }
     164
     165        final String url = wms.buildGetMapUrl(
     166                tree.getSelectedLayers(), (String) formats.getSelectedItem());
     167        Set<String> supportedCrs = new HashSet<>();
     168        boolean first = true;
     169        StringBuilder layersString = new StringBuilder();
     170        for (LayerDetails layer: tree.getSelectedLayers()) {
     171            if (first) {
     172                supportedCrs.addAll(layer.getProjections());
     173                first = false;
     174            }
     175            layersString.append(layer.name);
     176            layersString.append(", ");
     177            supportedCrs.retainAll(layer.getProjections());
     178        }
     179
     180        ImageryInfo ret = new ImageryInfo(info.getName(), url, "wms", info.getEulaAcceptanceRequired(), info.getCookies());
     181        if (layersString.length() > 2) {
     182            ret.setName(ret.getName() + ' ' + layersString.substring(0, layersString.length() - 2));
     183        }
     184        ret.setServerProjections(supportedCrs);
     185        return ret;
     186    }
     187
     188    @Override
    157189    protected void updateEnabledState() {
    158190        if (info.isBlacklisted()) {
Note: See TracChangeset for help on using the changeset viewer.