Changeset 11279 in josm


Ignore:
Timestamp:
2016-11-18T11:57:20+01:00 (6 months ago)
Author:
michael2402
Message:

Make paste (Ctrl+V) support all urls that are supported by OpenLocationAction.

Location:
trunk/src/org/openstreetmap/josm
Files:
2 edited

Legend:

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

    r10630 r11279  
    55import static org.openstreetmap.josm.tools.I18n.tr;
    66
    7 import java.awt.GridBagConstraints;
    87import java.awt.GridBagLayout;
    98import java.awt.GridLayout;
     
    1514import java.util.LinkedList;
    1615import java.util.List;
     16import java.util.Objects;
    1717import java.util.concurrent.Future;
     18import java.util.stream.Collectors;
    1819
    1920import javax.swing.JCheckBox;
     
    3839import org.openstreetmap.josm.actions.downloadtasks.DownloadTask;
    3940import org.openstreetmap.josm.actions.downloadtasks.PostDownloadHandler;
     41import org.openstreetmap.josm.data.preferences.BooleanProperty;
    4042import org.openstreetmap.josm.gui.ExtendedDialog;
    4143import org.openstreetmap.josm.gui.HelpAwareOptionPane;
    4244import org.openstreetmap.josm.gui.progress.PleaseWaitProgressMonitor;
    4345import org.openstreetmap.josm.gui.widgets.HistoryComboBox;
     46import org.openstreetmap.josm.tools.GBC;
    4447import org.openstreetmap.josm.tools.Shortcut;
    4548import org.openstreetmap.josm.tools.Utils;
     
    5154 */
    5255public class OpenLocationAction extends JosmAction {
    53 
     56    /**
     57     * true if the URL needs to be opened in a new layer, false otherwise
     58     */
     59    private static final BooleanProperty USE_NEW_LAYER = new BooleanProperty("download.newlayer", true);
    5460    protected final transient List<Class<? extends DownloadTask>> downloadTasks;
    5561
     
    103109    @Override
    104110    public void actionPerformed(ActionEvent e) {
    105 
    106         JCheckBox layer = new JCheckBox(tr("Separate Layer"));
    107         layer.setToolTipText(tr("Select if the data should be downloaded into a new layer"));
    108         layer.setSelected(Main.pref.getBoolean("download.newlayer"));
    109111        JPanel all = new JPanel(new GridBagLayout());
    110         GridBagConstraints gc = new GridBagConstraints();
    111         gc.fill = GridBagConstraints.HORIZONTAL;
    112         gc.weightx = 1.0;
    113         gc.anchor = GridBagConstraints.FIRST_LINE_START;
    114         all.add(new JLabel(tr("Enter URL to download:")), gc);
     112
     113        // download URL selection
     114        all.add(new JLabel(tr("Enter URL to download:")), GBC.eol());
    115115        HistoryComboBox uploadAddresses = new HistoryComboBox();
    116116        uploadAddresses.setToolTipText(tr("Enter an URL from where data should be downloaded"));
    117117        restoreUploadAddressHistory(uploadAddresses);
    118         gc.gridy = 1;
    119         all.add(uploadAddresses, gc);
    120         gc.gridy = 2;
    121         gc.fill = GridBagConstraints.BOTH;
    122         gc.weighty = 1.0;
    123         all.add(layer, gc);
     118        all.add(uploadAddresses, GBC.eop().fill(GBC.BOTH));
     119
     120        // use separate layer
     121        JCheckBox layer = new JCheckBox(tr("Separate Layer"));
     122        layer.setToolTipText(tr("Select if the data should be downloaded into a new layer"));
     123        layer.setSelected(USE_NEW_LAYER.get());
     124        all.add(layer, GBC.eop().fill(GBC.BOTH));
     125
    124126        ExtendedDialog dialog = new ExtendedDialog(Main.parent,
    125127                tr("Download Location"),
     
    134136        dialog.configureContextsensitiveHelp("/Action/OpenLocation", true /* show help button */);
    135137        dialog.showDialog();
    136         if (dialog.getValue() != 1) return;
    137         remindUploadAddressHistory(uploadAddresses);
    138         openUrl(layer.isSelected(), Utils.strip(uploadAddresses.getText()));
     138        if (dialog.getValue() == 1) {
     139            USE_NEW_LAYER.put(layer.isSelected());
     140            remindUploadAddressHistory(uploadAddresses);
     141            openUrl(Utils.strip(uploadAddresses.getText()));
     142        }
    139143    }
    140144
     
    147151     */
    148152    public Collection<DownloadTask> findDownloadTasks(final String url, boolean isRemotecontrol) {
    149         List<DownloadTask> result = new ArrayList<>();
    150         for (Class<? extends DownloadTask> taskClass : downloadTasks) {
    151             if (taskClass != null) {
    152                 try {
    153                     DownloadTask task = taskClass.getConstructor().newInstance();
    154                     if (task.acceptsUrl(url, isRemotecontrol)) {
    155                         result.add(task);
     153        return downloadTasks.stream()
     154                .filter(Objects::nonNull)
     155                .map(taskClass -> {
     156                    try {
     157                        return taskClass.getConstructor().newInstance();
     158                    } catch (ReflectiveOperationException e) {
     159                        Main.error(e);
     160                        return null;
    156161                    }
    157                 } catch (ReflectiveOperationException e) {
    158                     Main.error(e);
    159                 }
    160             }
    161         }
    162         return result;
     162                })
     163                .filter(Objects::nonNull)
     164                .filter(task -> task.acceptsUrl(url, isRemotecontrol))
     165                .collect(Collectors.toList());
    163166    }
    164167
     
    189192     * @param url The URL to open
    190193     */
    191     public void openUrl(boolean newLayer, final String url) {
     194    public void openUrl(boolean newLayer, String url) {
     195        realOpenUrl(newLayer, url);
     196    }
     197
     198    /**
     199     * Open the given URL. This class checks the {@link #USE_NEW_LAYER} preference to check if a new layer should be used.
     200     * @param url The URL to open
     201     * @return <code>true</code> if loading the task was started successfully.
     202     */
     203    public boolean openUrl(String url) {
     204        return realOpenUrl(USE_NEW_LAYER.get(), url);
     205    }
     206
     207    private boolean realOpenUrl(boolean newLayer, String url) {
    192208        Collection<DownloadTask> tasks = findDownloadTasks(url, false);
    193209
     
    196212        } else if (tasks.isEmpty()) {
    197213            warnNoSuitableTasks(url);
    198             return;
     214            return false;
    199215        }
    200216
     
    205221                Future<?> future = task.loadUrl(newLayer, url, monitor);
    206222                Main.worker.submit(new PostDownloadHandler(task, future));
     223                return true;
    207224            } catch (IllegalArgumentException e) {
    208225                Main.error(e);
    209226            }
    210227        }
     228        return false;
    211229    }
    212230
     
    235253     * @param url the given url
    236254     */
    237     void warnNoSuitableTasks(final String url) {
     255    protected void warnNoSuitableTasks(final String url) {
    238256        final String details = findSummaryDocumentation();    // Explain what patterns are supported
    239257        HelpAwareOptionPane.showMessageDialogInEDT(Main.parent, "<html><p>" + tr(
  • trunk/src/org/openstreetmap/josm/gui/datatransfer/importers/OsmLinkPaster.java

    r10881 r11279  
    66import java.awt.datatransfer.UnsupportedFlavorException;
    77import java.io.IOException;
    8 import java.util.Collections;
    9 import java.util.List;
    108import java.util.regex.Matcher;
    119import java.util.regex.Pattern;
     
    1311import javax.swing.TransferHandler.TransferSupport;
    1412
    15 import org.openstreetmap.josm.Main;
     13import org.openstreetmap.josm.actions.OpenLocationAction;
    1614import org.openstreetmap.josm.data.coor.EastNorth;
    1715import org.openstreetmap.josm.data.coor.LatLon;
    18 import org.openstreetmap.josm.data.osm.OsmPrimitiveType;
    19 import org.openstreetmap.josm.data.osm.PrimitiveId;
    20 import org.openstreetmap.josm.data.osm.SimplePrimitiveId;
    2116import org.openstreetmap.josm.data.preferences.BooleanProperty;
    2217import org.openstreetmap.josm.gui.MapView;
    23 import org.openstreetmap.josm.gui.io.DownloadPrimitivesWithReferrersTask;
    2418import org.openstreetmap.josm.gui.layer.OsmDataLayer;
    2519
     
    5246
    5347        String transferData = (String) support.getTransferable().getTransferData(df);
    54         List<PrimitiveId> ids = parseIds(transferData);
    55 
    56         if (!ids.isEmpty()) {
    57             Main.worker.submit(new DownloadPrimitivesWithReferrersTask(layer == null,
    58                     ids, PASTE_REFERRERS.get(), PASTE_REFERRERS.get(), null, null));
     48        OpenLocationAction action = new OpenLocationAction() {
     49            @Override
     50            protected void warnNoSuitableTasks(String url) {
     51                // ignore this.
     52            }
     53        };
     54        if (action.openUrl(transferData)) {
    5955            return true;
    6056        }
     
    8278        }
    8379    }
    84 
    85     static List<PrimitiveId> parseIds(String transferData) {
    86         Matcher matcher = Pattern
    87                 .compile(OSM_SERVER + "(?<type>node|way|relation)/(?<id>\\d+)(\\/.*)?$")
    88                 .matcher(transferData);
    89 
    90         if (!matcher.matches()) {
    91             return Collections.emptyList();
    92         }
    93 
    94         OsmPrimitiveType type;
    95         switch (matcher.group("type")) {
    96         case "way":
    97             type = OsmPrimitiveType.WAY;
    98             break;
    99 
    100         case "node":
    101             type = OsmPrimitiveType.NODE;
    102             break;
    103 
    104         case "relation":
    105             type = OsmPrimitiveType.RELATION;
    106             break;
    107 
    108         default:
    109             throw new AssertionError();
    110         }
    111 
    112         return Collections.singletonList(new SimplePrimitiveId(Long.parseLong(matcher.group("id")), type));
    113     }
    11480}
Note: See TracChangeset for help on using the changeset viewer.