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}