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}