Index: /trunk/src/org/openstreetmap/josm/gui/HideableButton.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/HideableButton.java	(revision 4609)
+++ /trunk/src/org/openstreetmap/josm/gui/HideableButton.java	(revision 4609)
@@ -0,0 +1,19 @@
+// License: GPL. Copyright 2007 by Immanuel Scholz and others
+package org.openstreetmap.josm.gui;
+
+import javax.swing.Icon;
+
+/**
+ * An interface to provide showing/hiding method for buttons,
+ * when hidden state is stored in preferences
+ */
+interface HideableButton {
+    public void applyButtonHiddenPreferences();
+    public void setButtonHidden(boolean b);
+    public void showButton();
+    public void hideButton();
+    public String getActionName();
+    public Icon getIcon();
+    public boolean isButtonVisible();
+    public void setShowHideButtonListener(ShowHideButtonListener l);
+}
Index: /trunk/src/org/openstreetmap/josm/gui/IconToggleButton.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/IconToggleButton.java	(revision 4608)
+++ /trunk/src/org/openstreetmap/josm/gui/IconToggleButton.java	(revision 4609)
@@ -7,7 +7,10 @@
 import java.beans.PropertyChangeListener;
 
+import javax.swing.AbstractAction;
 import javax.swing.Action;
+import javax.swing.Icon;
 import javax.swing.JToggleButton;
 
+import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.tools.Destroyable;
 
@@ -15,10 +18,11 @@
  * Just a toggle button, with smaller border and icon only to display in
  * MapFrame toolbars.
- *
- * @author imi
+ * Also provides methods for storing hidden state in preferences
+ * @author imi, akks
  */
