001// License: GPL. For details, see LICENSE file. 002package org.openstreetmap.josm.gui.mappaint; 003 004import static org.openstreetmap.josm.tools.I18n.tr; 005 006import java.awt.event.ActionEvent; 007import java.util.Arrays; 008import java.util.List; 009import java.util.Objects; 010import java.util.stream.Collectors; 011 012import javax.swing.AbstractAction; 013import javax.swing.JMenu; 014import javax.swing.JMenuItem; 015 016import org.openstreetmap.josm.gui.MainApplication; 017import org.openstreetmap.josm.gui.mappaint.BooleanStyleSettingGui.BooleanStyleSettingCheckBoxMenuItem; 018import org.openstreetmap.josm.gui.mappaint.StyleSetting.StyleSettingGroup; 019import org.openstreetmap.josm.gui.mappaint.loader.MapPaintStyleLoader; 020import org.openstreetmap.josm.gui.util.StayOpenCheckBoxMenuItemUI; 021 022/** 023 * GUI elements for a {@link StyleSettingGroup} class. 024 * @since 15289 025 */ 026public class StyleSettingGroupGui implements StyleSettingGui { 027 028 private final StyleSettingGroup group; 029 private final List<StyleSetting> settings; 030 031 /** 032 * Constructs a new {@code StyleSettingGroupGui}. 033 * @param group style setting group 034 * @param settings list of style settings in this group 035 */ 036 public StyleSettingGroupGui(StyleSettingGroup group, List<StyleSetting> settings) { 037 this.group = Objects.requireNonNull(group); 038 this.settings = Objects.requireNonNull(settings); 039 } 040 041 @Override 042 public void addMenuEntry(JMenu menu) { 043 final JMenu submenu = new JMenu(); 044 submenu.setText(group.label); 045 submenu.setIcon(group.icon); 046 // Add the "toggle all settings" action 047 if (settings.size() >= 2) { 048 JMenuItem item = new JMenuItem(new AbstractAction(tr("Toggle all settings")) { 049 @Override 050 public void actionPerformed(ActionEvent e) { 051 List<BooleanStyleSettingCheckBoxMenuItem> items = Arrays.stream(submenu.getMenuComponents()) 052 .filter(c -> c instanceof BooleanStyleSettingCheckBoxMenuItem) 053 .map(c -> (BooleanStyleSettingCheckBoxMenuItem) c) 054 .collect(Collectors.toList()); 055 final boolean select = items.stream().anyMatch(cbi -> !cbi.isSelected()); 056 items.stream().filter(cbi -> select != cbi.isSelected()).forEach(cbi -> cbi.doClickWithoutRepaint(0)); 057 MainApplication.worker.submit(new MapPaintStyleLoader(Arrays.asList(group.parentStyle))); 058 } 059 }); 060 item.setUI(new StayOpenCheckBoxMenuItemUI()); 061 submenu.add(item); 062 submenu.addSeparator(); 063 } 064 // Add individual settings 065 for (StyleSetting s : settings) { 066 StyleSettingGuiFactory.getStyleSettingGui(s).addMenuEntry(submenu); 067 } 068 menu.add(submenu); 069 } 070}