001// License: GPL. For details, see LICENSE file.
002package org.openstreetmap.josm.actions;
003
004import java.awt.event.ActionEvent;
005
006import javax.swing.JCheckBoxMenuItem;
007
008import org.openstreetmap.josm.data.Preferences;
009import org.openstreetmap.josm.data.preferences.BooleanProperty;
010import org.openstreetmap.josm.spi.preferences.PreferenceChangeEvent;
011import org.openstreetmap.josm.spi.preferences.PreferenceChangedListener;
012import org.openstreetmap.josm.tools.ImageProvider;
013
014/**
015 * User action to toggle a custom boolean preference value.
016 *
017 * A user action will just change a preference value. To take any real action,
018 * register another {@link PreferenceChangedListener} for the given preference key.
019 */
020public class PreferenceToggleAction extends ToggleAction implements PreferenceChangedListener {
021
022    private final JCheckBoxMenuItem checkbox;
023    private final BooleanProperty pref;
024
025    /**
026     * Create a new PreferenceToggleAction.
027     * @param name the (translated) title
028     * @param tooltip tooltip text
029     * @param pref the preference to toggle
030     */
031    public PreferenceToggleAction(String name, String tooltip, BooleanProperty pref) {
032        this(name, null, tooltip, pref);
033    }
034
035    /**
036     * Create a new PreferenceToggleAction.
037     * @param name the (translated) title
038     * @param icon icon to display e.g. in menu
039     * @param tooltip tooltip text
040     * @param pref the preference to toggle
041     * @since 17021
042     */
043    public PreferenceToggleAction(String name, ImageProvider icon, String tooltip, BooleanProperty pref) {
044        super(name, icon, tooltip, null, false, null, true);
045        setToolbarId("toggle-" + pref.getKey());
046        this.pref = pref;
047        checkbox = new JCheckBoxMenuItem(this);
048        checkbox.setSelected(pref.get());
049        Preferences.main().addWeakKeyPreferenceChangeListener(pref.getKey(), this);
050    }
051
052    @Override
053    public void actionPerformed(ActionEvent e) {
054        pref.put(checkbox.isSelected());
055    }
056
057    /**
058     * Get the checkbox that can be used for this action. It can only be used at one place.
059     * @return The checkbox.
060     */
061    public JCheckBoxMenuItem getCheckbox() {
062        return checkbox;
063    }
064
065    @Override
066    public void preferenceChanged(PreferenceChangeEvent e) {
067        checkbox.setSelected(pref.get());
068    }
069}