001    package org.openstreetmap.josm.gui.mappaint;
002    
003    import static org.openstreetmap.josm.tools.I18n.tr;
004    
005    import java.awt.event.ActionEvent;
006    import java.util.HashMap;
007    import java.util.Map;
008    import javax.swing.JCheckBoxMenuItem;
009    import javax.swing.JMenu;
010    import org.openstreetmap.josm.Main;
011    import org.openstreetmap.josm.actions.JosmAction;
012    import org.openstreetmap.josm.gui.dialogs.MapPaintDialog;
013    import org.openstreetmap.josm.gui.dialogs.MapPaintDialog.LaunchMapPaintPreferencesAction;
014    import org.openstreetmap.josm.gui.mappaint.MapPaintStyles.MapPaintSylesUpdateListener;
015    import org.openstreetmap.josm.gui.util.StayOpenCheckBoxMenuItem;
016    import org.openstreetmap.josm.tools.ImageProvider;
017    
018    public class MapPaintMenu extends JMenu implements MapPaintSylesUpdateListener {
019    
020        private static class MapPaintAction extends JosmAction {
021    
022            private StyleSource style;
023            private JCheckBoxMenuItem button;
024    
025            public MapPaintAction(StyleSource style) {
026                super(style.getDisplayString(), style.icon == null ? null : ImageProvider.getIfAvailable(style.icon),
027                        tr("Select the map painting styles"), null, true, "mappaint/" + style.getDisplayString(), true);
028                this.button = new StayOpenCheckBoxMenuItem(this);
029                this.style = style;
030                updateButton();
031            }
032    
033            private void updateButton() {
034                button.getModel().setSelected(style.active);
035            }
036    
037            private void toggleStyle() {
038                MapPaintStyles.toggleStyleActive(MapPaintStyles.getStyles().getStyleSources().indexOf(style));
039                updateButton();
040            }
041    
042            @Override
043            public void actionPerformed(ActionEvent ae) {
044                toggleStyle();
045            }
046    
047            public JCheckBoxMenuItem getButton() {
048                return button;
049            }
050    
051            public void setStyle(StyleSource style) {
052                this.style = style;
053            }
054    
055            @Override
056            public void updateEnabledState() {
057                setEnabled(Main.isDisplayingMapView() && Main.main.getEditLayer() != null);
058            }
059        }
060        private final Map<String, MapPaintAction> actions = new HashMap<String, MapPaintAction>();
061        private final LaunchMapPaintPreferencesAction mapPaintPreferencesAction = new MapPaintDialog.LaunchMapPaintPreferencesAction() {
062    
063            {
064                putValue("toolbar", "mappaintpreference");
065            }
066        };
067    
068        public MapPaintMenu() {
069            super(tr("Map Paint Styles"));
070            setIcon(ImageProvider.get("dialogs", "mapstyle"));
071            MapPaintStyles.addMapPaintSylesUpdateListener(this);
072        }
073    
074        @Override
075        public void mapPaintStylesUpdated() {
076            removeAll();
077            for (StyleSource style : MapPaintStyles.getStyles().getStyleSources()) {
078                final String k = style.getDisplayString();
079                MapPaintAction a = actions.get(k);
080                if (a == null) {
081                    actions.put(k, a = new MapPaintAction(style));
082                    add(a.getButton());
083                } else {
084                    a.setStyle(style);
085                    add(a.getButton());
086                    a.updateButton();
087                }
088            }
089            addSeparator();
090            add(mapPaintPreferencesAction);
091        }
092    
093        @Override
094        public void mapPaintStyleEntryUpdated(int idx) {
095            mapPaintStylesUpdated();
096        }
097    }