Index: /trunk/src/org/openstreetmap/josm/actions/DialogsToggleAction.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/DialogsToggleAction.java	(revision 5965)
+++ /trunk/src/org/openstreetmap/josm/actions/DialogsToggleAction.java	(revision 5965)
@@ -0,0 +1,91 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.actions;
+
+import static org.openstreetmap.josm.gui.help.HelpUtil.ht;
+import static org.openstreetmap.josm.tools.I18n.tr;
+
+import java.awt.event.ActionEvent;
+import java.awt.event.KeyEvent;
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.swing.ButtonModel;
+import javax.swing.Icon;
+
+import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.tools.Shortcut;
+
+/*
+* Action that hides or shows toggle dialogs panel and other panels 
+* to free more space for drawing (GIMP-like)
+* @author cmuelle8
+*/
+public class DialogsToggleAction extends JosmAction {
+    private final List<ButtonModel> buttonModels = new ArrayList<ButtonModel>();
+    private boolean selected;
+
+    public DialogsToggleAction() {
+        super(
+                tr("Toggle dialogs panel"),
+                (Icon) null, /* no icon */
+                tr("Toggle dialogs panel, maximize mapview"),
+                Shortcut.registerShortcut("menu:view:dialogspanel", tr("Toggle dialogs panel"),KeyEvent.CHAR_UNDEFINED, Shortcut.NONE),
+                true, "dialogspanel", /* register in toolbar */
+                false
+        );
+        putValue("help", ht("/Action/ToggleDialogsPanel"));
+        selected = Main.pref.getBoolean("draw.dialogspanel", true);
+        notifySelectedState();
+    }
+
+    public void addButtonModel(ButtonModel model) {
+        if (model != null && !buttonModels.contains(model)) {
+            buttonModels.add(model);
+        }
+    }
+
+    public void removeButtonModel(ButtonModel model) {
+        if (model != null && buttonModels.contains(model)) {
+            buttonModels.remove(model);
+        }
+    }
+
+    protected void notifySelectedState() {
+        for (ButtonModel model: buttonModels) {
+            if (model.isSelected() != selected) {
+                model.setSelected(selected);
+            }
+        }
+    }
+
+    protected void toggleSelectedState() {
+        selected = !selected;
+        Main.pref.put("draw.dialogspanel", selected);
+        notifySelectedState();
+        setMode();
+    }
+
+    public void initial() {
+        if(selected) {
+            setMode();
+        }
+    }
+
+    protected void setMode() {
+        if (Main.isDisplayingMapView()) {
+            Main.map.setDialogsPanelVisible(selected);
+            Main.map.statusLine.setVisible(selected || Main.pref.getBoolean("statusbar.always-visible", true));
+            Main.toolbar.control.setVisible(selected || Main.pref.getBoolean("toolbar.always-visible", true));
+            Main.main.menu.setVisible(selected || Main.pref.getBoolean("menu.always-visible", true));
+            // sideToolBar listens to preference changes, use it here
+            if (!Main.pref.getBoolean("sidetoolbar.always-visible", true)) {
+                Main.pref.put("sidetoolbar.visible", selected);
+            }
+        }
+    }
+
+    @Override
+    public void actionPerformed(ActionEvent e) {
+        toggleSelectedState();
+    }
+}
Index: /trunk/src/org/openstreetmap/josm/actions/JumpToAction.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/JumpToAction.java	(revision 5964)
+++ /trunk/src/org/openstreetmap/josm/actions/JumpToAction.java	(revision 5965)
@@ -26,5 +26,5 @@
 import org.openstreetmap.josm.gui.widgets.JosmTextField;
 
