Ticket #1983: ParseClipboardTextOnPaste.patch

File ParseClipboardTextOnPaste.patch, 10.5 KB (added by xeen, 3 years ago)

Against latest source with comments fixed

  • 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; 
     27 
    2628/** 
    2729 * Bounding box selector. 
    2830 * 
     
    4042            new JTextField(11) }; 
    4143    final JTextArea osmUrl = new JTextArea(); 
    4244    final JTextArea showUrl = new JTextArea(); 
    43     String noteUrl = tr("You can paste an URL here to download the area."); 
    4445 
    4546    public void addGui(final DownloadDialog gui) { 
    4647 
    4748        JPanel dlg = new JPanel(new GridBagLayout()); 
    48         osmUrl.setText(noteUrl); 
    4949 
    5050        final FocusListener dialogUpdater = new FocusAdapter() { 
    5151            @Override public void focusLost(FocusEvent e) { 
     
    7979            public void insertUpdate(DocumentEvent e) { dowork(); } 
    8080            public void removeUpdate(DocumentEvent e) { dowork(); } 
    8181            private void dowork() { 
    82                 Bounds b = osmurl2bounds(osmUrl.getText()); 
     82                Bounds b = OsmUrlToBounds.parse(osmUrl.getText()); 
    8383                if (b != null) { 
    8484                    gui.minlon = b.min.lon(); 
    8585                    gui.minlat = b.min.lat(); 
     
    118118        dlg.add(new JLabel(tr("max lon")), GBC.std().insets(10,0,5,0)); 
    119119        dlg.add(latlon[3], GBC.eol()); 
    120120 
    121         dlg.add(new JLabel(tr("URL from www.openstreetmap.org")), GBC.eol().insets(10,20,5,0)); 
     121        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)); 
    122122        dlg.add(osmUrl, GBC.eop().insets(10,0,5,0).fill()); 
    123123        dlg.add(showUrl, GBC.eop().insets(10,0,5,5)); 
    124124        showUrl.setEditable(false); 
     
    172172        lon /= decimals; 
    173173        showUrl.setText("http://www.openstreetmap.org/?lat="+lat+"&lon="+lon+"&zoom="+zoom); 
    174174    } 
    175  
    176     public static Bounds osmurl2bounds(String url) { 
    177         int i = url.indexOf('?'); 
    178         if (i == -1) 
    179             return null; 
    180         String[] args = url.substring(i+1).split("&"); 
    181         HashMap<String, String> map = new HashMap<String, String>(); 
    182         for (String arg : args) { 
    183             int eq = arg.indexOf('='); 
    184             if (eq != -1) { 
    185                 map.put(arg.substring(0, eq), arg.substring(eq + 1)); 
    186             } 
    187         } 
    188  
    189         Bounds b = null; 
    190         try { 
    191             if (map.containsKey("bbox")) { 
    192                 String bbox[] = map.get("bbox").split(","); 
    193                 b = new Bounds( 
    194                     new LatLon(Double.parseDouble(bbox[1]), Double.parseDouble(bbox[0])), 
    195                     new LatLon(Double.parseDouble(bbox[3]), Double.parseDouble(bbox[2]))); 
    196  
    197             } else { 
    198                 double size = 180.0 / Math.pow(2, Integer.parseInt(map.get("zoom"))); 
    199                 b = new Bounds( 
    200                     new LatLon(parseDouble(map, "lat") - size/2, parseDouble(map, "lon") - size), 
    201                     new LatLon(parseDouble(map, "lat") + size/2, parseDouble(map, "lon") + size)); 
    202             } 
    203         } catch (NumberFormatException x) { 
    204         } catch (NullPointerException x) { 
    205         } 
    206         return b; 
    207     } 
    208  
    209     private static double parseDouble(HashMap<String, String> map, String key) { 
    210         if (map.containsKey(key)) 
    211             return Double.parseDouble(map.get(key)); 
    212         return Double.parseDouble(map.get("m"+key)); 
    213     } 
    214175} 
  • 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;  
    712import java.awt.Font; 
    813import java.awt.GridBagLayout; 
     14import java.awt.Toolkit; 
    915import java.util.ArrayList; 
    1016import java.util.List; 
    1117 
     18import javax.swing.AbstractAction; 
    1219import javax.swing.JCheckBox; 
    1320import javax.swing.JLabel; 
    1421import javax.swing.JOptionPane; 
    1522import javax.swing.JPanel; 
    1623import javax.swing.JTabbedPane; 
     24import javax.swing.KeyStroke; 
    1725 
    1826import org.openstreetmap.josm.Main; 
    1927import org.openstreetmap.josm.actions.DownloadAction; 
    2028import org.openstreetmap.josm.actions.downloadtasks.DownloadGpsTask; 
    2129import org.openstreetmap.josm.actions.downloadtasks.DownloadOsmTask; 
     30import org.openstreetmap.josm.data.Bounds; 
    2231import org.openstreetmap.josm.gui.MapView; 
    2332import org.openstreetmap.josm.plugins.PluginProxy; 
    2433import org.openstreetmap.josm.tools.GBC; 
     34import org.openstreetmap.josm.tools.OsmUrlToBounds; 
    2535 
    2636/** 
    2737 * Main download dialog. 
     
    145155        Font labelFont = sizeCheck.getFont(); 
    146156        sizeCheck.setFont(labelFont.deriveFont(Font.PLAIN, labelFont.getSize())); 
    147157        add(sizeCheck, GBC.eop().insets(0,5,5,10)); 
    148     } 
     158         
     159        getInputMap(WHEN_IN_FOCUSED_WINDOW).put(  
     160        KeyStroke.getKeyStroke(KeyEvent.VK_V, InputEvent.CTRL_MASK), "checkClipboardContents");  
     161        
     162        getActionMap().put("checkClipboardContents", new AbstractAction() {  
     163            public void actionPerformed(ActionEvent e) {  
     164                checkClipboardContents();  
     165            }  
     166        });  
     167    } 
     168     
     169    private void checkClipboardContents() {  
     170        String result = "";  
     171        Transferable contents = Toolkit.getDefaultToolkit().getSystemClipboard().getContents(null);  
     172  
     173        if(contents == null || !contents.isDataFlavorSupported(DataFlavor.stringFlavor))  
     174            return;  
     175          
     176        try {  
     177            result = (String)contents.getTransferData(DataFlavor.stringFlavor);  
     178        }  
     179        catch(Exception ex) {  
     180            return;  
     181        }  
     182          
     183        Bounds b = OsmUrlToBounds.parse(result);  
     184        if (b != null) {  
     185            minlon = b.min.lon();  
     186            minlat = b.min.lat();  
     187            maxlon = b.max.lon();  
     188            maxlat = b.max.lat();  
     189            boundingBoxChanged(null);  
     190        }  
     191    }  
    149192 
    150193    private void updateSizeCheck() { 
    151194        if ((maxlon-minlon)*(maxlat-minlat) > Main.pref.getDouble("osm-server.max-request-area", 0.25)) { 
  • 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; 
     
    493493 
    494494    private static void downloadFromParamString(final boolean rawGps, String s) { 
    495495        if (s.startsWith("http:")) { 
    496             final Bounds b = BoundingBoxSelection.osmurl2bounds(s); 
     496            final Bounds b = OsmUrlToBounds.parse(s); 
    497497            if (b == null) 
    498498                JOptionPane.showMessageDialog(Main.parent, tr("Ignoring malformed URL: \"{0}\"", s)); 
    499499            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    private 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}