Ticket #6953: MapModeToolbarCustomization.patch

File MapModeToolbarCustomization.patch, 4.9 KB (added by akks, 8 years ago)
  • src/org/openstreetmap/josm/gui/MapFrame.java

     
    1616import java.util.HashMap;
    1717import java.util.List;
    1818import java.util.Map;
     19import java.util.Enumeration;
    1920import java.util.concurrent.CopyOnWriteArrayList;
    2021
    2122import javax.swing.AbstractAction;
     
    108109    public final ButtonGroup toolGroup = new ButtonGroup();
    109110
    110111    public final JButton otherButton = new JButton(new OtherButtonsAction());
     112    public final JButton otherMapModeButton = new JButton(new OtherMapModesAction());
    111113
    112114    /**
    113115     * Default width of the toggle dialog area.
     
    296298            }
    297299        }
    298300    }
    299 
    300     public void addMapMode(IconToggleButton b) {
     301   
     302    public void addMapMode(final IconToggleButton b) {
    301303        toolBarActions.add(b);
    302304        toolGroup.add(b);
    303305        if (b.getAction() instanceof MapMode) {
    304306            mapModes.add((MapMode) b.getAction());
    305307        } else
    306308            throw new IllegalArgumentException("MapMode action must be subclass of MapMode");
     309       
     310        //context menu
     311        b.addMouseListener(new PopupMenuLauncher(new JPopupMenu() {
     312            {
     313                add(new AbstractAction() {
     314                    {
     315                        putValue(NAME, tr("Hide this button"));
     316                        putValue(SHORT_DESCRIPTION, tr("Click the arrow at the bottom to show it again."));
     317                    }
     318                    @Override
     319                    public void actionPerformed(ActionEvent e) {
     320                        String actionName = (String) b.getAction().getValue(AbstractAction.NAME);
     321                         Main.pref.put(actionName+".mbutton_hidden",false);
     322                         validateToolBarVisibility();
     323                    }
     324                });
     325            }
     326        }));
    307327    }
    308328
    309329    /**
     
    362382        jb.setFloatable(false);
    363383        toolBarActions.setAlignmentX(0.5f);
    364384        jb.add(toolBarActions);
     385        otherMapModeButton.setAlignmentX(0.5f);
     386        otherMapModeButton.setBorder(null);
     387        otherMapModeButton.setFont(otherButton.getFont().deriveFont(Font.PLAIN));
     388        jb.add(otherMapModeButton);
     389        validateToolBarVisibility();
    365390
    366391        jb.addSeparator(new Dimension(0,18));
    367392        toolBarToggle.setAlignmentX(0.5f);
     
    390415        }
    391416    }
    392417
     418    class OtherMapModesAction extends AbstractAction {
     419
     420        public OtherMapModesAction() {
     421            putValue(NAME, ">>");
     422        }
     423
     424        @Override
     425        public void actionPerformed(ActionEvent e) {
     426            JPopupMenu menu = new JPopupMenu();
     427            AbstractButton b;
     428            Enumeration<AbstractButton> elements = toolGroup.getElements();
     429            while (elements.hasMoreElements()) {
     430                b = elements.nextElement();
     431                if (!(b instanceof IconToggleButton)) continue;
     432                final IconToggleButton t = (IconToggleButton) b;
     433                menu.add(new JCheckBoxMenuItem(new AbstractAction() {
     434
     435                    {
     436                        putValue(NAME, t.getAction().getValue(NAME));
     437                        putValue(SMALL_ICON, t.getAction().getValue(SMALL_ICON));
     438                        putValue(SELECTED_KEY, t.isVisible());
     439                        putValue(SHORT_DESCRIPTION, tr("Hide or show this toggle button"));
     440                    }
     441
     442                    @Override
     443                    public void actionPerformed(ActionEvent e) {
     444                        if ((Boolean) getValue(SELECTED_KEY)) {
     445                            Main.pref.put(getValue(NAME) + ".mbutton_hidden", true);
     446                        } else {
     447                            Main.pref.put(getValue(NAME) + ".mbutton_hidden", false);
     448                        }
     449                        validateToolBarVisibility();
     450                    }
     451                }));
     452            }
     453            Rectangle bounds = otherMapModeButton.getBounds();
     454            menu.show(otherMapModeButton, bounds.x + bounds.width, 0);
     455        }
     456    }
     457
     458    public void validateToolBarVisibility() {
     459        AbstractButton b;
     460        Enumeration<AbstractButton> elements = toolGroup.getElements();
     461        while (elements.hasMoreElements()) {
     462            b = elements.nextElement();
     463            if (!(b instanceof IconToggleButton)) continue;
     464            final IconToggleButton t = (IconToggleButton) b;
     465            String actionName = (String) t.getAction().getValue(AbstractAction.NAME);
     466            boolean visibilityFlag =
     467                    Main.pref.getBoolean(actionName + ".mbutton_hidden", true);
     468            t.setVisible(visibilityFlag);
     469        }
     470        toolBarActions.repaint();
     471    }
     472
    393473    class OtherButtonsAction extends AbstractAction {
    394474
    395475        public OtherButtonsAction() {