-public class JumpToAction extends JosmAction implements MouseListener {
+public class JumpToAction extends JosmAction {
     /**
      * Constructs a new {@code JumpToAction}.
@@ -67,13 +67,13 @@
 
         class osmURLListener implements DocumentListener {
-            public void changedUpdate(DocumentEvent e) { parseURL(); }
-            public void insertUpdate(DocumentEvent e) { parseURL(); }
-            public void removeUpdate(DocumentEvent e) { parseURL(); }
+            @Override public void changedUpdate(DocumentEvent e) { parseURL(); }
+            @Override public void insertUpdate(DocumentEvent e) { parseURL(); }
+            @Override public void removeUpdate(DocumentEvent e) { parseURL(); }
         }
 
         class osmLonLatListener implements DocumentListener {
-            public void changedUpdate(DocumentEvent e) { updateUrl(false); }
-            public void insertUpdate(DocumentEvent e) { updateUrl(false); }
-            public void removeUpdate(DocumentEvent e) { updateUrl(false); }
+            @Override public void changedUpdate(DocumentEvent e) { updateUrl(false); }
+            @Override public void insertUpdate(DocumentEvent e) { updateUrl(false); }
+            @Override public void removeUpdate(DocumentEvent e) { updateUrl(false); }
         }
 
@@ -172,15 +172,3 @@
         showJumpToDialog();
     }
-
-    public void mousePressed(MouseEvent e) {}
-
-    public void mouseReleased(MouseEvent e) {}
-
-    public void mouseEntered(MouseEvent e) {}
-
-    public void mouseExited(MouseEvent e) {}
-
-    public void mouseClicked(MouseEvent e) {
-        showJumpToDialog();
-    }
 }
Index: /trunk/src/org/openstreetmap/josm/actions/mapmode/DrawAction.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/mapmode/DrawAction.java	(revision 5964)
+++ /trunk/src/org/openstreetmap/josm/actions/mapmode/DrawAction.java	(revision 5965)
@@ -1724,5 +1724,5 @@
                 add(repeatedCb);
                 add(helperCb);
-                add(projectionCb);;
+                add(projectionCb);
                 add(new AbstractAction(tr("Disable")) {
                     @Override public void actionPerformed(ActionEvent e) {
Index: /trunk/src/org/openstreetmap/josm/gui/MainMenu.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/MainMenu.java	(revision 5964)
+++ /trunk/src/org/openstreetmap/josm/gui/MainMenu.java	(revision 5965)
@@ -36,4 +36,5 @@
 import org.openstreetmap.josm.actions.CreateMultipolygonAction;
 import org.openstreetmap.josm.actions.DeleteAction;
+import org.openstreetmap.josm.actions.DialogsToggleAction;
 import org.openstreetmap.josm.actions.DistributeAction;
 import org.openstreetmap.josm.actions.DownloadAction;
@@ -65,6 +66,8 @@
 import org.openstreetmap.josm.actions.OpenLocationAction;
 import org.openstreetmap.josm.actions.OrthogonalizeAction;
+import org.openstreetmap.josm.actions.OrthogonalizeAction.Undo;
 import org.openstreetmap.josm.actions.PasteAction;
 import org.openstreetmap.josm.actions.PasteTagsAction;
+import org.openstreetmap.josm.actions.PreferenceToggleAction;
 import org.openstreetmap.josm.actions.PreferencesAction;
 import org.openstreetmap.josm.actions.PurgeAction;
@@ -93,6 +96,4 @@
 import org.openstreetmap.josm.actions.ZoomInAction;
 import org.openstreetmap.josm.actions.ZoomOutAction;
-import org.openstreetmap.josm.actions.OrthogonalizeAction.Undo;
-import org.openstreetmap.josm.actions.PreferenceToggleAction;
 import org.openstreetmap.josm.actions.audio.AudioBackAction;
 import org.openstreetmap.josm.actions.audio.AudioFasterAction;
@@ -233,4 +234,5 @@
 
     public final TaggingPresetSearchAction presetSearchAction = new TaggingPresetSearchAction();
+    public final DialogsToggleAction dialogsToggleAction = new DialogsToggleAction();
     public FullscreenToggleAction fullscreenToggleAction = null;
 
@@ -519,4 +521,11 @@
             fullscreenToggleAction.addButtonModel(fullscreen.getModel());
         }
+
+        // -- dialogs panel toggle action
+        final JCheckBoxMenuItem dialogsToggle = new JCheckBoxMenuItem(dialogsToggleAction);
+        dialogsToggle.setAccelerator(dialogsToggleAction.getShortcut().getKeyStroke());
+        dialogsToggleAction.addButtonModel(dialogsToggle.getModel());
+        viewMenu.add(dialogsToggle);
+
         viewMenu.addSeparator();
         add(viewMenu, info);
@@ -627,12 +636,15 @@
         }
 
+        @Override
         public void activeLayerChange(Layer oldLayer, Layer newLayer) {
             refreshEnabled();
         }
 
+        @Override
         public void layerAdded(Layer newLayer) {
             refreshEnabled();
         }
 
+        @Override
         public void layerRemoved(Layer oldLayer) {
             refreshEnabled();
Index: /trunk/src/org/openstreetmap/josm/gui/MapFrame.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/MapFrame.java	(revision 5964)
+++ /trunk/src/org/openstreetmap/josm/gui/MapFrame.java	(revision 5965)
@@ -10,4 +10,5 @@
 import java.awt.Font;
 import java.awt.GridBagLayout;
+import java.awt.KeyboardFocusManager;
 import java.awt.Rectangle;
 import java.awt.event.ActionEvent;
@@ -18,4 +19,5 @@
 import java.util.Collection;
 import java.util.HashMap;
+import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
@@ -37,4 +39,6 @@
 import javax.swing.SwingUtilities;
 import javax.swing.border.Border;
+import javax.swing.event.PopupMenuEvent;
+import javax.swing.event.PopupMenuListener;
 import javax.swing.plaf.basic.BasicSplitPaneDivider;
 import javax.swing.plaf.basic.BasicSplitPaneUI;
@@ -70,7 +74,7 @@
 import org.openstreetmap.josm.gui.dialogs.properties.PropertiesDialog;
 import org.openstreetmap.josm.gui.layer.Layer;
-import org.openstreetmap.josm.gui.widgets.PopupMenuLauncher;
 import org.openstreetmap.josm.tools.Destroyable;
 import org.openstreetmap.josm.tools.GBC;
+
 
 /**
@@ -87,19 +91,31 @@
     public MapMode mapMode;
 
+    /**
+     * The view control displayed.
+     */
+    public final MapView mapView;
+
+    /**
+     * The toolbar with the action icons. To add new toggle dialog buttons,
+     * use addToggleDialog, to add a new map mode button use addMapMode.
+     */
+    private JComponent sideToolBar = new JToolBar(JToolBar.VERTICAL);
+    private final ButtonGroup toolBarActionsGroup = new ButtonGroup();
+    private final JToolBar toolBarActions = new JToolBar(JToolBar.VERTICAL);
+    private final JToolBar toolBarToggle = new JToolBar(JToolBar.VERTICAL);
+
+    private final List<ToggleDialog> allDialogs = new ArrayList<ToggleDialog>();
     private final List<MapMode> mapModes = new ArrayList<MapMode>();
-    /**
-     * The view control displayed.
-     */
-    public final MapView mapView;
-    /**
-     * The toolbar with the action icons. To add new toggle dialog actions, use addToggleDialog
-     * instead of adding directly to this list. To add a new mode use addMapMode.
-     */
-    private JToolBar toolBarActions = new JToolBar(JToolBar.VERTICAL);
-    private JToolBar toolBarToggle = new JToolBar(JToolBar.VERTICAL);
-    /**
-     * The status line below the map
-     */
-    public MapStatus statusLine;
+    private final List<IconToggleButton> allDialogButtons = new ArrayList<IconToggleButton>();
+    public final 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);
+    }
 
     // Toggle dialogs
@@ -113,35 +129,24 @@
     // Map modes
     public final SelectAction mapModeSelect;
+    private final Map<Layer, MapMode> lastMapMode = new HashMap<Layer, MapMode>();
     private final MapMode mapModeDraw;
     private final MapMode mapModeZoom;
 
     /**
-     * The panel list of all toggle dialog icons. To add new toggle dialog actions, use addToggleDialog
-     * instead of adding directly to this list.
-     */
-    private List<ToggleDialog> allDialogs = new ArrayList<ToggleDialog>();
+     * The status line below the map
+     */
+    public MapStatus statusLine;
+
+    /**
+     * The split pane with the mapview (leftPanel) and toggle dialogs (dialogsPanel).
+     */
+    private final JSplitPane splitPane;
     private final JPanel leftPanel;
     private final DialogsPanel dialogsPanel;
 
-    public final ButtonGroup toolGroup = new ButtonGroup();
-
-    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);
-    }
-
     /**
      * Default width of the toggle dialog area.
      */
     public static final int DEF_TOGGLE_DLG_WIDTH = 330;
