Index: /trunk/src/org/openstreetmap/josm/actions/DownloadAction.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/DownloadAction.java	(revision 2330)
+++ /trunk/src/org/openstreetmap/josm/actions/DownloadAction.java	(revision 2331)
@@ -35,8 +35,5 @@
 public class DownloadAction extends JosmAction {
     private static final Logger logger = Logger.getLogger(DownloadAction.class.getName());
-    
-    private DownloadDialog dialog;
-    private ExtendedDialog downloadDialog;
-
+ 
     public DownloadAction() {
         super(tr("Download from OSM..."), "download", tr("Download map data from the OSM server."),
@@ -45,63 +42,21 @@
     }
 
-    /**
-     * Creates the download dialog
-     * 
-     * @return the downlaod dialog
-     */
-    protected ExtendedDialog createDownloadDialog() {
-        if (dialog == null) 
-            dialog = new DownloadDialog();
-        dialog.restoreSettings();
-
-        final String prefName = dialog.getClass().getName()+ ".geometry";
-        final WindowGeometry wg = WindowGeometry.centerInWindow(Main.parent,
-                new Dimension(1000,600));
-
-        if (downloadDialog == null) {
-            JPanel downPanel = new JPanel(new BorderLayout());
-            downPanel.add(dialog, BorderLayout.CENTER);
-            downloadDialog= new ExtendedDialog(Main.parent,
-                tr("Download"),
-                new String[] {tr("OK"), tr("Cancel")});
-            downloadDialog.setContent(downPanel, false /* don't use a scroll pane inside the dialog */);
-            downloadDialog.setButtonIcons(new String[] {"ok", "cancel"});
-            downloadDialog.setRememberWindowGeometry(prefName, wg);
-        }
-        return downloadDialog;
-    }
-
     public void actionPerformed(ActionEvent e) {
-        ExtendedDialog dlg = createDownloadDialog();
-        boolean finish = false;
-        while (!finish) {            
-            dlg.showDialog();
-            if (dlg.getValue() == 1 /* OK */) {
-                dialog.rememberSettings();
-                Bounds area = dialog.getSelectedDownloadArea();                
-                if (dialog.isDownloadOsmData()) {
-                    DownloadOsmTask task = new DownloadOsmTask();
-                    Future<?> future = task.download(dialog.isNewLayerRequired(), area, null);
-                    Main.worker.submit(new PostDownloadHandler(task, future));
-                    finish = true;
-                }
-                if (dialog.isDownloadGpxData()) {
-                    DownloadGpsTask task = new DownloadGpsTask();
-                    Future<?> future = task.download(dialog.isNewLayerRequired(),area, null);
-                    Main.worker.submit(new PostDownloadHandler(task, future));
-                    finish = true;
-                }
-            } else {
-                finish = true;
+        DownloadDialog dialog = DownloadDialog.getInstance();
+        dialog.setVisible(true);
+        if (! dialog.isCanceled()) {
+            dialog.rememberSettings();
+            Bounds area = dialog.getSelectedDownloadArea();                
+            if (dialog.isDownloadOsmData()) {
+                DownloadOsmTask task = new DownloadOsmTask();
+                Future<?> future = task.download(dialog.isNewLayerRequired(), area, null);
+                Main.worker.submit(new PostDownloadHandler(task, future));
             }
-            if (!finish) {
-                JOptionPane.showMessageDialog(
-                        Main.parent,
-                        tr("Please select at least one task to download"),
-                        tr("Error"),
-                        JOptionPane.ERROR_MESSAGE
-                );
+            if (dialog.isDownloadGpxData()) {
+                DownloadGpsTask task = new DownloadGpsTask();
+                Future<?> future = task.download(dialog.isNewLayerRequired(),area, null);
+                Main.worker.submit(new PostDownloadHandler(task, future));
             }
-        }
-    }
+        } 
+    }    
 }
Index: /trunk/src/org/openstreetmap/josm/gui/download/DownloadDialog.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/download/DownloadDialog.java	(revision 2330)
+++ /trunk/src/org/openstreetmap/josm/gui/download/DownloadDialog.java	(revision 2331)
@@ -4,5 +4,9 @@
 import static org.openstreetmap.josm.tools.I18n.tr;
 
+import java.awt.BorderLayout;
 import java.awt.Color;
+import java.awt.Component;
+import java.awt.Dimension;
+import java.awt.FlowLayout;
 import java.awt.Font;
 import java.awt.GridBagLayout;
@@ -13,4 +17,6 @@
 import java.awt.event.InputEvent;
 import java.awt.event.KeyEvent;
+import java.awt.event.WindowAdapter;
+import java.awt.event.WindowEvent;
 import java.util.ArrayList;
 import java.util.List;
@@ -19,5 +25,8 @@
 import javax.swing.AbstractAction;
 import javax.swing.JCheckBox;
+import javax.swing.JComponent;
+import javax.swing.JDialog;
 import javax.swing.JLabel;
+import javax.swing.JOptionPane;
 import javax.swing.JPanel;
 import javax.swing.JTabbedPane;
@@ -27,39 +36,53 @@
 import org.openstreetmap.josm.data.Bounds;
 import org.openstreetmap.josm.gui.MapView;
+import org.openstreetmap.josm.gui.SideButton;
+import org.openstreetmap.josm.gui.help.ContextSensitiveHelpAction;
+import org.openstreetmap.josm.gui.help.HelpUtil;
 import org.openstreetmap.josm.plugins.PluginHandler;
 import org.openstreetmap.josm.tools.GBC;
+import org.openstreetmap.josm.tools.ImageProvider;
 import org.openstreetmap.josm.tools.OsmUrlToBounds;
+import org.openstreetmap.josm.tools.WindowGeometry;
+import static org.openstreetmap.josm.gui.help.HelpUtil.ht;
 
 /**
- * Main download dialog.
- *
- * Can be extended by plugins in two ways:
- * (1) by adding download tasks that are then called with the selected bounding box
- * (2) by adding "DownloadSelection" objects that implement different ways of selecting a bounding box
- *
- * @author Frederik Ramm <frederik@remote.org>
- *
+ * 
  */
-public class DownloadDialog extends JPanel {
+public class DownloadDialog extends JDialog  {
     static private final Logger logger = Logger.getLogger(DownloadDialog.class.getName());
+    
+    /** the unique instance of the download dialog */
+    static private DownloadDialog instance;
+    
+    /**
+     * Replies the unique instance of the download dialog
+     * 
+     * @return the unique instance of the download dialog
+     */
+    static public DownloadDialog getInstance() {
+        if (instance == null)
+            instance = new DownloadDialog(Main.parent);
+        return instance;
+    }    
 
     private final List<DownloadSelection> downloadSelections = new ArrayList<DownloadSelection>();
     private final JTabbedPane tpDownloadAreaSelectors = new JTabbedPane();
-    private final JCheckBox cbNewLayer;
+    private JCheckBox cbNewLayer;
     private final JLabel sizeCheck = new JLabel();
-
     private Bounds currentBounds = null;
+    private boolean canceled;
 
     private JCheckBox cbDownloadOsmData = new JCheckBox(tr("OpenStreetMap data"), true);
     private JCheckBox cbDownloadGpxData = new JCheckBox(tr("Raw GPS data"));
 
-
-    public DownloadDialog() {
-        setLayout(new GridBagLayout());
+    
+    public JPanel buildMainPanel() {
+        JPanel pnl = new JPanel(); 
+        pnl.setLayout(new GridBagLayout());
 
         // adding the download tasks
-        add(new JLabel(tr("Data Sources and Types")), GBC.eol().insets(0,5,0,0));
-        add(cbDownloadOsmData,  GBC.eol().insets(20,0,0,0));
-        add(cbDownloadGpxData,  GBC.eol().insets(20,0,0,0));
+        pnl.add(new JLabel(tr("Data Sources and Types")), GBC.eol().insets(0,5,0,0));
+        pnl.add(cbDownloadOsmData,  GBC.eol().insets(20,0,0,0));
+        pnl.add(cbDownloadGpxData,  GBC.eol().insets(20,0,0,0));
         
         // predefined download selections
@@ -81,8 +104,8 @@
    
         cbNewLayer = new JCheckBox(tr("Download as new layer"));
-        add(cbNewLayer, GBC.eol().insets(0,5,0,0));
-
-        add(new JLabel(tr("Download Area")), GBC.eol().insets(0,5,0,0));
-        add(tpDownloadAreaSelectors, GBC.eol().fill());
+        pnl.add(cbNewLayer, GBC.eol().insets(0,5,0,0));
+
+        pnl. add(new JLabel(tr("Download Area")), GBC.eol().insets(0,5,0,0));
+        pnl.add(tpDownloadAreaSelectors, GBC.eol().fill());
 
         try {
@@ -94,17 +117,37 @@
         Font labelFont = sizeCheck.getFont();
         sizeCheck.setFont(labelFont.deriveFont(Font.PLAIN, labelFont.getSize()));
-        add(sizeCheck, GBC.eop().insets(0,5,5,10));
-
-        getInputMap(WHEN_IN_FOCUSED_WINDOW).put(
+        pnl.add(sizeCheck, GBC.eop().insets(0,5,5,10));
+        return pnl;
+    }
+    
+    protected JPanel buildButtonPanel() {
+        JPanel pnl = new JPanel();
+        pnl.setLayout(new FlowLayout());
+        
+        pnl.add(new SideButton(new DownloadAction()));
+        pnl.add(new SideButton(new CancelAction()));
+        pnl.add(new SideButton(new ContextSensitiveHelpAction(ht("/Dialog/DownloadDialog"))));
+        return pnl;        
+    }
+    
+    public DownloadDialog(Component parent) {
+        super(JOptionPane.getFrameForComponent(parent),tr("Download"), true /* modal */);
+        getContentPane().setLayout(new BorderLayout());
+        getContentPane().add(buildMainPanel(), BorderLayout.CENTER);
+        getContentPane().add(buildButtonPanel(), BorderLayout.SOUTH);
+        
+        getRootPane().getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(
                 KeyStroke.getKeyStroke(KeyEvent.VK_V, InputEvent.CTRL_MASK), "checkClipboardContents");
 
-        getActionMap().put("checkClipboardContents", new AbstractAction() {
+        getRootPane().getActionMap().put("checkClipboardContents", new AbstractAction() {
             public void actionPerformed(ActionEvent e) {
                 checkClipboardContents();
             }
         });
-        
+        HelpUtil.setHelpContext(getRootPane(), ht("/Dialog/DownloadDialog"));
+        addWindowListener(new WindowEventHandler());
         restoreSettings();
     }
+    
 
     private void checkClipboardContents() {
@@ -247,3 +290,90 @@
     }
     
+    @Override
+    public void setVisible(boolean visible) {
+        if (visible) {
+            new WindowGeometry(
+                    getClass().getName() + ".geometry",
+                    WindowGeometry.centerInWindow(
+                            getParent(),
+                            new Dimension(1000,600)
+                    )
+            ).apply(this);
+        } else if (!visible && isShowing()){
+            new WindowGeometry(this).remember(getClass().getName() + ".geometry");
+        }
+        super.setVisible(visible);
+    }
+
+    /**
+     * Replies true if the dialog was canceled
+     * 
+     * @return true if the dialog was canceled
+     */
+    public boolean isCanceled() {
+        return canceled;
+    }
+
+    protected void setCanceled(boolean canceled) {
+        this.canceled = canceled;
+    }
+    
+    class CancelAction extends AbstractAction {
+        public CancelAction() {
+            putValue(NAME, tr("Cancel"));
+            putValue(SMALL_ICON, ImageProvider.get("cancel"));
+            putValue(SHORT_DESCRIPTION, tr("Click to close the dialog and to abort downloading"));            
+        }
+       
+        public void run() {
+            setCanceled(true);
+            setVisible(false);    
+        }
+        
+        public void actionPerformed(ActionEvent e) {
+            run();
+        }       
+    }
+
+    class DownloadAction extends AbstractAction {
+        public DownloadAction() {
+            putValue(NAME, tr("Download"));
+            putValue(SMALL_ICON, ImageProvider.get("download"));
+            putValue(SHORT_DESCRIPTION, tr("Click do download the currently selected area"));            
+        }
+        
+        public void actionPerformed(ActionEvent e) {
+            if (currentBounds == null) {
+                JOptionPane.showMessageDialog(
+                        DownloadDialog.this,
+                        tr("Please select a download area first."),
+                        tr("Error"),
+                        JOptionPane.ERROR_MESSAGE
+                );
+                return;
+            }
+            if (!isDownloadOsmData() && !isDownloadOsmData()) {
+                JOptionPane.showMessageDialog(
+                        DownloadDialog.this,
+                        tr("<html>Neither <strong>{0}</strong> nor <strong>{1}</strong> is enabled.<br>" 
+                                + "Please chose to either download OSM data, or GPX data, or both.</html>",
+                        cbDownloadOsmData.getText(),
+                        cbDownloadGpxData.getText()
+                        ),
+                        tr("Error"),
+                        JOptionPane.ERROR_MESSAGE
+                );
+                return;
+            }
+            setCanceled(false);
+            setVisible(false);            
+        }       
+    }
+    
+    class WindowEventHandler extends WindowAdapter {
+        @Override
+        public void windowClosing(WindowEvent e) {
+            new CancelAction().run();
+        }        
+    }
 }
Index: /trunk/src/org/openstreetmap/josm/gui/download/PlaceSelection.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/download/PlaceSelection.java	(revision 2330)
+++ /trunk/src/org/openstreetmap/josm/gui/download/PlaceSelection.java	(revision 2331)
@@ -233,5 +233,5 @@
         submitSearch.addActionListener(new ActionListener() {
             public void actionPerformed(ActionEvent e) {
-                queryServer(gui);
+                queryServer(gui.getRootPane());
             }
         });
@@ -239,5 +239,5 @@
         searchTerm.addActionListener(new ActionListener() {
             public void actionPerformed(ActionEvent e) {
-                queryServer(gui);
+                queryServer(gui.getRootPane());
             }
         });
