Index: trunk/src/org/openstreetmap/josm/Main.java
===================================================================
--- trunk/src/org/openstreetmap/josm/Main.java	(revision 1306)
+++ trunk/src/org/openstreetmap/josm/Main.java	(revision 1307)
@@ -50,5 +50,4 @@
 import org.openstreetmap.josm.gui.PleaseWaitDialog;
 import org.openstreetmap.josm.gui.SplashScreen;
-import org.openstreetmap.josm.gui.download.BoundingBoxSelection;
 import org.openstreetmap.josm.gui.download.DownloadDialog.DownloadTask;
 import org.openstreetmap.josm.gui.layer.Layer;
@@ -61,4 +60,5 @@
 import org.openstreetmap.josm.plugins.PluginProxy;
 import org.openstreetmap.josm.tools.ImageProvider;
+import org.openstreetmap.josm.tools.OsmUrlToBounds;
 import org.openstreetmap.josm.tools.PlatformHook;
 import org.openstreetmap.josm.tools.PlatformHookUnixoid;
@@ -494,5 +494,5 @@
     private static void downloadFromParamString(final boolean rawGps, String s) {
         if (s.startsWith("http:")) {
-            final Bounds b = BoundingBoxSelection.osmurl2bounds(s);
+            final Bounds b = OsmUrlToBounds.parse(s);
             if (b == null)
                 JOptionPane.showMessageDialog(Main.parent, tr("Ignoring malformed URL: \"{0}\"", s));
Index: trunk/src/org/openstreetmap/josm/gui/download/BoundingBoxSelection.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/download/BoundingBoxSelection.java	(revision 1306)
+++ trunk/src/org/openstreetmap/josm/gui/download/BoundingBoxSelection.java	(revision 1307)
@@ -24,4 +24,6 @@
 import org.openstreetmap.josm.data.coor.LatLon;
 import org.openstreetmap.josm.tools.GBC;
+import org.openstreetmap.josm.tools.OsmUrlToBounds;
+
 /**
  * Bounding box selector.
@@ -41,10 +43,8 @@
     final JTextArea osmUrl = new JTextArea();
     final JTextArea showUrl = new JTextArea();
-    String noteUrl = tr("You can paste an URL here to download the area.");
 
     public void addGui(final DownloadDialog gui) {
 
         JPanel dlg = new JPanel(new GridBagLayout());
-        osmUrl.setText(noteUrl);
 
         final FocusListener dialogUpdater = new FocusAdapter() {
@@ -80,5 +80,5 @@
             public void removeUpdate(DocumentEvent e) { dowork(); }
             private void dowork() {
-                Bounds b = osmurl2bounds(osmUrl.getText());
+                Bounds b = OsmUrlToBounds.parse(osmUrl.getText());
                 if (b != null) {
                     gui.minlon = b.min.lon();
@@ -119,5 +119,5 @@
         dlg.add(latlon[3], GBC.eol());
 
-        dlg.add(new JLabel(tr("URL from www.openstreetmap.org")), GBC.eol().insets(10,20,5,0));
+        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));
         dlg.add(osmUrl, GBC.eop().insets(10,0,5,0).fill());
         dlg.add(showUrl, GBC.eop().insets(10,0,5,5));
@@ -173,42 +173,3 @@
         showUrl.setText("http://www.openstreetmap.org/?lat="+lat+"&lon="+lon+"&zoom="+zoom);
     }
-
-    public static Bounds osmurl2bounds(String url) {
-        int i = url.indexOf('?');
-        if (i == -1)
-            return null;
-        String[] args = url.substring(i+1).split("&");
-        HashMap<String, String> map = new HashMap<String, String>();
-        for (String arg : args) {
-            int eq = arg.indexOf('=');
-            if (eq != -1) {
-                map.put(arg.substring(0, eq), arg.substring(eq + 1));
-            }
-        }
-
-        Bounds b = null;
-        try {
-            if (map.containsKey("bbox")) {
-                String bbox[] = map.get("bbox").split(",");
-                b = new Bounds(
-                    new LatLon(Double.parseDouble(bbox[1]), Double.parseDouble(bbox[0])),
-                    new LatLon(Double.parseDouble(bbox[3]), Double.parseDouble(bbox[2])));
-
-            } else {
-                double size = 180.0 / Math.pow(2, Integer.parseInt(map.get("zoom")));
-                b = new Bounds(
-                    new LatLon(parseDouble(map, "lat") - size/2, parseDouble(map, "lon") - size),
-                    new LatLon(parseDouble(map, "lat") + size/2, parseDouble(map, "lon") + size));
-            }
-        } catch (NumberFormatException x) {
-        } catch (NullPointerException x) {
-        }
-        return b;
-    }
-
-    private static double parseDouble(HashMap<String, String> map, String key) {
-        if (map.containsKey(key))
-            return Double.parseDouble(map.get(key));
-        return Double.parseDouble(map.get("m"+key));
-    }
 }
Index: trunk/src/org/openstreetmap/josm/gui/download/DownloadDialog.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/download/DownloadDialog.java	(revision 1306)
+++ trunk/src/org/openstreetmap/josm/gui/download/DownloadDialog.java	(revision 1307)
@@ -5,9 +5,16 @@
 
 import java.awt.Color;
+import java.awt.datatransfer.DataFlavor; 
+import java.awt.datatransfer.Transferable; 
+import java.awt.event.ActionEvent; 
+import java.awt.event.InputEvent; 
+import java.awt.event.KeyEvent; 
 import java.awt.Font;
 import java.awt.GridBagLayout;
+import java.awt.Toolkit;
 import java.util.ArrayList;
 import java.util.List;
 
+import javax.swing.AbstractAction;
 import javax.swing.JCheckBox;
 import javax.swing.JLabel;
@@ -15,4 +22,5 @@
 import javax.swing.JPanel;
 import javax.swing.JTabbedPane;
+import javax.swing.KeyStroke;
 
 import org.openstreetmap.josm.Main;
@@ -20,7 +28,9 @@
 import org.openstreetmap.josm.actions.downloadtasks.DownloadGpsTask;
 import org.openstreetmap.josm.actions.downloadtasks.DownloadOsmTask;
+import org.openstreetmap.josm.data.Bounds;
 import org.openstreetmap.josm.gui.MapView;
 import org.openstreetmap.josm.plugins.PluginProxy;
 import org.openstreetmap.josm.tools.GBC;
+import org.openstreetmap.josm.tools.OsmUrlToBounds;
 
 /**
@@ -146,5 +156,38 @@
         sizeCheck.setFont(labelFont.deriveFont(Font.PLAIN, labelFont.getSize()));
         add(sizeCheck, GBC.eop().insets(0,5,5,10));
-    }
+        
+        getInputMap(WHEN_IN_FOCUSED_WINDOW).put( 
+        KeyStroke.getKeyStroke(KeyEvent.VK_V, InputEvent.CTRL_MASK), "checkClipboardContents"); 
+       
+        getActionMap().put("checkClipboardContents", new AbstractAction() { 
+            public void actionPerformed(ActionEvent e) { 
+                checkClipboardContents(); 
+            } 
+        }); 
+    }
+    
+    private void checkClipboardContents() { 
+        String result = ""; 
+        Transferable contents = Toolkit.getDefaultToolkit().getSystemClipboard().getContents(null); 
+ 
+        if(contents == null || !contents.isDataFlavorSupported(DataFlavor.stringFlavor)) 
+            return; 
+         
+        try { 
+            result = (String)contents.getTransferData(DataFlavor.stringFlavor); 
+        } 
+        catch(Exception ex) { 
+            return; 
+        } 
+         
+        Bounds b = OsmUrlToBounds.parse(result); 
+        if (b != null) { 
+            minlon = b.min.lon(); 
+            minlat = b.min.lat(); 
+            maxlon = b.max.lon(); 
+            maxlat = b.max.lat(); 
+            boundingBoxChanged(null); 
+        } 
+    } 
 
     private void updateSizeCheck() {
Index: trunk/src/org/openstreetmap/josm/tools/OsmUrlToBounds.java
===================================================================
--- trunk/src/org/openstreetmap/josm/tools/OsmUrlToBounds.java	(revision 1307)
+++ trunk/src/org/openstreetmap/josm/tools/OsmUrlToBounds.java	(revision 1307)
@@ -0,0 +1,48 @@
+// License: GPL. Copyright 2007 by Immanuel Scholz and others 
+package org.openstreetmap.josm.tools; 
+ 
+import java.util.HashMap; 
+ 
+import org.openstreetmap.josm.data.Bounds; 
+import org.openstreetmap.josm.data.coor.LatLon; 
+ 
+public class OsmUrlToBounds { 
+    public static Bounds parse(String url) { 
+        int i = url.indexOf('?'); 
+        if (i == -1) 
+            return null; 
+        String[] args = url.substring(i+1).split("&"); 
+        HashMap<String, String> map = new HashMap<String, String>(); 
+        for (String arg : args) { 
+            int eq = arg.indexOf('='); 
+            if (eq != -1) { 
+                map.put(arg.substring(0, eq), arg.substring(eq + 1)); 
+            } 
+        } 
+ 
+        Bounds b = null; 
+        try { 
+            if (map.containsKey("bbox")) { 
+                String bbox[] = map.get("bbox").split(","); 
+                b = new Bounds( 
+                    new LatLon(Double.parseDouble(bbox[1]), Double.parseDouble(bbox[0])), 
+                    new LatLon(Double.parseDouble(bbox[3]), Double.parseDouble(bbox[2]))); 
+ 
+            } else { 
+                double size = 180.0 / Math.pow(2, Integer.parseInt(map.get("zoom"))); 
+                b = new Bounds( 
+                    new LatLon(parseDouble(map, "lat") - size/2, parseDouble(map, "lon") - size), 
+                    new LatLon(parseDouble(map, "lat") + size/2, parseDouble(map, "lon") + size)); 
+            } 
+        } catch (NumberFormatException x) { 
+        } catch (NullPointerException x) { 
+        } 
+        return b; 
+    } 
+     
+    private static double parseDouble(HashMap<String, String> map, String key) { 
+        if (map.containsKey(key)) 
+            return Double.parseDouble(map.get(key)); 
+        return Double.parseDouble(map.get("m"+key)); 
+    } 
+}