-
-    private final Map<Layer, MapMode> lastMapMode = new HashMap<Layer, MapMode>();
 
     /**
@@ -157,28 +162,14 @@
 
         mapView = new MapView(contentPane, viewportData);
-
         new FileDrop(mapView);
+
+        splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, true);
 
         leftPanel = new JPanel();
         leftPanel.setLayout(new GridBagLayout());
-
         leftPanel.add(mapView, GBC.std().fill());
-
-        // toolbar
-        toolBarActions.setFloatable(false);
-        addMapMode(new IconToggleButton(mapModeSelect = new SelectAction(this)));
-        addMapMode(new IconToggleButton(new LassoModeAction(), true));
-        addMapMode(new IconToggleButton(mapModeDraw = new DrawAction(this)));
-        addMapMode(new IconToggleButton(mapModeZoom = new ZoomAction(this)));
-        addMapMode(new IconToggleButton(new DeleteAction(this), true));
-        addMapMode(new IconToggleButton(new ParallelWayAction(this), true));
-        addMapMode(new IconToggleButton(new ExtrudeAction(this), true));
-        addMapMode(new IconToggleButton(new ImproveWayAccuracyAction(Main.map), true));
-
-        toolGroup.setSelected(((AbstractButton)toolBarActions.getComponent(0)).getModel(), true);
-
-        JSplitPane splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, true);
+        splitPane.setLeftComponent(leftPanel);
+
         dialogsPanel = new DialogsPanel(splitPane);
-        splitPane.setLeftComponent(leftPanel);
         splitPane.setRightComponent(dialogsPanel);
 
@@ -212,9 +203,20 @@
         dialogsPanel.setLayout(new BoxLayout(dialogsPanel, BoxLayout.Y_AXIS));
         dialogsPanel.setPreferredSize(new Dimension(Main.pref.getInteger("toggleDialogs.width",DEF_TOGGLE_DLG_WIDTH), 0));
-
         dialogsPanel.setMinimumSize(new Dimension(24, 0));
         mapView.setMinimumSize(new Dimension(10,0));
 
-        toolBarToggle.setFloatable(false);
+        // toolBarActions, map mode buttons
+        addMapMode(new IconToggleButton(mapModeSelect = new SelectAction(this)));
+        addMapMode(new IconToggleButton(new LassoModeAction(), true));
+        addMapMode(new IconToggleButton(mapModeDraw = new DrawAction(this)));
+        addMapMode(new IconToggleButton(mapModeZoom = new ZoomAction(this)));
+        addMapMode(new IconToggleButton(new DeleteAction(this), true));
+        addMapMode(new IconToggleButton(new ParallelWayAction(this), true));
+        addMapMode(new IconToggleButton(new ExtrudeAction(this), true));
+        addMapMode(new IconToggleButton(new ImproveWayAccuracyAction(Main.map), true));
+        toolBarActionsGroup.setSelected(allMapModeButtons.get(0).getModel(), true);
+        toolBarActions.setFloatable(false);
+
+        // toolBarToggles, toggle dialog buttons
         LayerListDialog.createInstance(this);
         addToggleDialog(LayerListDialog.getInstance());
@@ -230,4 +232,5 @@
         addToggleDialog(new ChangesetDialog(this), true);
         addToggleDialog(new MapPaintDialog());
+        toolBarToggle.setFloatable(false);
 
         // status line below the map
@@ -261,4 +264,5 @@
      * Delegates the call to all Destroyables within this component (e.g. MapModes)
      */
+    @Override
     public void destroy() {
         MapView.removeLayerChangeListener(this);
@@ -310,5 +314,5 @@
         final IconToggleButton button = new IconToggleButton(dlg.getToggleAction(), isExpert);
         button.setShowHideButtonListener(dlg);
-        addHideContextMenu(button);
+        button.setInheritsPopupMenu(true);
         dlg.setButton(button);
         toolBarToggle.add(button);
@@ -325,13 +329,13 @@
 
     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);
+        allMapModeButtons.add(b);
+        toolBarActionsGroup.add(b);
+        toolBarActions.add(b);
         b.applyButtonHiddenPreferences();
+        b.setInheritsPopupMenu(true);
     }
 
