001// License: GPL. For details, see LICENSE file.
002package org.openstreetmap.josm.gui.mappaint;
003
004import java.awt.event.ActionEvent;
005import java.util.Arrays;
006import java.util.Objects;
007
008import javax.swing.AbstractAction;
009import javax.swing.JCheckBoxMenuItem;
010import javax.swing.JMenu;
011
012import org.openstreetmap.josm.gui.MainApplication;
013import org.openstreetmap.josm.gui.mappaint.StyleSetting.BooleanStyleSetting;
014import org.openstreetmap.josm.gui.mappaint.loader.MapPaintStyleLoader;
015import org.openstreetmap.josm.gui.util.StayOpenCheckBoxMenuItemUI;
016
017/**
018 * GUI elements for a {@link BooleanStyleSetting} class.
019 * @since 12831
020 */
021public class BooleanStyleSettingGui implements StyleSettingGui {
022
023    final StyleSetting.BooleanStyleSetting setting;
024
025    /**
026     * Constructs a new {@code BooleanStyleSettingGui}.
027     * @param setting boolean style setting
028     */
029    public BooleanStyleSettingGui(BooleanStyleSetting setting) {
030        this.setting = Objects.requireNonNull(setting);
031    }
032
033    static class BooleanStyleSettingCheckBoxMenuItem extends JCheckBoxMenuItem {
034        boolean noRepaint;
035
036        BooleanStyleSettingCheckBoxMenuItem(BooleanStyleSetting setting) {
037            setAction(new AbstractAction(setting.label) {
038                @Override
039                public void actionPerformed(ActionEvent e) {
040                    setting.setValue(isSelected());
041                    if (!noRepaint) {
042                        MainApplication.worker.submit(new MapPaintStyleLoader(Arrays.asList(setting.parentStyle)));
043                    }
044                }
045            });
046            setSelected((boolean) setting.getValue());
047            setUI(new StayOpenCheckBoxMenuItemUI());
048        }
049
050        void doClickWithoutRepaint(int pressTime) {
051            noRepaint = true;
052            doClick(pressTime);
053            noRepaint = false;
054        }
055    }
056
057    @Override
058    public void addMenuEntry(JMenu menu) {
059        menu.add(new BooleanStyleSettingCheckBoxMenuItem(setting));
060    }
061}