Index: /trunk/src/org/openstreetmap/josm/gui/dialogs/ToggleDialog.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/dialogs/ToggleDialog.java	(revision 2110)
+++ /trunk/src/org/openstreetmap/josm/gui/dialogs/ToggleDialog.java	(revision 2111)
@@ -8,4 +8,5 @@
 import java.awt.GridBagLayout;
 import java.awt.Image;
+import java.awt.Rectangle;
 import java.awt.event.ActionEvent;
 import java.awt.event.ActionListener;
@@ -41,5 +42,5 @@
  */
 public class ToggleDialog extends JPanel implements Helpful {
-    private static final Logger logger = Logger.getLogger(ToggleDialog.class.getName());
+//    private static final Logger logger = Logger.getLogger(ToggleDialog.class.getName());
 
     /**
@@ -81,11 +82,21 @@
     private String title;
 
-    /** indicates whether the dialog is currently minimized or not */
-    private boolean collapsed;
-    /** indicates whether the dialog is docked or not */
-    private boolean docked;
-    /** indicates whether the dialog is showing or not */
+    /** 
+     * Indicates whether the dialog is showing or not.
+     */
     private boolean isShowing;
-
+    /** 
+     * If isShowing is true, indicates whether the dialog is docked or not, e. g.
+     * shown as part of the main window or as a seperate dialog window.
+     */
+    private boolean isDocked;
+    /** 
+     * If isShowing and isDocked are true, indicates whether the dialog is 
+     * currently minimized or not.
+     */
+    private boolean isCollapsed;
+
+    /** the preferred width of all docked toggle dialogs */
+    final private int TOGGLE_DIALOG_WIDTH = 330;
     /** the preferred height if the toggle dialog is expanded */
     private int preferredHeight;
@@ -95,5 +106,4 @@
     private JDialog detachedDialog;
 
-
     /**
      * Constructor
@@ -109,4 +119,34 @@
         this.preferencePrefix = iconName;
         init(name, iconName, tooltip, shortcut, preferredHeight);
+    }
+
+    /**
+     * Initializes the toggle dialog
+     * 
+     * @param name
+     * @param iconName
+     * @param tooltip
+     * @param shortcut
+     * @param preferredHeight
+     */
+    private void init(String name, String iconName, String tooltip, Shortcut shortcut, final int preferredHeight) {
+        setPreferredSize(new Dimension(TOGGLE_DIALOG_WIDTH, preferredHeight));
+        this.preferredHeight = preferredHeight;
+        toggleAction = new ToggleDialogAction(name, "dialogs/"+iconName, tooltip, shortcut, iconName);
+        String helpId = "Dialog/"+getClass().getName().substring(getClass().getName().lastIndexOf('.')+1);
+        toggleAction.putValue("help", helpId.substring(0, helpId.length()-6));
+
+        setLayout(new BorderLayout());
+
+        // show the minimize button
+        lblMinimized = new JLabel(ImageProvider.get("misc", "normal"));
+        titleBar = new TitleBar(name, iconName);
+        add(titleBar, BorderLayout.NORTH);
+
+        setVisible(false);
+        setBorder(BorderFactory.createEtchedBorder());
+
+        isDocked = Main.pref.getBoolean(preferencePrefix+".docked", true);
+        isCollapsed = Main.pref.getBoolean(preferencePrefix+".minimized", false);
     }
 
@@ -126,30 +166,13 @@
 
     /**
-     * Initializes the toggle dialog
-     * 
-     * @param name
-     * @param iconName
-     * @param tooltip
-     * @param shortcut
-     * @param preferredHeight
-     */
-    private void init(String name, String iconName, String tooltip, Shortcut shortcut, final int preferredHeight) {
-        setPreferredSize(new Dimension(330,preferredHeight));
-        toggleAction = new ToggleDialogAction(name, "dialogs/"+iconName, tooltip, shortcut, iconName);
-        String helpId = "Dialog/"+getClass().getName().substring(getClass().getName().lastIndexOf('.')+1);
-        toggleAction.putValue("help", helpId.substring(0, helpId.length()-6));
-
-        setLayout(new BorderLayout());
-
-        // show the minimize button
-        lblMinimized = new JLabel(ImageProvider.get("misc", "normal"));
-        titleBar = new TitleBar(name, iconName);
-        add(titleBar, BorderLayout.NORTH);
-
-        setVisible(false);
-        setBorder(BorderFactory.createEtchedBorder());
-
-        docked = Main.pref.getBoolean(preferencePrefix+".docked", true);
-        collapsed = Main.pref.getBoolean(preferencePrefix+".minimized", false);
+     * Toggles between collapsed and expanded state
+     * 
+     */
+    protected void toggleExpandedState() {
+        if (isCollapsed) {
+            expand();
+        } else {
+            collapse();
+        }
     }
 
@@ -160,8 +183,8 @@
     protected void collapse() {
         setContentVisible(false);
-        this.collapsed = true;
+        isCollapsed = true;
         Main.pref.put(preferencePrefix+".minimized", true);
-        setPreferredSize(new Dimension(330,20));
-        setMaximumSize(new Dimension(330,20));
+        setPreferredSize(new Dimension(TOGGLE_DIALOG_WIDTH,20));
+        setMaximumSize(new Dimension(TOGGLE_DIALOG_WIDTH,20));
         lblMinimized.setIcon(ImageProvider.get("misc", "minimized"));
         refreshToggleDialogsView();
@@ -173,7 +196,7 @@
     protected void expand() {
         setContentVisible(true);
-        this.collapsed = false;
+        isCollapsed = false;
         Main.pref.put(preferencePrefix+".minimized", false);
-        setPreferredSize(new Dimension(330,preferredHeight));
+        setPreferredSize(new Dimension(TOGGLE_DIALOG_WIDTH,preferredHeight));
         setMaximumSize(new Dimension(Short.MAX_VALUE, Short.MAX_VALUE));
         lblMinimized.setIcon(ImageProvider.get("misc", "normal"));
@@ -228,12 +251,12 @@
         }
         titleBar.setVisible(true);
-        collapsed = Main.pref.getBoolean(preferencePrefix+".minimized", false);
-        if (collapsed) {
+        isCollapsed = Main.pref.getBoolean(preferencePrefix+".minimized", false);
+        if (isCollapsed) {
             collapse();
         } else {
             expand();
         }
-        docked = true;
-        Main.pref.put(preferencePrefix+".docked", docked);
+        isDocked = true;
+        Main.pref.put(preferencePrefix+".docked", isDocked);
     }
 
@@ -245,5 +268,4 @@
         setContentVisible(true);
         setVisible(true);
-
         // replace the toggle dialog by an invisible place holder. Makes sure
         // we can place the toggle dialog where it was when it becomes docked
@@ -260,4 +282,5 @@
             parent.remove(ToggleDialog.this);
         }
+        
 
         titleBar.setVisible(false);
@@ -265,6 +288,6 @@
         detachedDialog.setVisible(true);
         refreshToggleDialogsView();
-        docked = false;
-        Main.pref.put(preferencePrefix+".docked", docked);
+        isDocked = false;
+        Main.pref.put(preferencePrefix+".docked", isDocked);
     }
 
@@ -273,9 +296,5 @@
      */
     public void hideDialog() {
-        if (detachedDialog != null) {
-            detachedDialog.setVisible(false);
-            detachedDialog.getContentPane().removeAll();
-            detachedDialog.dispose();
-        }
+        closeDetachedDialog();
         setVisible(false);
         isShowing = false;
@@ -296,9 +315,9 @@
      */
     public void showDialog() {
-        if (!docked) {
+        if (!isDocked) {
             detach();
         } else {
             dock();
-            if (!collapsed) {
+            if (!isCollapsed) {
                 expand();
                 setVisible(true);
@@ -311,5 +330,4 @@
         isShowing = true;
         // toggling the selected value in order to enforce PropertyChangeEvents
-        //
         toggleAction.putValue("selected", false);
         toggleAction.putValue("selected", true);
@@ -318,16 +336,4 @@
 
     /**
-     * Toggles between collapsed and expanded state
-     * 
-     */
-    protected void toggleExpandedState() {
-        if (this.collapsed) {
-            expand();
-        } else {
-            collapse();
-        }
-    }
-
-    /**
      * Refreshes the layout of the parent toggle dialog view
      * 
@@ -347,5 +353,5 @@
         if (detachedDialog != null) {
             detachedDialog.setVisible(false);
-            detachedDialog.removeAll();
+            detachedDialog.getContentPane().removeAll();
             detachedDialog.dispose();
         }
@@ -387,4 +393,5 @@
     /**
      * Replies the name of this toggle dialog
+     *
      */
     @Override
@@ -474,8 +481,9 @@
     private class DetachedDialog extends JDialog {
         public DetachedDialog() {
-            super(JOptionPane.getFrameForComponent(Main.parent),false /* not modal*/);
+            super(JOptionPane.getFrameForComponent(Main.parent));
             getContentPane().add(ToggleDialog.this);
             addWindowListener(new WindowAdapter(){
                 @Override public void windowClosing(WindowEvent e) {
+                    rememberGeometry();
                     getContentPane().removeAll();
                     dispose();
@@ -483,16 +491,13 @@
                 }
             });
-            addComponentListener(new ComponentAdapter(){
-                @Override public void componentMoved(ComponentEvent e) {
-                    rememberGeometry();
-                }
-            });
             String bounds = Main.pref.get(preferencePrefix+".bounds",null);
             if (bounds != null) {
                 String[] b = bounds.split(",");
-                setBounds(Integer.parseInt(b[0]),Integer.parseInt(b[1]),Integer.parseInt(b[2]),Integer.parseInt(b[3]));
+                setBounds(getDetachedGeometry(new Rectangle(
+                        Integer.parseInt(b[0]),Integer.parseInt(b[1]),Integer.parseInt(b[2]),Integer.parseInt(b[3]))));
             } else {
+                ToggleDialog.this.setPreferredSize(ToggleDialog.this.getDefaultDetachedSize());
                 pack();
-
+                setLocationRelativeTo(Main.parent);
             }
             setTitle(titleBar.getTitle());
@@ -503,3 +508,19 @@
         }
     }
+
+    /**
+     * Change the Geometry of the detached dialog to better fit the content.
+     * Overrride this to make it useful.
+     */
+    protected Rectangle getDetachedGeometry(Rectangle last) {
+        return last;
+    }
+    
+    /**
+     * Default size of the detached dialog.
+     * Override this method to customize the initial dialog size.
+     */
+    protected Dimension getDefaultDetachedSize() {
+        return new Dimension(TOGGLE_DIALOG_WIDTH, preferredHeight);
+    }
 }