-public class IconToggleButton extends JToggleButton implements PropertyChangeListener, Destroyable {
+public class IconToggleButton extends JToggleButton implements HideableButton, PropertyChangeListener, Destroyable {
 
     public boolean groupbutton;
+    private ShowHideButtonListener listener;
 
     /**
@@ -59,3 +63,52 @@
         action.removePropertyChangeListener(this);
     }
+    
+    @Override
+    public void applyButtonHiddenPreferences() {
+            String actionName = (String) getAction().getValue(AbstractAction.NAME);
+            boolean hiddenFlag =
+                    Main.pref.getBoolean(actionName + ".itbutton_hidden", false);
+            setVisible(!hiddenFlag);   
+    }
+
+    @Override
+    public void setButtonHidden(boolean b) {
+            String actionName = (String) getAction().getValue(AbstractAction.NAME);
+            setVisible(!b);
+            if (listener!=null) { // if someone wants to know about changes of visibility
+                if (!b) listener.buttonShown(); else listener.buttonHidden();
+            }
+            Main.pref.put(actionName + ".itbutton_hidden", b);
+            
+    }
+    @Override
+    public void showButton() {
+        setButtonHidden(false);
+    }
+    @Override
+    public void hideButton() {
+        setButtonHidden(true);
+    }
+
+    @Override
+    public String getActionName() {
+        return (String) getAction().getValue(Action.NAME);
+    }
+
+    @Override
+    public Icon getIcon() {
+        return (Icon) getAction().getValue(Action.SMALL_ICON);
+    }
+
+    @Override
+    public boolean isButtonVisible() {
+        return isVisible();
+    }
+
+    @Override
+    public void setShowHideButtonListener(ShowHideButtonListener l) {
+        listener = l;
+    }
+
+ 
 }
Index: /trunk/src/org/openstreetmap/josm/gui/MapFrame.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/MapFrame.java	(revision 4608)
+++ /trunk/src/org/openstreetmap/josm/gui/MapFrame.java	(revision 4609)
@@ -14,4 +14,5 @@
 import java.awt.event.MouseWheelListener;
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.HashMap;
 import java.util.List;
@@ -107,6 +108,16 @@
 
     public final ButtonGroup toolGroup = new ButtonGroup();
-
-    public final JButton otherButton = new JButton(new OtherButtonsAction());
+    
+    private List<IconToggleButton> allDialogButtons = new ArrayList<IconToggleButton>();
+    private List<IconToggleButton> allMapModeButtons = new ArrayList<IconToggleButton>();
+    
+    private final ListAllButtonsAction listAllDialogsAction = new ListAllButtonsAction(allDialogButtons);
+    private final ListAllButtonsAction listAllMapModesAction = new ListAllButtonsAction(allMapModeButtons);
+    private final JButton listAllToggleDialogsButton = new JButton(listAllDialogsAction);
+    private final JButton listAllMapModesButton = new JButton(listAllMapModesAction);
+    {
+        listAllDialogsAction.setButton(listAllToggleDialogsButton);
+        listAllMapModesAction.setButton(listAllMapModesButton);
+    }
 
     /**
@@ -262,25 +273,11 @@
     public IconToggleButton addToggleDialog(final ToggleDialog dlg) {
         final IconToggleButton button = new IconToggleButton(dlg.getToggleAction());
-        button.addMouseListener(new PopupMenuLauncher(new JPopupMenu() {
-            {
-                add(new AbstractAction() {
-                    {
-                        putValue(NAME, tr("Hide this button"));
-                        putValue(SHORT_DESCRIPTION, tr("Click the arrow at the bottom to show it again."));
-                    }
-
-                    @Override
-                    public void actionPerformed(ActionEvent e) {
-                        dlg.hideButton();
-                        validateToolBarToggle();
-                    }
-                });
-            }
-        }));
+        button.setShowHideButtonListener(dlg);
+        addHideContextMenu(button);
         dlg.setButton(button);
-        if (button.isVisible()) {
-            toolBarToggle.add(button);
-        }
+        toolBarToggle.add(button);
         allDialogs.add(dlg);
+        allDialogButtons.add(button);
+        button.applyButtonHiddenPreferences();
         if (dialogsPanel.initialized) {
             dialogsPanel.add(dlg);
@@ -289,20 +286,16 @@
     }
 
-    public void validateToolBarToggle() {
-        toolBarToggle.removeAll();
-        for (ToggleDialog dlg : allDialogs) {
-            if (dlg.getButton().isVisible()) {
-                toolBarToggle.add(dlg.getButton());
-            }
-        }
-    }
+
 
     public void addMapMode(IconToggleButton b) {
         toolBarActions.add(b);
         toolGroup.add(b);
+        allMapModeButtons.add(b);
         if (b.getAction() instanceof MapMode) {
             mapModes.add((MapMode) b.getAction());
         } else
             throw new IllegalArgumentException("MapMode action must be subclass of MapMode");
+        addHideContextMenu(b);
+        b.applyButtonHiddenPreferences();
     }
 
@@ -363,13 +356,17 @@
         toolBarActions.setAlignmentX(0.5f);
         jb.add(toolBarActions);
-
+        listAllMapModesButton.setAlignmentX(0.5f);
+        listAllMapModesButton.setBorder(null);
+        listAllMapModesButton.setFont(listAllMapModesButton.getFont().deriveFont(Font.PLAIN));
+        jb.add(listAllMapModesButton);
+        
         if(Main.pref.getBoolean("sidetoolbar.togglevisible", true)) {
             jb.addSeparator(new Dimension(0,18));
             toolBarToggle.setAlignmentX(0.5f);
             jb.add(toolBarToggle);
-            otherButton.setAlignmentX(0.5f);
-            otherButton.setBorder(null);
-            otherButton.setFont(otherButton.getFont().deriveFont(Font.PLAIN));
-            jb.add(otherButton);
+            listAllToggleDialogsButton.setAlignmentX(0.5f);
+            listAllToggleDialogsButton.setBorder(null);
+            listAllToggleDialogsButton.setFont(listAllToggleDialogsButton.getFont().deriveFont(Font.PLAIN));
+            jb.add(listAllToggleDialogsButton);
         }
 
@@ -393,8 +390,36 @@
     }
 
-    class OtherButtonsAction extends AbstractAction {
-
-        public OtherButtonsAction() {
+    private void addHideContextMenu(final IconToggleButton b) {
+        //context menu
+        b.addMouseListener(new PopupMenuLauncher(new JPopupMenu() {
+            {
+                add(new AbstractAction() {
+                    {
+                        putValue(NAME, tr("Hide this button"));
+                        putValue(SHORT_DESCRIPTION, tr("Click the arrow at the bottom to show it again."));
+                    }
+                    @Override
+                    public void actionPerformed(ActionEvent e) {
+                        b.setButtonHidden(true);
+                        validateToolBarsVisibility();
+                    }
+                });
+            }
+        }));
+    }
+   
+        class ListAllButtonsAction extends AbstractAction {
+
+        private JButton button;
+        private Collection<? extends HideableButton> buttons;
+        
+                
+        public ListAllButtonsAction(Collection<? extends HideableButton> buttons) {
+            this.buttons = buttons;
             putValue(NAME, ">>");
+        }
+
+        public void setButton(JButton button) {
+            this.button =  button;
         }
 
@@ -402,27 +427,34 @@
         public void actionPerformed(ActionEvent e) {
             JPopupMenu menu = new JPopupMenu();
-            for (final ToggleDialog t : allDialogs) {
+            for (HideableButton b : buttons) {
+                final HideableButton t = b;
                 menu.add(new JCheckBoxMenuItem(new AbstractAction() {
                     {
-                        putValue(NAME, t.getToggleAction().getValue(NAME));
-                        putValue(SMALL_ICON, t.getToggleAction().getValue(SMALL_ICON));
-                        putValue(SELECTED_KEY, !t.isButtonHidden());
+                        putValue(NAME, t.getActionName());
+                        putValue(SMALL_ICON, t.getIcon());
+                        putValue(SELECTED_KEY, t.isButtonVisible());
                         putValue(SHORT_DESCRIPTION, tr("Hide or show this toggle button"));
                     }
                     @Override
                     public void actionPerformed(ActionEvent e) {
-                        if ((Boolean) getValue(SELECTED_KEY)) {
-                            t.showButton();
-                            validateToolBarToggle();
-                        } else {
-                            t.hideButton();
-                            validateToolBarToggle();
-                        }
+                        if ((Boolean) getValue(SELECTED_KEY)) t.showButton(); else t.hideButton();
+                        validateToolBarsVisibility();
                     }
                 }));
             }
-            Rectangle bounds = otherButton.getBounds();
-            menu.show(otherButton, bounds.x+bounds.width, 0);
-        }
+            Rectangle bounds = button.getBounds();
+            menu.show(button, bounds.x + bounds.width, 0);
+        }
+    }
+
+    public void validateToolBarsVisibility() {
+        for (IconToggleButton b : allDialogButtons) {
+            b.applyButtonHiddenPreferences();
+        }
+        toolBarToggle.repaint();
+        for (IconToggleButton b : allMapModeButtons) {
+            b.applyButtonHiddenPreferences();
+        }
+        toolBarActions.repaint();
     }
 
Index: /trunk/src/org/openstreetmap/josm/gui/ShowHideButtonListener.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/ShowHideButtonListener.java	(revision 4609)
+++ /trunk/src/org/openstreetmap/josm/gui/ShowHideButtonListener.java	(revision 4609)
@@ -0,0 +1,12 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.gui;
+
+/**
+ * When some component (ToggleDialog, for example) is linked to button
+ * and needs information about button showing/hiding events, this interface 
+ * is used, setting the listener should be implemented by @class HideableButton
+ */
+public interface ShowHideButtonListener {
+    public void buttonShown();
+    public void buttonHidden();
+}
Index: /trunk/src/org/openstreetmap/josm/gui/dialogs/ToggleDialog.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/dialogs/ToggleDialog.java	(revision 4608)
+++ /trunk/src/org/openstreetmap/josm/gui/dialogs/ToggleDialog.java	(revision 4609)
@@ -13,5 +13,4 @@
 import java.awt.GridLayout;
 import java.awt.Image;
-import java.awt.Point;
 import java.awt.Rectangle;
 import java.awt.Toolkit;
@@ -47,4 +46,5 @@
 import org.openstreetmap.josm.gui.help.HelpUtil;
 import org.openstreetmap.josm.gui.help.Helpful;
+import org.openstreetmap.josm.gui.ShowHideButtonListener;
 import org.openstreetmap.josm.gui.util.RedirectInputMap;
 import org.openstreetmap.josm.gui.SideButton;
@@ -57,5 +57,5 @@
  *
  */
-public class ToggleDialog extends JPanel implements Helpful, AWTEventListener {
+public class ToggleDialog extends JPanel implements ShowHideButtonListener, Helpful, AWTEventListener {
 
     /** The action to toggle this dialog */
@@ -94,5 +94,4 @@
 
     protected JToggleButton button;
-    protected boolean buttonHidden;
     private JPanel buttonsPanel;
 
@@ -143,6 +142,4 @@
         isDocked = Main.pref.getBoolean(preferencePrefix+".docked", true);
         isCollapsed = Main.pref.getBoolean(preferencePrefix+".minimized", false);
-
-        buttonHidden = Main.pref.getBoolean(preferencePrefix+".button_hidden", false);
 
         RedirectInputMap.redirectToMainContentPane(this);
@@ -225,7 +222,7 @@
             dialogsPanel.reconstruct(Action.COLLAPSED_TO_DEFAULT, this);
         } else if (!isDialogShowing()) {
-            if (isButtonHidden()) {
-                showButtonImpl();
-            }
+//            if (isButtonHidden()) {
+//                showButtonImpl();
+//            }
             showDialog();
             if (isDocked && isCollapsed) {
@@ -239,25 +236,15 @@
     }
 
-    public void hideButton() {
-        if (!button.isVisible())
-            throw new AssertionError();
+    @Override
+    public void buttonHidden() {
         if ((Boolean) toggleAction.getValue("selected")) {
             toggleAction.actionPerformed(null);
         }
-        button.setVisible(false);
-        setButtonHidden(true);
-    }
-
-    public void showButton() {
-        showButtonImpl();
+    }
+
+    public void buttonShown() {
         unfurlDialog();
     }
 
-    protected void showButtonImpl() {
-        if (button.isVisible())
-            throw new AssertionError();
-        button.setVisible(true);
-        setButtonHidden(false);
-    }
 
     /**
@@ -623,17 +610,6 @@
     }
 
-    public boolean isButtonHidden() {
-        return buttonHidden;
-    }
-
-    protected void setButtonHidden(boolean buttonHidden) {
-        this.buttonHidden = buttonHidden;
-        Main.pref.put(preferencePrefix+".button_hidden", buttonHidden);
-    }
-
-
     public void setButton(JToggleButton button) {
         this.button = button;
-        button.setVisible(!buttonHidden);
     }
 
@@ -641,5 +617,5 @@
         return button;
     }
-
+    
     /***
      * The following methods are intended to be overridden, in order to customize
