Ticket #1983: ParseClipboardTextOnLoadAndOnPaste.patch

File ParseClipboardTextOnLoadAndOnPaste.patch, 10.6 KB (added by xeen, 3 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}