@@ -392,45 +396,78 @@
     public void fillPanel(Container panel) {
         panel.add(this, BorderLayout.CENTER);
-        JToolBar jb = new JToolBar(JToolBar.VERTICAL);
-        jb.setFloatable(false);
+
+        /**
+         * sideToolBar: add map modes icons
+         */
+        if(Main.pref.getBoolean("sidetoolbar.mapmodes.visible", true)) {
         toolBarActions.setAlignmentX(0.5f);
-        jb.add(toolBarActions);
+            toolBarActions.setInheritsPopupMenu(true);
+            sideToolBar.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));
+            listAllMapModesButton.setInheritsPopupMenu(true);
+            sideToolBar.add(listAllMapModesButton);
+        }
+
+        /**
+         * sideToolBar: add toggle dialogs icons
+         */
+        if(Main.pref.getBoolean("sidetoolbar.toggledialogs.visible", true)) {
+            ((JToolBar)sideToolBar).addSeparator(new Dimension(0,18));
             toolBarToggle.setAlignmentX(0.5f);
-            jb.add(toolBarToggle);
+            toolBarToggle.setInheritsPopupMenu(true);
+            sideToolBar.add(toolBarToggle);
             listAllToggleDialogsButton.setAlignmentX(0.5f);
             listAllToggleDialogsButton.setBorder(null);
             listAllToggleDialogsButton.setFont(listAllToggleDialogsButton.getFont().deriveFont(Font.PLAIN));
-            jb.add(listAllToggleDialogsButton);
-        }
-
-        final Component toToggle;
-        if (Main.pref.getBoolean("sidetoolbar.scrollable", true)) {
-            final ScrollViewport svp = new ScrollViewport(jb, ScrollViewport.VERTICAL_DIRECTION);
-            toToggle = svp;
-            panel.add(svp, BorderLayout.WEST);
-            jb.addMouseWheelListener(new MouseWheelListener() {
-
-                public void mouseWheelMoved(MouseWheelEvent e) {
-                    svp.scroll(0, e.getUnitsToScroll() * 5);
+            listAllToggleDialogsButton.setInheritsPopupMenu(true);
+            sideToolBar.add(listAllToggleDialogsButton);
+        }
+
+        /**
+         * sideToolBar: add dynamic popup menu
+         */
+        sideToolBar.setComponentPopupMenu(new JPopupMenu() {
+            final int staticMenuEntryCount = 2;
+            JCheckBoxMenuItem doNotHide = new JCheckBoxMenuItem(new AbstractAction(tr("Do not hide toolbar")) {
+                @Override
+                public void actionPerformed(ActionEvent e) {
+                    boolean sel = ((JCheckBoxMenuItem) e.getSource()).getState();
+                    Main.pref.put("sidetoolbar.always-visible", sel);
                 }
             });
-        } else {
-            toToggle = jb;
-            panel.add(jb, BorderLayout.WEST);
-        }
-        toToggle.setVisible(Main.pref.getBoolean("sidetoolbar.visible", true));
-
-        jb.addMouseListener(new PopupMenuLauncher(new JPopupMenu() {
-
             {
+                addPopupMenuListener(new PopupMenuListener() {
+                    @Override
+                    public void popupMenuWillBecomeVisible(PopupMenuEvent e) {
+                        final Object src = ((JPopupMenu)e.getSource()).getInvoker();
+                        if (src instanceof IconToggleButton) {
+                            insert(new Separator(), 0);
+                            insert(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) {
+                                    ((IconToggleButton)src).setButtonHidden(true);
+                                    validateToolBarsVisibility();
+                                }
+                            }, 0);
+                        }
+                        doNotHide.setSelected(Main.pref.getBoolean("sidetoolbar.always-visible", true));
+                    }
+                    @Override
+                    public void popupMenuWillBecomeInvisible(PopupMenuEvent e) {
+                        while (getComponentCount() > staticMenuEntryCount) {
+                            remove(0);
+                        }
+                    }
+                    @Override
+                    public void popupMenuCanceled(PopupMenuEvent e) {}
+                });
+
                 add(new AbstractAction(tr("Hide edit toolbar")) {
-
                     @Override
                     public void actionPerformed(ActionEvent e) {
@@ -438,13 +475,28 @@
                     }
                 });
-            }
-        }));
-
+                add(doNotHide);
+            }
+        });
+        ((JToolBar)sideToolBar).setFloatable(false);
+
+        /**
+         * sideToolBar: decide scroll- and visibility
+         */
+        if(Main.pref.getBoolean("sidetoolbar.scrollable", true)) {
+            final ScrollViewport svp = new ScrollViewport(sideToolBar, ScrollViewport.VERTICAL_DIRECTION);
+            svp.addMouseWheelListener(new MouseWheelListener() {
+                @Override
+                public void mouseWheelMoved(MouseWheelEvent e) {
+                    svp.scroll(0, e.getUnitsToScroll() * 5);
+                }
+            });
+            sideToolBar = svp;
+        }
+        sideToolBar.setVisible(Main.pref.getBoolean("sidetoolbar.visible", true));
         sidetoolbarPreferencesChangedListener = new Preferences.PreferenceChangedListener() {
-
             @Override
             public void preferenceChanged(PreferenceChangeEvent e) {
                 if ("sidetoolbar.visible".equals(e.getKey())) {
-                    toToggle.setVisible(Main.pref.getBoolean("sidetoolbar.visible"));
+                    sideToolBar.setVisible(Main.pref.getBoolean("sidetoolbar.visible"));
                 }
             }
@@ -452,26 +504,15 @@
         Main.pref.addPreferenceChangeListener(sidetoolbarPreferencesChangedListener);
 
+        /**
+         * sideToolBar: add it to the panel
+         */
+        panel.add(sideToolBar, BorderLayout.WEST);
+
+        /**
+         * statusLine: add to panel
+         */
         if (statusLine != null && Main.pref.getBoolean("statusline.visible", true)) {
             panel.add(statusLine, BorderLayout.SOUTH);
         }
-    }
-
-    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();
-                    }
-                });
-            }
-        }));
     }
 
@@ -544,14 +585,22 @@
     }
 
