Ticket #1983: ParseClipboardTextOnLoadAndOnPaste.patch

File ParseClipboardTextOnLoadAndOnPaste.patch, 10.6 KB (added by xeen, 17 years ago)

Parses Clipboard for OSM URL when opening the download dialog and when the users pastes the link anywhere. Also moves osmUrl2Bounds into a class of its own

  • src/org/openstreetmap/josm/gui/download/BoundingBoxSelection.java

    diff -u -r -N orig/src/org/openstreetmap/josm/gui/download/BoundingBoxSelection.java trunk/src/org/openstreetmap/josm/gui/download/BoundingBoxSelection.java
    old new  
    2323import org.openstreetmap.josm.data.Bounds;
    2424import org.openstreetmap.josm.data.coor.LatLon;
    2525import org.openstreetmap.josm.tools.GBC;
     26import org.openstreetmap.josm.tools.OsmUrlToBounds;
    2627/**
    2728 * Bounding box selector.
    2829 *
     
    4041            new JTextField(11) };
    4142    final JTextArea osmUrl = new JTextArea();
    4243    final JTextArea showUrl = new JTextArea();
    43     String noteUrl = tr("You can paste an URL here to download the area.");
    4444
    4545    public void addGui(final DownloadDialog gui) {
    4646
    4747        JPanel dlg = new JPanel(new GridBagLayout());
    48         osmUrl.setText(noteUrl);
    4948
    5049        final FocusListener dialogUpdater = new FocusAdapter() {
    5150            @Override public void focusLost(FocusEvent e) {
     
    7978            public void insertUpdate(DocumentEvent e) { dowork(); }
    8079            public void removeUpdate(DocumentEvent e) { dowork(); }
    8180            private void dowork() {
    82                 Bounds b = osmurl2bounds(osmUrl.getText());
     81                Bounds b = OsmUrlToBounds.parse(osmUrl.getText());
    8382                if (b != null) {
    8483                    gui.minlon = b.min.lon();
    8584                    gui.minlat = b.min.lat();
     
    118117        dlg.add(new JLabel(tr("max lon")), GBC.std().insets(10,0,5,0));
    119118        dlg.add(latlon[3], GBC.eol());
    120119
    121         dlg.add(new JLabel(tr("URL from www.openstreetmap.org")), GBC.eol().insets(10,20,5,0));
     120        dlg.add(new JLabel(tr("URL from www.openstreetmap.org (you can paste an URL here to download the area)")), GBC.eol().insets(10,20,5,0));
    122121        dlg.add(osmUrl, GBC.eop().insets(10,0,5,0).fill());
    123122        dlg.add(showUrl, GBC.eop().insets(10,0,5,5));
    124123        showUrl.setEditable(false);
     
    166165        }
    167166        showUrl.setText("http://www.openstreetmap.org/index.html?mlat="+lat+"&mlon="+lon+"&zoom="+zoom);
    168167    }
    169 
    170     public static Bounds osmurl2bounds(String url) {
    171         int i = url.indexOf('?');
    172         if (i == -1)
    173             return null;
    174         String[] args = url.substring(i+1).split("&");
    175         HashMap<String, String> map = new HashMap<String, String>();
    176         for (String arg : args) {
    177             int eq = arg.indexOf('=');
    178             if (eq != -1) {
    179                 map.put(arg.substring(0, eq), arg.substring(eq + 1));
    180             }
    181         }
    182 
    183         Bounds b = null;
    184         try {
    185             if (map.containsKey("bbox")) {
    186                 String bbox[] = map.get("bbox").split(",");
    187                 b = new Bounds(
    188                     new LatLon(Double.parseDouble(bbox[1]), Double.parseDouble(bbox[0])),
    189                     new LatLon(Double.parseDouble(bbox[3]), Double.parseDouble(bbox[2])));
    190 
    191             } else {
    192                 double size = 180.0 / Math.pow(2, Integer.parseInt(map.get("zoom")));
    193                 b = new Bounds(
    194                     new LatLon(parseDouble(map, "lat") - size/2, parseDouble(map, "lon") - size),
    195                     new LatLon(parseDouble(map, "lat") + size/2, parseDouble(map, "lon") + size));
    196             }
    197         } catch (NumberFormatException x) {
    198         } catch (NullPointerException x) {
    199         }
    200         return b;
    201     }
    202 
    203     private static double parseDouble(HashMap<String, String> map, String key) {
    204         if (map.containsKey(key))
    205             return Double.parseDouble(map.get(key));
    206         return Double.parseDouble(map.get("m"+key));
    207     }
    208168}
  • src/org/openstreetmap/josm/gui/download/DownloadDialog.java

    diff -u -r -N orig/src/org/openstreetmap/josm/gui/download/DownloadDialog.java trunk/src/org/openstreetmap/josm/gui/download/DownloadDialog.java
    old new  
    44import static org.openstreetmap.josm.tools.I18n.tr;
    55
    66import java.awt.Color;
     7import java.awt.datatransfer.DataFlavor;
     8import java.awt.datatransfer.Transferable;
     9import java.awt.event.ActionEvent;
     10import java.awt.event.InputEvent;
     11import java.awt.event.KeyEvent;
     12
    713import java.awt.Font;
    814import java.awt.GridBagLayout;
     15import java.awt.Toolkit;
    916import java.util.ArrayList;
    1017import java.util.List;
    1118
     19import javax.swing.AbstractAction;
    1220import javax.swing.JCheckBox;
    1321import javax.swing.JLabel;
    1422import javax.swing.JOptionPane;
    1523import javax.swing.JPanel;
    1624import javax.swing.JTabbedPane;
     25import javax.swing.KeyStroke;
    1726
    1827import org.openstreetmap.josm.Main;
    1928import org.openstreetmap.josm.actions.DownloadAction;
    2029import org.openstreetmap.josm.actions.downloadtasks.DownloadGpsTask;
    2130import org.openstreetmap.josm.actions.downloadtasks.DownloadOsmTask;
     31import org.openstreetmap.josm.data.Bounds;
    2232import org.openstreetmap.josm.gui.MapView;
    2333import org.openstreetmap.josm.plugins.PluginProxy;
    2434import org.openstreetmap.josm.tools.GBC;
     35import org.openstreetmap.josm.tools.OsmUrlToBounds;
     36
     37
     38
     39
     40
    2541
    2642/**
    2743 * Main download dialog.
     
    145161        Font labelFont = sizeCheck.getFont();
    146162        sizeCheck.setFont(labelFont.deriveFont(Font.PLAIN, labelFont.getSize()));
    147163        add(sizeCheck, GBC.eop().insets(0,5,5,10));
     164       
     165        checkClipboardContents();
     166       
     167        getInputMap(WHEN_IN_FOCUSED_WINDOW).put(
     168            KeyStroke.getKeyStroke(KeyEvent.VK_V, InputEvent.CTRL_MASK), "checkClipboardContents");
     169         
     170        getActionMap().put("checkClipboardContents", new AbstractAction() {
     171            public void actionPerformed(ActionEvent e) {
     172                checkClipboardContents();
     173            }
     174        });
    148175    }
    149 
     176   
     177    private void checkClipboardContents() {
     178        String result = "";
     179        Transferable contents = Toolkit.getDefaultToolkit().getSystemClipboard().getContents(null);
     180
     181        if(contents == null || !contents.isDataFlavorSupported(DataFlavor.stringFlavor))
     182            return;
     183       
     184        try {
     185            result = (String)contents.getTransferData(DataFlavor.stringFlavor);
     186        }
     187        catch(Exception ex) {
     188            return;
     189        }
     190       
     191        Bounds b = OsmUrlToBounds.parse(result);
     192        if (b != null) {
     193            minlon = b.min.lon();
     194            minlat = b.min.lat();
     195            maxlon = b.max.lon();
     196            maxlat = b.max.lat();
     197            boundingBoxChanged(null);
     198        }
     199    }
     200   
    150201    private void updateSizeCheck() {
    151202        if ((maxlon-minlon)*(maxlat-minlat) > Main.pref.getDouble("osm-server.max-request-area", 0.25)) {
    152203            sizeCheck.setText(tr("Download area too large; will probably be rejected by server"));
  • src/org/openstreetmap/josm/Main.java

    diff -u -r -N orig/src/org/openstreetmap/josm/Main.java trunk/src/org/openstreetmap/josm/Main.java
    old new  
    4949import org.openstreetmap.josm.gui.MapFrame;
    5050import org.openstreetmap.josm.gui.PleaseWaitDialog;
    5151import org.openstreetmap.josm.gui.SplashScreen;
    52 import org.openstreetmap.josm.gui.download.BoundingBoxSelection;
    5352import org.openstreetmap.josm.gui.download.DownloadDialog.DownloadTask;
    5453import org.openstreetmap.josm.gui.layer.Layer;
    5554import org.openstreetmap.josm.gui.layer.OsmDataLayer;
     
    6059import org.openstreetmap.josm.plugins.PluginInformation;
    6160import org.openstreetmap.josm.plugins.PluginProxy;
    6261import org.openstreetmap.josm.tools.ImageProvider;
     62import org.openstreetmap.josm.tools.OsmUrlToBounds;
    6363import org.openstreetmap.josm.tools.PlatformHook;
    6464import org.openstreetmap.josm.tools.PlatformHookUnixoid;
    6565import org.openstreetmap.josm.tools.PlatformHookWindows;
     
    486486
    487487    private static void downloadFromParamString(final boolean rawGps, String s) {
    488488        if (s.startsWith("http:")) {
    489             final Bounds b = BoundingBoxSelection.osmurl2bounds(s);
     489            final Bounds b = OsmUrlToBounds.parse(s);
    490490            if (b == null)
    491491                JOptionPane.showMessageDialog(Main.parent, tr("Ignoring malformed URL: \"{0}\"", s));
    492492            else {
  • src/org/openstreetmap/josm/tools/OsmUrlToBounds.java

    diff -u -r -N orig/src/org/openstreetmap/josm/tools/OsmUrlToBounds.java trunk/src/org/openstreetmap/josm/tools/OsmUrlToBounds.java
    old new  
     1// License: GPL. Copyright 2007 by Immanuel Scholz and others
     2package org.openstreetmap.josm.tools;
     3
     4import java.util.HashMap;
     5
     6import org.openstreetmap.josm.data.Bounds;
     7import org.openstreetmap.josm.data.coor.LatLon;
     8
     9public class OsmUrlToBounds {
     10    public static Bounds parse(String url) {
     11        int i = url.indexOf('?');
     12        if (i == -1)
     13            return null;
     14        String[] args = url.substring(i+1).split("&");
     15        HashMap<String, String> map = new HashMap<String, String>();
     16        for (String arg : args) {
     17            int eq = arg.indexOf('=');
     18            if (eq != -1) {
     19                map.put(arg.substring(0, eq), arg.substring(eq + 1));
     20            }
     21        }
     22
     23        Bounds b = null;
     24        try {
     25            if (map.containsKey("bbox")) {
     26                String bbox[] = map.get("bbox").split(",");
     27                b = new Bounds(
     28                    new LatLon(Double.parseDouble(bbox[1]), Double.parseDouble(bbox[0])),
     29                    new LatLon(Double.parseDouble(bbox[3]), Double.parseDouble(bbox[2])));
     30
     31            } else {
     32                double size = 180.0 / Math.pow(2, Integer.parseInt(map.get("zoom")));
     33                b = new Bounds(
     34                    new LatLon(parseDouble(map, "lat") - size/2, parseDouble(map, "lon") - size),
     35                    new LatLon(parseDouble(map, "lat") + size/2, parseDouble(map, "lon") + size));
     36            }
     37        } catch (NumberFormatException x) {
     38        } catch (NullPointerException x) {
     39        }
     40        return b;
     41    }
     42   
     43    public static double parseDouble(HashMap<String, String> map, String key) {
     44        if (map.containsKey(key))
     45            return Double.parseDouble(map.get(key));
     46        return Double.parseDouble(map.get("m"+key));
     47    }
     48}