// License: GPL. For details, see LICENSE file. package org.openstreetmap.josm.gui.mappaint; import static org.openstreetmap.josm.gui.help.HelpUtil.ht; import static org.openstreetmap.josm.tools.I18n.tr; import java.awt.event.ActionEvent; import java.util.HashMap; import java.util.Map; import javax.swing.JCheckBoxMenuItem; import javax.swing.JMenu; import org.openstreetmap.josm.Main; import org.openstreetmap.josm.actions.JosmAction; import org.openstreetmap.josm.gui.dialogs.MapPaintDialog; import org.openstreetmap.josm.gui.layer.GpxLayer; import org.openstreetmap.josm.gui.layer.Layer; import org.openstreetmap.josm.gui.layer.markerlayer.MarkerLayer; import org.openstreetmap.josm.gui.mappaint.MapPaintStyles.MapPaintSylesUpdateListener; import org.openstreetmap.josm.gui.util.StayOpenCheckBoxMenuItem; import org.openstreetmap.josm.tools.ImageProvider; /** * The View -> Map Paint Styles menu * @since 5086 */ public class MapPaintMenu extends JMenu implements MapPaintSylesUpdateListener { private static class MapPaintAction extends JosmAction { private transient StyleSource style; private final JCheckBoxMenuItem button; MapPaintAction(StyleSource style) { super(style.getDisplayString(), style.getIconProvider(), tr("Select the map painting styles"), null, true, "mappaint/" + style.getDisplayString(), true); this.button = new StayOpenCheckBoxMenuItem(this); this.style = style; updateButton(); putValue("help", ht("/Dialog/MapPaint")); } private void updateButton() { button.getModel().setSelected(style.active); } private void toggleStyle() { MapPaintStyles.toggleStyleActive(MapPaintStyles.getStyles().getStyleSources().indexOf(style)); updateButton(); } @Override public void actionPerformed(ActionEvent ae) { toggleStyle(); } public JCheckBoxMenuItem getButton() { return button; } public void setStyle(StyleSource style) { this.style = style; } @Override public void updateEnabledState() { setEnabled(Main.isDisplayingMapView() && (Main.getLayerManager().getEditLayer() != null || mapHasGpxorMarkerLayer())); } private static boolean mapHasGpxorMarkerLayer() { for (Layer layer : Main.getLayerManager().getLayers()) { if (layer instanceof GpxLayer || layer instanceof MarkerLayer) { return true; } } return false; } } private final transient Map<String, MapPaintAction> actions = new HashMap<>(); /** * Constructs a new {@code MapPaintMenu} */ public MapPaintMenu() { super(tr("Map Paint Styles")); setIcon(ImageProvider.get("dialogs", "mapstyle", ImageProvider.ImageSizes.MENU)); MapPaintStyles.addMapPaintSylesUpdateListener(this); putClientProperty("help", ht("/Dialog/MapPaint")); } @Override public void mapPaintStylesUpdated() { removeAll(); for (StyleSource style : MapPaintStyles.getStyles().getStyleSources()) { final String k = style.getDisplayString(); MapPaintAction a = actions.get(k); if (a == null) { a = new MapPaintAction(style); actions.put(k, a); add(a.getButton()); } else { a.setStyle(style); add(a.getButton()); a.updateButton(); } } addSeparator(); add(MapPaintDialog.PREFERENCE_ACTION); } @Override public void mapPaintStyleEntryUpdated(int idx) { mapPaintStylesUpdated(); } }