+    public void setDialogsPanelVisible(boolean visible) {
+        rememberToggleDialogWidth();
+        dialogsPanel.setVisible(visible);
+        splitPane.setDividerLocation(visible?splitPane.getWidth()-Main.pref.getInteger("toggleDialogs.width",DEF_TOGGLE_DLG_WIDTH):0);
+        splitPane.setDividerSize(visible?5:0);
+    }
+
     /**
      * Remember the current width of the (possibly resized) toggle dialog area
      */
     public void rememberToggleDialogWidth() {
-        Main.pref.putInteger("toggleDialogs.width", dialogsPanel.getWidth());
+        if (dialogsPanel.isVisible()) {
+            Main.pref.putInteger("toggleDialogs.width", splitPane.getWidth()-splitPane.getDividerLocation());
+    }
     }
 
     /*
-     * Remove panel from top of MapView by class
-     */
+     * Remove panel from top of MapView by class     */
     public void removeTopPanel(Class<?> type) {
         int n = leftPanel.getComponentCount();
@@ -653,5 +702,5 @@
         // and possibly need to be hidden/shown.
         SwingUtilities.invokeLater(new Runnable() {
-            public void run() {
+            @Override public void run() {
                 validateToolBarsVisibility();
             }
Index: /trunk/src/org/openstreetmap/josm/gui/MapStatus.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/MapStatus.java	(revision 5964)
+++ /trunk/src/org/openstreetmap/josm/gui/MapStatus.java	(revision 5965)
@@ -6,5 +6,4 @@
 
 import java.awt.AWTEvent;
-import java.awt.Color;
 import java.awt.Component;
 import java.awt.Cursor;
@@ -17,4 +16,5 @@
 import java.awt.Toolkit;
 import java.awt.event.AWTEventListener;
+import java.awt.event.ActionEvent;
 import java.awt.event.InputEvent;
 import java.awt.event.KeyAdapter;
@@ -29,7 +29,12 @@
 import java.util.List;
 
+import javax.swing.AbstractAction;
 import javax.swing.BorderFactory;
+import javax.swing.JButton;
+import javax.swing.JCheckBoxMenuItem;
 import javax.swing.JLabel;
+import javax.swing.JMenuItem;
 import javax.swing.JPanel;
+import javax.swing.JPopupMenu;
 import javax.swing.JProgressBar;
 import javax.swing.JScrollPane;
@@ -37,4 +42,6 @@
 import javax.swing.PopupFactory;
 import javax.swing.UIManager;
+import javax.swing.event.PopupMenuEvent;
+import javax.swing.event.PopupMenuListener;
 
 import org.openstreetmap.josm.Main;
@@ -47,7 +54,8 @@
 import org.openstreetmap.josm.gui.progress.PleaseWaitProgressMonitor.ProgressMonitorDialog;
 import org.openstreetmap.josm.gui.util.GuiHelper;
+import org.openstreetmap.josm.gui.widgets.ImageLabel;
+import org.openstreetmap.josm.gui.widgets.JosmTextField;
 import org.openstreetmap.josm.tools.GBC;
 import org.openstreetmap.josm.tools.ImageProvider;
-import org.openstreetmap.josm.gui.widgets.JosmTextField;
 
 /**
@@ -72,34 +80,4 @@
     final Collector collector;
 
-    /**
-     * A small user interface component that consists of an image label and
-     * a fixed text content to the right of the image.
-     */
-    static class ImageLabel extends JPanel {
-        static Color backColor = Color.decode("#b8cfe5");
-        static Color backColorActive = Color.decode("#aaff5e");
-            
-        private JLabel tf;
-        private int chars;
-        public ImageLabel(String img, String tooltip, int chars) {
-            super();
-            setLayout(new GridBagLayout());
-            setBackground(backColor);
-            add(new JLabel(ImageProvider.get("statusline/"+img+".png")), GBC.std().anchor(GBC.WEST).insets(0,1,1,0));
-            add(tf = new JLabel(), GBC.std().fill(GBC.BOTH).anchor(GBC.WEST).insets(2,1,1,0));
-            setToolTipText(tooltip);
-            this.chars = chars;
-        }
-        public void setText(String t) {
-            tf.setText(t);
-        }
-        @Override public Dimension getPreferredSize() {
-            return new Dimension(25 + chars*tf.getFontMetrics(tf.getFont()).charWidth('0'), super.getPreferredSize().height);
-        }
-        @Override public Dimension getMinimumSize() {
-            return new Dimension(25 + chars*tf.getFontMetrics(tf.getFont()).charWidth('0'), super.getMinimumSize().height);
-        }
-    }
-
     public class BackgroundProgressMonitor implements ProgressMonitorDialog {
 
@@ -115,8 +93,10 @@
         }
 
+        @Override
         public void setVisible(boolean visible) {
             progressBar.setVisible(visible);
         }
 
+        @Override
         public void updateProgress(int progress) {
             progressBar.setValue(progress);
@@ -125,4 +105,5 @@
         }
 
+        @Override
         public void setCustomText(String text) {
             this.customText = text;
@@ -130,4 +111,5 @@
         }
 
+        @Override
         public void setCurrentAction(String text) {
             this.title = text;
@@ -135,4 +117,5 @@
         }
 
+        @Override
         public void setIndeterminate(boolean newValue) {
             UIManager.put("ProgressBar.cycleTime", UIManager.getInt("ProgressBar.repaintInterval") * 100);
@@ -218,4 +201,5 @@
          * Execution function for the Collector.
          */
+        @Override
         public void run() {
             registerListeners();
@@ -281,5 +265,7 @@
                                     // Set the text label in the bottom status bar
                                     // "if mouse moved only" was added to stop heap growing
-                                    if (!mouseNotMoved) statusBarElementUpdate(ms);
+                                    if (!mouseNotMoved) {
+                                        statusBarElementUpdate(ms);
+                                    }
 
 
@@ -363,5 +349,5 @@
          * @return popup
          */
-        private final Popup popupCreatePopup(Component content, MouseState ms) {
+        private Popup popupCreatePopup(Component content, MouseState ms) {
             Point p = mv.getLocationOnScreen();
             Dimension scrn = Toolkit.getDefaultToolkit().getScreenSize();
@@ -399,5 +385,5 @@
          * @param ms
          */
-        private final void statusBarElementUpdate(MouseState ms) {
+        private void statusBarElementUpdate(MouseState ms) {
             final OsmPrimitive osmNearest = mv.getNearestNodeOrWay(ms.mousePos, OsmPrimitive.isUsablePredicate, false);
             if (osmNearest != null) {
@@ -414,5 +400,5 @@
          * @param mods modifiers (i.e. control keys)
          */
-        private final void popupCycleSelection(Collection<OsmPrimitive> osms, int mods) {
+        private void popupCycleSelection(Collection<OsmPrimitive> osms, int mods) {
             DataSet ds = Main.main.getCurrentDataSet();
             // Find some items that are required for cycling through
@@ -453,5 +439,5 @@
          * Tries to hide the given popup
          */
-        private final void popupHidePopup() {
+        private void popupHidePopup() {
             popupLabels = null;
             if(popup == null)
@@ -460,5 +446,7 @@
             popup = null;
             EventQueue.invokeLater(new Runnable(){
-                public void run() { staticPopup.hide(); }});
+               public void run() {
+                    staticPopup.hide(); 
+                }});
         }
 
@@ -469,5 +457,5 @@
          * @param lbls lables to show (see {@link #popupLabels})
          */
-        private final void popupShowPopup(Popup newPopup, List<JLabel> lbls) {
+        private void popupShowPopup(Popup newPopup, List<JLabel> lbls) {
             final Popup staticPopup = newPopup;
             if(this.popup != null) {
@@ -476,5 +464,5 @@
                 final Popup staticOldPopup = this.popup;
                 EventQueue.invokeLater(new Runnable(){
-                    public void run() {
+                    @Override public void run() {
                         staticPopup.show();
                         staticOldPopup.hide();
@@ -484,5 +472,5 @@
                 // There is no old popup
                 EventQueue.invokeLater(new Runnable(){
-                    public void run() { staticPopup.show(); }});
+                     @Override public void run() { staticPopup.show(); }});
             }
             this.popupLabels = lbls;
@@ -495,5 +483,5 @@
          * user clicks on the map instead of the popup.
          */
-        private final void popupUpdateLabels() {
+        private void popupUpdateLabels() {
             if(this.popup == null || this.popupLabels == null)
                 return;
@@ -510,5 +498,5 @@
          * @param osm The primitive to derive the colors from
          */
-        private final void popupSetLabelColors(JLabel lbl, OsmPrimitive osm) {
+        private void popupSetLabelColors(JLabel lbl, OsmPrimitive osm) {
             DataSet ds = Main.main.getCurrentDataSet();
             if(ds.isSelected(osm)) {
@@ -527,5 +515,5 @@
          * @return labels for info popup
          */
-        private final JLabel popupBuildPrimitiveLabels(final OsmPrimitive osm) {
+        private JLabel popupBuildPrimitiveLabels(final OsmPrimitive osm) {
             final StringBuilder text = new StringBuilder();
             String name = osm.getDisplayName(DefaultNameFormatter.getInstance());
@@ -587,9 +575,9 @@
             // can correct this defect.
             l.addMouseMotionListener(new MouseMotionListener() {
-                public void mouseMoved(MouseEvent e) {
+                 @Override public void mouseMoved(MouseEvent e) {
                     l.setBackground(SystemColor.info);
                     l.setForeground(SystemColor.infoText);
                 }
-                public void mouseDragged(MouseEvent e) {
+                 @Override public void mouseDragged(MouseEvent e) {
                     l.setBackground(SystemColor.info);
                     l.setForeground(SystemColor.infoText);
@@ -614,5 +602,6 @@
 
     private AWTEventListener awtListener = new AWTEventListener() {
-        public void eventDispatched(AWTEvent event) {
+         @Override 
+         public void eventDispatched(AWTEvent event) {
             if (event instanceof InputEvent &&
                     ((InputEvent)event).getComponent() == mv) {
@@ -629,4 +618,5 @@
 
     private MouseMotionListener mouseMotionListener = new MouseMotionListener() {
+        @Override
         public void mouseMoved(MouseEvent e) {
             synchronized (collector) {
@@ -637,4 +627,5 @@
         }
 
+        @Override
         public void mouseDragged(MouseEvent e) {
             mouseMoved(e);
@@ -686,12 +677,36 @@
         this.collector = new Collector(mapFrame);
 
-        lonText.addMouseListener(Main.main.menu.jumpToAct);
-        latText.addMouseListener(Main.main.menu.jumpToAct);
-        
+        // Context menu of status bar
+        setComponentPopupMenu(new JPopupMenu() {
+            JCheckBoxMenuItem doNotHide = new JCheckBoxMenuItem(new AbstractAction(tr("Do not hide status bar")) {
+                @Override public void actionPerformed(ActionEvent e) {
+                    boolean sel = ((JCheckBoxMenuItem) e.getSource()).getState();
+                    Main.pref.put("statusbar.always-visible", sel);
+                }
+            });
+            JMenuItem jumpButton;
+            {
+                jumpButton = add(Main.main.menu.jumpToAct);
+                addPopupMenuListener(new PopupMenuListener() {
+                    @Override
+                    public void popupMenuWillBecomeVisible(PopupMenuEvent e) {
+                        Component invoker = ((JPopupMenu)e.getSource()).getInvoker(); 
+                        jumpButton.setVisible(invoker == latText || invoker == lonText);
+                        doNotHide.setSelected(Main.pref.getBoolean("statusbar.always-visible", true));
+                    }
+                    @Override public void popupMenuWillBecomeInvisible(PopupMenuEvent e) {}
+                    @Override public void popupMenuCanceled(PopupMenuEvent e) {}
+                });
+                add(doNotHide);
+            }
+        });
+
         // Listen for mouse movements and set the position text field
         mv.addMouseMotionListener(new MouseMotionListener(){
+            @Override
             public void mouseDragged(MouseEvent e) {
                 mouseMoved(e);
             }
+            @Override
             public void mouseMoved(MouseEvent e) {
                 if (mv.center == null)
@@ -709,4 +724,13 @@
         setLayout(new GridBagLayout());
         setBorder(BorderFactory.createEmptyBorder(5,5,5,5));
+
+        latText.setInheritsPopupMenu(true);
+        lonText.setInheritsPopupMenu(true);
+        headingText.setInheritsPopupMenu(true);
+        //angleText.setInheritsPopupMenu(true);
+        distText.setInheritsPopupMenu(true);
+        nameText.setInheritsPopupMenu(true);
+        //helpText.setInheritsPopupMenu(true);
+        //progressBar.setInheritsPopupMenu(true);
 
         add(latText, GBC.std());
@@ -745,4 +769,5 @@
     }
 
+    @Override
     public String helpTopic() {
         return ht("/Statusline");
Index: /trunk/src/org/openstreetmap/josm/gui/MapView.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/MapView.java	(revision 5964)
+++ /trunk/src/org/openstreetmap/josm/gui/MapView.java	(revision 5965)
@@ -23,5 +23,4 @@
 import java.util.Collections;
 import java.util.Comparator;
-import java.util.Enumeration;
 import java.util.LinkedList;
 import java.util.List;
@@ -261,8 +260,8 @@
         //store the last mouse action
         this.addMouseMotionListener(new MouseMotionListener() {
-            public void mouseDragged(MouseEvent e) {
+            @Override public void mouseDragged(MouseEvent e) {
                 mouseMoved(e);
             }
-            public void mouseMoved(MouseEvent e) {
+            @Override public void mouseMoved(MouseEvent e) {
                 lastMEvent = e;
             }
@@ -483,5 +482,5 @@
                 ret,
                 new Comparator<Layer>() {
-                    public int compare(Layer l1, Layer l2) {
+                    @Override public int compare(Layer l1, Layer l2) {
                         if (l1 instanceof OsmDataLayer && l2 instanceof OsmDataLayer) {
                             if (l1 == getActiveLayer()) return -1;
@@ -780,14 +779,12 @@
          * that I switch layers and actions at the same time and it was annoying to mind the
          * order. This way it works as visual clue for new users */
-        for (Enumeration<AbstractButton> e = Main.map.toolGroup.getElements() ; e.hasMoreElements() ;) {
-            AbstractButton button = e.nextElement();
-            MapMode mode = (MapMode)button.getAction();
-            boolean isLayerSupported = mode.layerIsSupported(layer);
-            button.setEnabled(isLayerSupported);
-            // Also update associated shortcut (fix #6876)
-            if (isLayerSupported) {
-                Main.registerActionShortcut(mode, mode.getShortcut());
+        for (AbstractButton b: Main.map.allMapModeButtons) {
+            MapMode mode = (MapMode)b.getAction();
+            if (mode.layerIsSupported(layer)) {
+                Main.registerActionShortcut(mode, mode.getShortcut()); //fix #6876
+                b.setEnabled(true);
             } else {
                 Main.unregisterShortcut(mode.getShortcut());
+                b.setEnabled(false);
             }
         }
@@ -859,4 +856,5 @@
     }
 
+    @Override
     public void propertyChange(PropertyChangeEvent evt) {
         if (evt.getPropertyName().equals(Layer.VISIBLE_PROP)) {
@@ -894,5 +892,5 @@
 
     private SelectionChangedListener repaintSelectionChangedListener = new SelectionChangedListener(){
-        public void selectionChanged(Collection<? extends OsmPrimitive> newSelection) {
+        @Override public void selectionChanged(Collection<? extends OsmPrimitive> newSelection) {
             repaint();
         }
Index: /trunk/src/org/openstreetmap/josm/gui/preferences/ToolbarPreferences.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/preferences/ToolbarPreferences.java	(revision 5964)
+++ /trunk/src/org/openstreetmap/josm/gui/preferences/ToolbarPreferences.java	(revision 5965)
@@ -30,4 +30,5 @@
 import java.util.Map;
 
+import javax.swing.AbstractAction;
 import javax.swing.Action;
 import javax.swing.DefaultListCellRenderer;
@@ -36,4 +37,5 @@
 import javax.swing.ImageIcon;
 import javax.swing.JButton;
+import javax.swing.JCheckBoxMenuItem;
 import javax.swing.JComponent;
 import javax.swing.JLabel;
@@ -51,4 +53,6 @@
 import javax.swing.event.ListSelectionEvent;
 import javax.swing.event.ListSelectionListener;
+import javax.swing.event.PopupMenuEvent;
+import javax.swing.event.PopupMenuListener;
 import javax.swing.event.TreeSelectionEvent;
 import javax.swing.event.TreeSelectionListener;
@@ -66,5 +70,4 @@
 import org.openstreetmap.josm.actions.ParameterizedActionDecorator;
 import org.openstreetmap.josm.gui.tagging.TaggingPreset;
-import org.openstreetmap.josm.gui.widgets.PopupMenuLauncher;
 import org.openstreetmap.josm.tools.GBC;
 import org.openstreetmap.josm.tools.ImageProvider;
@@ -72,5 +75,4 @@
 
 public class ToolbarPreferences implements PreferenceSettingFactory {
-
 
     private static final String EMPTY_TOOLBAR_MARKER = "<!-empty-!>";
@@ -228,8 +230,9 @@
                     skip('=');
                     String paramValue = readTillChar(',','}');
-                    if ("icon".equals(paramName) && paramValue.length() > 0)
+                    if ("icon".equals(paramName) && paramValue.length() > 0) {
                         result.setIcon(paramValue);
-                    else if("name".equals(paramName) && paramValue.length() > 0)
+                    } else if("name".equals(paramName) && paramValue.length() > 0) {
                         result.setName(paramValue);
+                    }
                     skip(',');
                 }
@@ -294,6 +297,7 @@
                     first = false;
                 }
-                if(!first)
+                if(!first) {
                     result.append('}');
+            }
             }
 
@@ -339,6 +343,7 @@
                         return null;
                     }
-                } else
+                } else {
                     rowIndex -= 2;
+            }
             }
             ActionParameter<Object> param = getParam(rowIndex);
@@ -368,6 +373,7 @@
                      currentAction.setIcon((String)aValue);
                      return;
-                } else
+                } else {
                     rowIndex -= 2;
+            }
             }
             ActionParameter<Object> param = getParam(rowIndex);
@@ -383,15 +389,21 @@
     }
 
-    private static class ToolbarPopupMenu extends JPopupMenu {
-        public ToolbarPopupMenu(final ActionDefinition action) {
-
-            if(action != null) {
-                add(tr("Remove from toolbar",action.getDisplayName()))
-                        .addActionListener(new ActionListener() {
-                            @Override public void actionPerformed(ActionEvent e) {
+    private class ToolbarPopupMenu extends JPopupMenu  {
+        ActionDefinition act;
+
+        private void setActionAndAdapt(ActionDefinition action) {
+            this.act = action;
+            doNotHide.setSelected(Main.pref.getBoolean("toolbar.always-visible", true));
+            remove.setVisible(act!=null);
+            shortcutEdit.setVisible(act!=null);
+        }
+
+        JMenuItem remove = new JMenuItem(new AbstractAction(tr("Remove from toolbar")) {
+            @Override
+            public void actionPerformed(ActionEvent e) {
                                 Collection<String> t = new LinkedList<String>(getToolString());
                                 ActionParser parser = new ActionParser(null);
                                 // get text definition of current action
-                                String res = parser.saveAction(action);
+                String res = parser.saveAction(act);
                                 // remove the button from toolbar preferences
                                 t.remove( res );
@@ -400,8 +412,8 @@
                             }
                 });
-            }
             
-            add(tr("Configure toolbar")).addActionListener(new ActionListener() {
-                @Override public void actionPerformed(ActionEvent e) {
+        JMenuItem configure = new JMenuItem(new AbstractAction(tr("Configure toolbar")) {
+            @Override
+            public void actionPerformed(ActionEvent e) {
                     final PreferenceDialog p =new PreferenceDialog(Main.parent);
                     p.selectPreferencesTabByName("toolbar");
@@ -410,16 +422,46 @@
             });
 
-            add(tr("Edit shortcut")).addActionListener(new ActionListener() {
-                @Override public void actionPerformed(ActionEvent e) {
+        JMenuItem shortcutEdit = new JMenuItem(new AbstractAction(tr("Edit shortcut")) {
+            @Override
+            public void actionPerformed(ActionEvent e) {
                     final PreferenceDialog p =new PreferenceDialog(Main.parent);
-                    p.getTabbedPane().getShortcutPreference().setDefaultFilter(action.getDisplayName());
+                p.getTabbedPane().getShortcutPreference().setDefaultFilter(act.getDisplayName());
                     p.selectPreferencesTabByName("shortcuts");
                     p.setVisible(true);
-                    // refresh toolbar to accept changes of shortcuts without restart
+                // refresh toolbar to try using changed shortcuts without restart
                     Main.toolbar.refreshToolbarControl(); 
                 }
             });
-        }
-    }
+
+        JCheckBoxMenuItem doNotHide = new JCheckBoxMenuItem(new AbstractAction(tr("getSt hide toolbar and menu")) {
+            @Override
+            public void actionPerformed(ActionEvent e) {
+                boolean sel = ((JCheckBoxMenuItem) e.getSource()).getState();
+                Main.pref.put("toolbar.always-visible", sel);
+                Main.pref.put("menu.always-visible", sel);
+        }
+        });
+        {
+            addPopupMenuListener(new PopupMenuListener() {
+                @Override
+                public void popupMenuWillBecomeVisible(PopupMenuEvent e) {
+                    setActionAndAdapt(buttonActions.get(
+                            ((JPopupMenu)e.getSource()).getInvoker()
+                    ));
+    }
+                @Override
+                public void popupMenuWillBecomeInvisible(PopupMenuEvent e) {}
+
+                @Override
+                public void popupMenuCanceled(PopupMenuEvent e) {}
+            });
+            add(remove);
+            add(configure);
+            add(shortcutEdit);
+            add(doNotHide);
+        }
+    }
+
+    private ToolbarPopupMenu popupMenu = new ToolbarPopupMenu();
 
     /**
@@ -433,4 +475,5 @@
 
     public JToolBar control = new JToolBar();
+    private HashMap<Object, ActionDefinition> buttonActions = new HashMap<Object, ActionDefinition>(30);
 
     @Override
@@ -826,7 +869,8 @@
                 } else {
                     String res = parser.saveAction(action);
-                    if(res != null)
+                    if(res != null) {
                         t.add(res);
                 }
+            }
             }
             if (t.isEmpty()) {
@@ -842,5 +886,5 @@
     public ToolbarPreferences() {
         control.setFloatable(false);
-        control.addMouseListener(new PopupMenuLauncher(new ToolbarPopupMenu(null)));
+        control.setComponentPopupMenu(popupMenu);
     }
 
@@ -979,4 +1023,5 @@
     public void refreshToolbarControl() {
         control.removeAll();
+        buttonActions.clear();
 
         for (ActionDefinition action : getDefinedActions()) {
@@ -985,4 +1030,5 @@
             } else {
                 final JButton b = addButtonAndShortcut(action);
+                buttonActions.put(b, action);
                 
                 Icon i = action.getDisplayIcon();
@@ -1001,5 +1047,5 @@
                     });
                 }
-                b.addMouseListener(new PopupMenuLauncher( new ToolbarPopupMenu(action)));
+                b.setInheritsPopupMenu(true);
             }
         }
@@ -1014,5 +1060,7 @@
         if (action.getAction() instanceof JosmAction) {
             sc = ((JosmAction) action.getAction()).getShortcut();
-            if (sc.getAssignedKey() == KeyEvent.CHAR_UNDEFINED) sc = null;
+            if (sc.getAssignedKey() == KeyEvent.CHAR_UNDEFINED) {
+                sc = null;
+        }
         }
 
@@ -1023,10 +1071,16 @@
         
         String tt = action.getDisplayTooltip();
-        if (tt==null) tt="";
+        if (tt==null) {
+            tt="";
+        }
 
         if (sc == null || paramCode != 0) {
             String name = (String) action.getAction().getValue("toolbar");
-            if (name==null) name=action.getDisplayName();
-            if (paramCode!=0) name = name+paramCode;
+            if (name==null) {
+                name=action.getDisplayName();
+            }
+            if (paramCode!=0) {
+                name = name+paramCode;
+            }
             String desc = action.getDisplayName() + ((paramCode==0)?"":action.parameters.toString());
             sc = Shortcut.registerShortcut("toolbar:"+name, tr("Toolbar: {0}", desc),
@@ -1044,5 +1098,7 @@
         }
         
-        if (!tt.isEmpty()) b.setToolTipText(tt);
+        if (!tt.isEmpty()) {
+            b.setToolTipText(tt);
+        }
         return b;
     }
Index: /trunk/src/org/openstreetmap/josm/gui/widgets/ImageLabel.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/widgets/ImageLabel.java	(revision 5965)
+++ /trunk/src/org/openstreetmap/josm/gui/widgets/ImageLabel.java	(revision 5965)
@@ -0,0 +1,44 @@
+// License: GPL. See LICENSE file for details.
+package org.openstreetmap.josm.gui.widgets;
+
+import java.awt.Color;
+import java.awt.Dimension;
+import java.awt.GridBagLayout;
+import javax.swing.JLabel;
+import javax.swing.JPanel;
+import org.openstreetmap.josm.tools.GBC;
+import org.openstreetmap.josm.tools.ImageProvider;
+
+
+/**
+ * A small user interface component that consists of an image label and
+ * a fixed text content to the right of the image.
+ * Moved from @link org.openstreetmap.josm.gui.MapStatus @since 5965
+ */
+public class ImageLabel extends JPanel {
+    public static final Color backColor = Color.decode("#b8cfe5");
+    public static final Color backColorActive = Color.decode("#aaff5e");
+
+    private JLabel tf;
+    private int charCount;
+    
+    public ImageLabel(String img, String tooltip, int charCount) {
+        super();
+        setLayout(new GridBagLayout());
+        setBackground(backColor);
+        add(new JLabel(ImageProvider.get("statusline/"+img+".png")), GBC.std().anchor(GBC.WEST).insets(0,1,1,0));
+        add(tf = new JLabel(), GBC.std().fill(GBC.BOTH).anchor(GBC.WEST).insets(2,1,1,0));
+        setToolTipText(tooltip);
+        this.charCount = charCount;
+    }
+    
+    public void setText(String t) {
+        tf.setText(t);
+    }
+    @Override public Dimension getPreferredSize() {
+        return new Dimension(25 + charCount*tf.getFontMetrics(tf.getFont()).charWidth('0'), super.getPreferredSize().height);
+    }
+    @Override public Dimension getMinimumSize() {
+        return new Dimension(25 + charCount*tf.getFontMetrics(tf.getFont()).charWidth('0'), super.getMinimumSize().height);
+    }
+}
