Index: trunk/src/org/openstreetmap/josm/gui/dialogs/DialogsPanel.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/DialogsPanel.java	(revision 2474)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/DialogsPanel.java	(revision 2475)
@@ -3,8 +3,5 @@
 package org.openstreetmap.josm.gui.dialogs;
 
-import static org.openstreetmap.josm.tools.I18n.tr;
-
 import java.awt.Dimension;
-
 import java.util.ArrayList;
 import java.util.List;
@@ -14,11 +11,9 @@
 import javax.swing.JSplitPane;
 
-import org.openstreetmap.josm.gui.MultiSplitLayout;
+import org.openstreetmap.josm.gui.MultiSplitPane;
+import org.openstreetmap.josm.gui.MultiSplitLayout.Divider;
+import org.openstreetmap.josm.gui.MultiSplitLayout.Leaf;
 import org.openstreetmap.josm.gui.MultiSplitLayout.Node;
-import org.openstreetmap.josm.gui.MultiSplitLayout.Leaf;
-import org.openstreetmap.josm.gui.MultiSplitLayout.Divider;
 import org.openstreetmap.josm.gui.MultiSplitLayout.Split;
-import org.openstreetmap.josm.gui.MultiSplitPane;
-import org.openstreetmap.josm.Main;
 
 public class DialogsPanel extends JPanel {
@@ -31,5 +26,5 @@
      */
     private List<JPanel> panels = new ArrayList<JPanel>();
-    
+
     final private JSplitPane parent;
     public DialogsPanel(JSplitPane parent) {
@@ -39,7 +34,6 @@
     private boolean initialized = false;
     public void initialize(List<ToggleDialog> allDialogs) {
-        if (initialized) {
+        if (initialized)
             throw new IllegalStateException();
-        }
         initialized = true;
         this.allDialogs = allDialogs;
@@ -56,4 +50,5 @@
                  * entire Window is resized.
                  */
+                @Override
                 public Dimension getMinimumSize() {
                     return new Dimension(0, 40);
@@ -88,5 +83,5 @@
         INVISIBLE_TO_DEFAULT,
         COLLAPSED_TO_DEFAULT,
-    /*  INVISIBLE_TO_COLLAPSED,    does not happen */
+        /*  INVISIBLE_TO_COLLAPSED,    does not happen */
         ELEMENT_SHRINKS         /* else. (Remaining elements have more space.) */
     };
@@ -157,7 +152,6 @@
             }
         } else {
-            if (triggeredBy == null) {
+            if (triggeredBy == null)
                 throw new IllegalArgumentException();
-            }
 
             int sumP = 0;   // sum of preferred heights of dialogs in default view (without the triggering dialog)
@@ -285,5 +279,5 @@
     public void destroy() {
         for (ToggleDialog t : allDialogs) {
-            t.closeDetachedDialog();
+            t.destroy();
         }
     }
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/ToggleDialog.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/ToggleDialog.java	(revision 2474)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/ToggleDialog.java	(revision 2475)
@@ -163,4 +163,5 @@
         toggleAction.putValue("selected", false);
         toggleAction.putValue("selected", true);
+        showNotify();
     }
 
@@ -173,4 +174,5 @@
         setIsShowing(false);
         toggleAction.putValue("selected", false);
+        hideNotify();
     }
 
@@ -204,10 +206,13 @@
      */
     public void collapse() {
-        setContentVisible(false);
-        setIsCollapsed(true);
-        setPreferredSize(new Dimension(0,20));
-        setMaximumSize(new Dimension(Integer.MAX_VALUE,20));
-        setMinimumSize(new Dimension(Integer.MAX_VALUE,20));
-        lblMinimized.setIcon(ImageProvider.get("misc", "minimized"));
+        if (isShowing && isDocked && !isCollapsed) {
+            setContentVisible(false);
+            setIsCollapsed(true);
+            setPreferredSize(new Dimension(0,20));
+            setMaximumSize(new Dimension(Integer.MAX_VALUE,20));
+            setMinimumSize(new Dimension(Integer.MAX_VALUE,20));
+            lblMinimized.setIcon(ImageProvider.get("misc", "minimized"));
+            hideNotify();
+        }
     }
 
@@ -216,9 +221,12 @@
      */
     protected void expand() {
-        setContentVisible(true);
-        setIsCollapsed(false);
-        setPreferredSize(new Dimension(0,preferredHeight));
-        setMaximumSize(new Dimension(Integer.MAX_VALUE, Integer.MAX_VALUE));
-        lblMinimized.setIcon(ImageProvider.get("misc", "normal"));
+        if (isShowing && isDocked && isCollapsed) {
+            setContentVisible(true);
+            setIsCollapsed(false);
+            setPreferredSize(new Dimension(0,preferredHeight));
+            setMaximumSize(new Dimension(Integer.MAX_VALUE, Integer.MAX_VALUE));
+            lblMinimized.setIcon(ImageProvider.get("misc", "normal"));
+            showNotify();
+        }
     }
 
@@ -237,4 +245,9 @@
     }
 
+    public void destroy() {
+        closeDetachedDialog();
+        hideNotify();
+    }
+
     /**
      * Closes the the detached dialog if this toggle dialog is currently displayed
@@ -248,4 +261,20 @@
             detachedDialog.dispose();
         }
+    }
+
+    /**
+     * Called when toggle dialog is shown (after it was created or expanded). Descendants may overwrite this
+     * method, it's a good place to register listeners needed to keep dialog updated
+     */
+    public void showNotify() {
+
+    }
+
+    /**
+     * Called when toggle dialog is hidden (collapsed, removed, MapFrame is removed, ...). Good place to unregister
+     * listeners
+     */
+    public void hideNotify() {
+
     }
 
