Ticket #16869: 16869-PreferenceChangedListener.patch
| File 16869-PreferenceChangedListener.patch, 32.8 KB (added by , 7 years ago) |
|---|
-
src/org/openstreetmap/josm/actions/PreferenceToggleAction.java
commit 31b90bef7c1f7cb6c98c6249a56de7a5f6606657 Author: Simon Legner <Simon.Legner@gmail.com> Date: Sun Oct 21 21:36:09 2018 +0200 see #16869 - Migrate some PreferenceChangedListener to ValueChangeListener diff --git a/src/org/openstreetmap/josm/actions/PreferenceToggleAction.java b/src/org/openstreetmap/josm/actions/PreferenceToggleAction.java index 14243d7b1..1a480a994 100644a b 5 5 6 6 import javax.swing.JCheckBoxMenuItem; 7 7 8 import org.openstreetmap.josm.data.Preferences;9 8 import org.openstreetmap.josm.data.preferences.BooleanProperty; 10 import org.openstreetmap.josm.spi.preferences.PreferenceChangeEvent;11 9 import org.openstreetmap.josm.spi.preferences.PreferenceChangedListener; 12 10 13 11 /** … … 16 14 * A user action will just change a preference value. To take any real action, 17 15 * register another {@link PreferenceChangedListener} for the given preference key. 18 16 */ 19 public class PreferenceToggleAction extends JosmAction implements PreferenceChangedListener{17 public class PreferenceToggleAction extends JosmAction { 20 18 21 19 private final JCheckBoxMenuItem checkbox; 22 20 private final BooleanProperty pref; … … public PreferenceToggleAction(String name, String tooltip, String prefKey, boole 34 32 this.pref = new BooleanProperty(prefKey, prefDefault); 35 33 checkbox = new JCheckBoxMenuItem(this); 36 34 checkbox.setSelected(pref.get()); 37 Preferences.main().addWeakKeyPreferenceChangeListener(prefKey, this);35 this.pref.addWeakListener(event -> checkbox.setSelected(event.getProperty().get())); 38 36 } 39 37 40 38 @Override … … public void actionPerformed(ActionEvent e) { 49 47 public JCheckBoxMenuItem getCheckbox() { 50 48 return checkbox; 51 49 } 52 53 @Override54 public void preferenceChanged(PreferenceChangeEvent e) {55 checkbox.setSelected(pref.get());56 }57 50 } -
src/org/openstreetmap/josm/actions/mapmode/DrawSnapHelper.java
diff --git a/src/org/openstreetmap/josm/actions/mapmode/DrawSnapHelper.java b/src/org/openstreetmap/josm/actions/mapmode/DrawSnapHelper.java index 1df0a64c2..1e83eae21 100644
a b 17 17 import javax.swing.JCheckBoxMenuItem; 18 18 import javax.swing.JPopupMenu; 19 19 20 import org.openstreetmap.josm.data.Preferences;21 20 import org.openstreetmap.josm.data.coor.EastNorth; 22 21 import org.openstreetmap.josm.data.coor.LatLon; 23 22 import org.openstreetmap.josm.data.osm.DataSet; 24 23 import org.openstreetmap.josm.data.osm.Node; 25 24 import org.openstreetmap.josm.data.osm.Way; 26 25 import org.openstreetmap.josm.data.osm.WaySegment; 26 import org.openstreetmap.josm.data.preferences.ListProperty; 27 27 import org.openstreetmap.josm.gui.MainApplication; 28 28 import org.openstreetmap.josm.gui.MapView; 29 29 import org.openstreetmap.josm.gui.MapViewState; … … 31 31 import org.openstreetmap.josm.gui.draw.MapViewPath; 32 32 import org.openstreetmap.josm.gui.draw.SymbolShape; 33 33 import org.openstreetmap.josm.gui.widgets.PopupMenuLauncher; 34 import org.openstreetmap.josm.spi.preferences.Config;35 34 import org.openstreetmap.josm.tools.Logging; 36 35 import org.openstreetmap.josm.tools.Utils; 37 36 … … public void mouseClicked(MouseEvent e) { 64 63 }; 65 64 } 66 65 67 private static final String DRAW_ANGLESNAP_ANGLES = "draw.anglesnap.angles"; 66 private static final ListProperty DRAW_ANGLESNAP_ANGLES = new ListProperty("draw.anglesnap.angles", 67 Arrays.asList("0", "30", "45", "60", "90", "120", "135", "150", "180")); 68 68 69 69 private static final class RepeatedAction extends AbstractAction { 70 70 RepeatedAction(DrawSnapHelper snapHelper) { … … public void init() { 233 233 absoluteFix = false; 234 234 235 235 computeSnapAngles(); 236 Preferences.main().addWeakKeyPreferenceChangeListener(DRAW_ANGLESNAP_ANGLES, e -> this.computeSnapAngles());236 DRAW_ANGLESNAP_ANGLES.addWeakListener(event -> computeSnapAngles()); 237 237 } 238 238 239 239 private void computeSnapAngles() { 240 snapAngles = Config.getPref().getList(DRAW_ANGLESNAP_ANGLES, 241 Arrays.asList("0", "30", "45", "60", "90", "120", "135", "150", "180")) 240 snapAngles = DRAW_ANGLESNAP_ANGLES.get() 242 241 .stream() 243 242 .mapToDouble(DrawSnapHelper::parseSnapAngle) 244 243 .flatMap(s -> DoubleStream.of(s, 360-s)) … … private static double parseSnapAngle(String string) { 259 258 * @param angles The angles 260 259 */ 261 260 public void saveAngles(String... angles) { 262 Config.getPref().putList(DRAW_ANGLESNAP_ANGLES,Arrays.asList(angles));261 DRAW_ANGLESNAP_ANGLES.put(Arrays.asList(angles)); 263 262 } 264 263 265 264 /** -
src/org/openstreetmap/josm/data/osm/ChangesetCache.java
diff --git a/src/org/openstreetmap/josm/data/osm/ChangesetCache.java b/src/org/openstreetmap/josm/data/osm/ChangesetCache.java index a86768846..23ed1cf1d 100644
a b 12 12 import java.util.stream.Collectors; 13 13 14 14 import org.openstreetmap.josm.data.UserIdentityManager; 15 import org.openstreetmap.josm.spi.preferences.Config; 16 import org.openstreetmap.josm.spi.preferences.PreferenceChangeEvent; 17 import org.openstreetmap.josm.spi.preferences.PreferenceChangedListener; 15 import org.openstreetmap.josm.io.OsmApi; 18 16 import org.openstreetmap.josm.tools.SubclassFilteredCollection; 19 17 20 18 /** … … 31 29 * clears itself if the OSM API URL is changed in the preferences. 32 30 * 33 31 */ 34 public final class ChangesetCache implements PreferenceChangedListener{32 public final class ChangesetCache { 35 33 /** the unique instance */ 36 34 private static final ChangesetCache INSTANCE = new ChangesetCache(); 37 35 … … 44 42 * Constructs a new {@code ChangesetCache}. 45 43 */ 46 44 private ChangesetCache() { 47 Config.getPref().addPreferenceChangeListener(this);45 OsmApi.SERVER_URL_PROPERTY.addListener(event -> clear()); 48 46 } 49 47 50 48 /** … … public void clear() { 252 250 object -> UserIdentityManager.getInstance().isCurrentUser(object.getUser()))); 253 251 } 254 252 } 255 256 /* ------------------------------------------------------------------------- */257 /* interface PreferenceChangedListener */258 /* ------------------------------------------------------------------------- */259 @Override260 public void preferenceChanged(PreferenceChangeEvent e) {261 if (e.getKey() == null || !"osm-server.url".equals(e.getKey()))262 return;263 264 // clear the cache when the API url changes265 if (e.getOldValue() == null || e.getNewValue() == null || !e.getOldValue().equals(e.getNewValue())) {266 clear();267 }268 }269 253 } -
src/org/openstreetmap/josm/data/osm/visitor/paint/relations/Multipolygon.java
diff --git a/src/org/openstreetmap/josm/data/osm/visitor/paint/relations/Multipolygon.java b/src/org/openstreetmap/josm/data/osm/visitor/paint/relations/Multipolygon.java index cc22c4ec3..aa2057bf3 100644
a b 12 12 import java.util.List; 13 13 import java.util.Optional; 14 14 import java.util.Set; 15 import java.util.stream.Stream; 15 16 16 17 import org.openstreetmap.josm.data.coor.EastNorth; 17 18 import org.openstreetmap.josm.data.osm.DataSet; … … 23 24 import org.openstreetmap.josm.data.osm.event.NodeMovedEvent; 24 25 import org.openstreetmap.josm.data.osm.event.WayNodesChangedEvent; 25 26 import org.openstreetmap.josm.data.osm.visitor.paint.relations.Multipolygon.PolyData.Intersection; 27 import org.openstreetmap.josm.data.preferences.ListProperty; 26 28 import org.openstreetmap.josm.data.projection.Projection; 27 29 import org.openstreetmap.josm.data.projection.ProjectionRegistry; 28 30 import org.openstreetmap.josm.spi.preferences.Config; 29 import org.openstreetmap.josm.spi.preferences.PreferenceChangeEvent;30 import org.openstreetmap.josm.spi.preferences.PreferenceChangedListener;31 31 import org.openstreetmap.josm.tools.Geometry; 32 32 import org.openstreetmap.josm.tools.Geometry.AreaAndPerimeter; 33 33 import org.openstreetmap.josm.tools.Logging; 34 import org.openstreetmap.josm.tools.Pair; 34 35 35 36 /** 36 37 * Multipolygon data used to represent complex areas, see <a href="https://wiki.openstreetmap.org/wiki/Relation:multipolygon">wiki</a>. … … 41 42 /** preference key for a collection of roles which indicate that the respective member belongs to an 42 43 * <em>outer</em> polygon. Default is <code>outer</code>. 43 44 */ 44 public static final String PREF_KEY_OUTER_ROLES = "mappaint.multipolygon.outer.roles";45 public static final ListProperty PREF_KEY_OUTER_ROLES = new ListProperty("mappaint.multipolygon.outer.roles", Collections.emptyList()); 45 46 46 47 /** preference key for collection of role prefixes which indicate that the respective 47 48 * member belongs to an <em>outer</em> polygon. Default is empty. 48 49 */ 49 public static final String PREF_KEY_OUTER_ROLE_PREFIXES = "mappaint.multipolygon.outer.role-prefixes";50 public static final ListProperty PREF_KEY_OUTER_ROLE_PREFIXES = new ListProperty("mappaint.multipolygon.outer.role-prefixes", Collections.emptyList()); 50 51 51 52 /** preference key for a collection of roles which indicate that the respective member belongs to an 52 53 * <em>inner</em> polygon. Default is <code>inner</code>. 53 54 */ 54 public static final String PREF_KEY_INNER_ROLES = "mappaint.multipolygon.inner.roles";55 public static final ListProperty PREF_KEY_INNER_ROLES = new ListProperty("mappaint.multipolygon.inner.roles", Collections.emptyList()); 55 56 56 57 /** preference key for collection of role prefixes which indicate that the respective 57 58 * member belongs to an <em>inner</em> polygon. Default is empty. 58 59 */ 59 public static final String PREF_KEY_INNER_ROLE_PREFIXES = "mappaint.multipolygon.inner.role-prefixes";60 public static final ListProperty PREF_KEY_INNER_ROLE_PREFIXES = new ListProperty("mappaint.multipolygon.inner.role-prefixes", Collections.emptyList()); 60 61 61 62 /** 62 63 * <p>Kind of strategy object which is responsible for deciding whether a given … … 66 67 * <p>The decision is taken based on preference settings, see the four preference keys 67 68 * above.</p> 68 69 */ 69 private static class MultipolygonRoleMatcher implements PreferenceChangedListener{70 private static class MultipolygonRoleMatcher { 70 71 private final List<String> outerExactRoles = new ArrayList<>(); 71 72 private final List<String> outerRolePrefixes = new ArrayList<>(); 72 73 private final List<String> innerExactRoles = new ArrayList<>(); … … private static void setNormalized(Collection<String> literals, List<String> targ 97 98 private void initFromPreferences() { 98 99 initDefaults(); 99 100 if (Config.getPref() == null) return; 100 Collection<String> literals; 101 literals = Config.getPref().getList(PREF_KEY_OUTER_ROLES); 102 if (literals != null && !literals.isEmpty()) { 103 setNormalized(literals, outerExactRoles); 104 } 105 literals = Config.getPref().getList(PREF_KEY_OUTER_ROLE_PREFIXES); 106 if (literals != null && !literals.isEmpty()) { 107 setNormalized(literals, outerRolePrefixes); 108 } 109 literals = Config.getPref().getList(PREF_KEY_INNER_ROLES); 110 if (literals != null && !literals.isEmpty()) { 111 setNormalized(literals, innerExactRoles); 112 } 113 literals = Config.getPref().getList(PREF_KEY_INNER_ROLE_PREFIXES); 114 if (literals != null && !literals.isEmpty()) { 115 setNormalized(literals, innerRolePrefixes); 116 } 101 Stream.of( 102 new Pair<>(PREF_KEY_OUTER_ROLES, outerExactRoles), 103 new Pair<>(PREF_KEY_OUTER_ROLE_PREFIXES, outerRolePrefixes), 104 new Pair<>(PREF_KEY_INNER_ROLES, innerExactRoles), 105 new Pair<>(PREF_KEY_INNER_ROLE_PREFIXES, innerRolePrefixes) 106 ).forEach(pair -> { 107 final Collection<String> literals = pair.a.get(); 108 if (literals != null && !literals.isEmpty()) { 109 setNormalized(literals, pair.b); 110 } 111 }); 117 112 } 118 113 119 @Override 120 public void preferenceChanged(PreferenceChangeEvent evt) { 121 if (PREF_KEY_INNER_ROLE_PREFIXES.equals(evt.getKey()) || 122 PREF_KEY_INNER_ROLES.equals(evt.getKey()) || 123 PREF_KEY_OUTER_ROLE_PREFIXES.equals(evt.getKey()) || 124 PREF_KEY_OUTER_ROLES.equals(evt.getKey())) { 125 initFromPreferences(); 126 } 114 private void registerPreferenceListeners() { 115 PREF_KEY_OUTER_ROLES.addListener(event -> initFromPreferences()); 116 PREF_KEY_OUTER_ROLE_PREFIXES.addListener(event -> initFromPreferences()); 117 PREF_KEY_INNER_ROLES.addListener(event -> initFromPreferences()); 118 PREF_KEY_INNER_ROLE_PREFIXES.addListener(event -> initFromPreferences()); 127 119 } 128 120 129 121 boolean isOuterRole(String role) { … … private static synchronized MultipolygonRoleMatcher getMultipolygonRoleMatcher() 158 150 if (roleMatcher == null) { 159 151 roleMatcher = new MultipolygonRoleMatcher(); 160 152 if (Config.getPref() != null) { 153 roleMatcher.registerPreferenceListeners(); 161 154 roleMatcher.initFromPreferences(); 162 Config.getPref().addPreferenceChangeListener(roleMatcher);163 155 } 164 156 } 165 157 return roleMatcher; -
src/org/openstreetmap/josm/gui/MainMenu.java
diff --git a/src/org/openstreetmap/josm/gui/MainMenu.java b/src/org/openstreetmap/josm/gui/MainMenu.java index f17f7cf7a..c24b31d97 100644
a b 115 115 import org.openstreetmap.josm.actions.audio.AudioSlowerAction; 116 116 import org.openstreetmap.josm.actions.search.SearchAction; 117 117 import org.openstreetmap.josm.data.UndoRedoHandler; 118 import org.openstreetmap.josm.data.preferences.BooleanProperty; 118 119 import org.openstreetmap.josm.gui.dialogs.MenuItemSearchDialog; 119 120 import org.openstreetmap.josm.gui.io.RecentlyOpenedFilesMenu; 120 121 import org.openstreetmap.josm.gui.layer.MainLayerManager.ActiveLayerChangeEvent; … … 123 124 import org.openstreetmap.josm.gui.preferences.imagery.ImageryPreference; 124 125 import org.openstreetmap.josm.gui.preferences.map.TaggingPresetPreference; 125 126 import org.openstreetmap.josm.gui.tagging.presets.TaggingPresetSearchPrimitiveDialog; 126 import org.openstreetmap.josm.spi.preferences.Config;127 127 import org.openstreetmap.josm.tools.PlatformManager; 128 128 import org.openstreetmap.josm.tools.Shortcut; 129 129 … … public void initialize() { 814 814 MainMenu.WINDOW_MENU_GROUP.ALWAYS); 815 815 changesetManager.addButtonModel(mi.getModel()); 816 816 817 if (!Config.getPref().getBoolean("audio.menuinvisible", false)) { 817 final BooleanProperty audioMenuInvisible = new BooleanProperty("audio.menuinvisible", false); 818 if (!audioMenuInvisible.get()) { 818 819 showAudioMenu(true); 819 820 } 820 821 Config.getPref().addPreferenceChangeListener(e -> { 822 if ("audio.menuinvisible".equals(e.getKey())) { 823 showAudioMenu(!Boolean.parseBoolean(e.getNewValue().toString())); 824 } 825 }); 821 audioMenuInvisible.addListener(event -> showAudioMenu(!event.getProperty().get())); 826 822 827 823 add(helpMenu, new MenuItemSearchDialog.Action()); 828 824 helpMenu.addSeparator(); -
src/org/openstreetmap/josm/gui/MapFrame.java
diff --git a/src/org/openstreetmap/josm/gui/MapFrame.java b/src/org/openstreetmap/josm/gui/MapFrame.java index a51bf3758..4d8de2b37 100644
a b 52 52 import org.openstreetmap.josm.actions.mapmode.SelectAction; 53 53 import org.openstreetmap.josm.actions.mapmode.ZoomAction; 54 54 import org.openstreetmap.josm.data.ViewportData; 55 import org.openstreetmap.josm.data.preferences.AbstractProperty; 55 56 import org.openstreetmap.josm.data.preferences.BooleanProperty; 56 57 import org.openstreetmap.josm.data.preferences.IntegerProperty; 57 58 import org.openstreetmap.josm.gui.dialogs.ChangesetDialog; … … 78 79 import org.openstreetmap.josm.gui.layer.MainLayerManager.ActiveLayerChangeListener; 79 80 import org.openstreetmap.josm.gui.util.AdvancedKeyPressDetector; 80 81 import org.openstreetmap.josm.spi.preferences.Config; 81 import org.openstreetmap.josm.spi.preferences.PreferenceChangedListener;82 82 import org.openstreetmap.josm.tools.Destroyable; 83 83 import org.openstreetmap.josm.tools.GBC; 84 84 import org.openstreetmap.josm.tools.ImageProvider; … … public void destroy() { 345 345 MainApplication.getLayerManager().removeLayerChangeListener(this); 346 346 MainApplication.getLayerManager().removeActiveLayerChangeListener(this); 347 347 dialogsPanel.destroy(); 348 Config.getPref().removePreferenceChangeListener(sidetoolbarPreferencesChangedListener);348 removeSideToolbarPreferencesChangedListener.run(); 349 349 for (int i = 0; i < toolBarActions.getComponentCount(); ++i) { 350 350 if (toolBarActions.getComponent(i) instanceof Destroyable) { 351 351 ((Destroyable) toolBarActions.getComponent(i)).destroy(); … … public void fillPanel(Container panel) { 547 547 final ScrollViewport svp = new ScrollViewport(sideToolBar, ScrollViewport.VERTICAL_DIRECTION); 548 548 sideToolBar = svp; 549 549 } 550 sideToolBar.setVisible(Config.getPref().getBoolean("sidetoolbar.visible", true)); 551 sidetoolbarPreferencesChangedListener = e -> { 552 if ("sidetoolbar.visible".equals(e.getKey())) { 553 sideToolBar.setVisible(Config.getPref().getBoolean("sidetoolbar.visible")); 554 } 555 }; 556 Config.getPref().addPreferenceChangeListener(sidetoolbarPreferencesChangedListener); 550 final BooleanProperty sideToolbarVisible = new BooleanProperty("sidetoolbar.visible", true); 551 sideToolBar.setVisible(sideToolbarVisible.get()); 552 final AbstractProperty.ValueChangeListener<Boolean> sideToolbarPreferencesChangedListener = event -> 553 sideToolBar.setVisible(event.getProperty().get()); 554 sideToolbarVisible.addListener(sideToolbarPreferencesChangedListener); 555 removeSideToolbarPreferencesChangedListener = () -> sideToolbarVisible.removeListener(sideToolbarPreferencesChangedListener); 557 556 558 557 /** 559 558 * sideToolBar: add it to the panel … … public void addTopPanel(Component c) { 796 795 */ 797 796 private static final CopyOnWriteArrayList<MapModeChangeListener> mapModeChangeListeners = new CopyOnWriteArrayList<>(); 798 797 799 private transient PreferenceChangedListener sidetoolbarPreferencesChangedListener;798 private transient Runnable removeSideToolbarPreferencesChangedListener; 800 799 /** 801 800 * Adds a mapMode change listener 802 801 * -
src/org/openstreetmap/josm/gui/MapMover.java
diff --git a/src/org/openstreetmap/josm/gui/MapMover.java b/src/org/openstreetmap/josm/gui/MapMover.java index e293734b7..8420d9ea1 100644
a b 21 21 import org.openstreetmap.josm.data.preferences.BooleanProperty; 22 22 import org.openstreetmap.josm.gui.MapViewState.MapViewPoint; 23 23 import org.openstreetmap.josm.gui.layer.Layer; 24 import org.openstreetmap.josm.spi.preferences.Config;25 import org.openstreetmap.josm.spi.preferences.PreferenceChangeEvent;26 import org.openstreetmap.josm.spi.preferences.PreferenceChangedListener;27 24 import org.openstreetmap.josm.tools.Destroyable; 28 25 import org.openstreetmap.josm.tools.Pair; 29 26 import org.openstreetmap.josm.tools.PlatformManager; … … 43 40 public static final BooleanProperty PROP_ZOOM_REVERSE_WHEEL = new BooleanProperty("zoom.reverse-wheel", false); 44 41 45 42 static { 46 new JMapViewerUpdater(); 43 PROP_ZOOM_REVERSE_WHEEL.addListener(event -> updateJMapViewer()); 44 updateJMapViewer(); 47 45 } 48 46 49 private static class JMapViewerUpdater implements PreferenceChangedListener { 50 51 JMapViewerUpdater() { 52 Config.getPref().addPreferenceChangeListener(this); 53 updateJMapViewer(); 54 } 55 56 @Override 57 public void preferenceChanged(PreferenceChangeEvent e) { 58 if (MapMover.PROP_ZOOM_REVERSE_WHEEL.getKey().equals(e.getKey())) { 59 updateJMapViewer(); 60 } 61 } 62 63 private static void updateJMapViewer() { 64 JMapViewer.zoomReverseWheel = MapMover.PROP_ZOOM_REVERSE_WHEEL.get(); 65 } 47 private static void updateJMapViewer() { 48 JMapViewer.zoomReverseWheel = MapMover.PROP_ZOOM_REVERSE_WHEEL.get(); 66 49 } 67 50 68 51 private final class ZoomerAction extends AbstractAction { -
src/org/openstreetmap/josm/gui/autofilter/AutoFilterManager.java
diff --git a/src/org/openstreetmap/josm/gui/autofilter/AutoFilterManager.java b/src/org/openstreetmap/josm/gui/autofilter/AutoFilterManager.java index 9bc799d0b..fcedeaf20 100644
a b 52 52 import org.openstreetmap.josm.gui.layer.OsmDataLayer; 53 53 import org.openstreetmap.josm.gui.mappaint.mapcss.Selector; 54 54 import org.openstreetmap.josm.gui.widgets.OSDLabel; 55 import org.openstreetmap.josm.spi.preferences.Config;56 import org.openstreetmap.josm.spi.preferences.PreferenceChangeEvent;57 import org.openstreetmap.josm.spi.preferences.PreferenceChangedListener;58 55 import org.openstreetmap.josm.tools.Logging; 59 56 60 57 /** … … 63 60 * @since 12400 64 61 */ 65 62 public final class AutoFilterManager 66 implements ZoomChangeListener, MapModeChangeListener, DataSetListener, PreferenceChangedListener,LayerChangeListener {63 implements ZoomChangeListener, MapModeChangeListener, DataSetListener, LayerChangeListener { 67 64 68 65 /** 69 66 * Property to determines if the auto filter feature is enabled. … … public static AutoFilterManager getInstance() { 123 120 124 121 private AutoFilterManager() { 125 122 MapFrame.addMapModeChangeListener(this); 126 Config.getPref().addPreferenceChangeListener(this);123 registerPropertyListeners(); 127 124 NavigatableComponent.addZoomChangeListener(this); 128 125 MainApplication.getLayerManager().addLayerChangeListener(this); 129 126 DatasetEventManager.getInstance().addDatasetListener(this, FireMode.IN_EDT_CONSOLIDATED); … … private void resetCurrentAutoFilter() { 397 394 } 398 395 } 399 396 400 @Override 401 public void preferenceChanged(PreferenceChangeEvent e) { 402 if (e.getKey().equals(PROP_AUTO_FILTER_ENABLED.getKey())) { 397 private void registerPropertyListeners() { 398 PROP_AUTO_FILTER_ENABLED.addListener(event -> { 403 399 if (PROP_AUTO_FILTER_ENABLED.get()) { 404 400 enableAutoFilterRule(PROP_AUTO_FILTER_RULE.get()); 405 401 updateButtons(); … … public void preferenceChanged(PreferenceChangeEvent e) { 407 403 enableAutoFilterRule((AutoFilterRule) null); 408 404 resetCurrentAutoFilter(); 409 405 } 410 } else if (e.getKey().equals(PROP_AUTO_FILTER_RULE.getKey())) { 406 }); 407 PROP_AUTO_FILTER_RULE.addListener(event -> { 411 408 enableAutoFilterRule(PROP_AUTO_FILTER_RULE.get()); 412 409 resetCurrentAutoFilter(); 413 410 updateButtons(); 414 } 411 }); 415 412 } 416 413 417 414 @Override -
src/org/openstreetmap/josm/gui/dialogs/ToggleDialog.java
diff --git a/src/org/openstreetmap/josm/gui/dialogs/ToggleDialog.java b/src/org/openstreetmap/josm/gui/dialogs/ToggleDialog.java index dc072e29b..8fff76c8f 100644
a b 48 48 import javax.swing.SwingUtilities; 49 49 50 50 import org.openstreetmap.josm.actions.JosmAction; 51 import org.openstreetmap.josm.data.preferences.AbstractProperty; 51 52 import org.openstreetmap.josm.data.preferences.BooleanProperty; 52 53 import org.openstreetmap.josm.data.preferences.ParametrizedEnumProperty; 53 54 import org.openstreetmap.josm.gui.MainApplication; … … 66 67 import org.openstreetmap.josm.gui.util.WindowGeometry.WindowGeometryException; 67 68 import org.openstreetmap.josm.gui.widgets.PopupMenuLauncher; 68 69 import org.openstreetmap.josm.spi.preferences.Config; 69 import org.openstreetmap.josm.spi.preferences.PreferenceChangeEvent;70 import org.openstreetmap.josm.spi.preferences.PreferenceChangedListener;71 70 import org.openstreetmap.josm.tools.Destroyable; 72 71 import org.openstreetmap.josm.tools.GBC; 73 72 import org.openstreetmap.josm.tools.ImageProvider; … … 78 77 * This class is a toggle dialog that can be turned on and off. 79 78 * @since 8 80 79 */ 81 public class ToggleDialog extends JPanel implements ShowHideButtonListener, Helpful, AWTEventListener, Destroyable, PreferenceChangedListener{80 public class ToggleDialog extends JPanel implements ShowHideButtonListener, Helpful, AWTEventListener, Destroyable, AbstractProperty.ValueChangeListener<Boolean> { 82 81 83 82 /** 84 83 * The button-hiding strategy in toggler dialogs. … … public ToggleDialog(String name, String iconName, String tooltip, Shortcut short 256 255 setBorder(BorderFactory.createEtchedBorder()); 257 256 258 257 MainApplication.redirectToMainContentPane(this); 259 Config.getPref().addPreferenceChangeListener(this);258 PROP_DYNAMIC_BUTTONS.addListener(this); 260 259 261 260 registerInWindowMenu(); 262 261 } … … public void destroy() { 467 466 } catch (SecurityException e) { 468 467 Logging.log(Logging.LEVEL_ERROR, "Unable to remove AWT event listener", e); 469 468 } 470 Config.getPref().removePreferenceChangeListener(this);469 PROP_DYNAMIC_BUTTONS.removeListener(this); 471 470 destroyComponents(this, false); 472 471 } 473 472 … … public void eventDispatched(AWTEvent event) { 967 966 } 968 967 969 968 @Override 970 public void preferenceChanged(PreferenceChangeEvent e) { 971 if (e.getKey().equals(PROP_DYNAMIC_BUTTONS.getKey())) { 972 dynamicButtonsPropertyChanged(); 973 } 969 public void valueChanged(AbstractProperty.ValueChangeEvent<? extends Boolean> e) { 970 dynamicButtonsPropertyChanged(); 974 971 } 975 972 976 973 private void dynamicButtonsPropertyChanged() { -
src/org/openstreetmap/josm/gui/io/UploadDialog.java
diff --git a/src/org/openstreetmap/josm/gui/io/UploadDialog.java b/src/org/openstreetmap/josm/gui/io/UploadDialog.java index 8221f605e..9c3d6843c 100644
a b 52 52 import org.openstreetmap.josm.io.UploadStrategy; 53 53 import org.openstreetmap.josm.io.UploadStrategySpecification; 54 54 import org.openstreetmap.josm.spi.preferences.Config; 55 import org.openstreetmap.josm.spi.preferences.PreferenceChangeEvent;56 import org.openstreetmap.josm.spi.preferences.PreferenceChangedListener;57 import org.openstreetmap.josm.spi.preferences.Setting;58 55 import org.openstreetmap.josm.tools.GBC; 59 56 import org.openstreetmap.josm.tools.ImageOverlay; 60 57 import org.openstreetmap.josm.tools.ImageProvider; … … 67 64 * the upload changeset and the strategy for opening/closing a changeset. 68 65 * @since 2025 69 66 */ 70 public class UploadDialog extends AbstractUploadDialog implements PropertyChangeListener , PreferenceChangedListener{67 public class UploadDialog extends AbstractUploadDialog implements PropertyChangeListener { 71 68 /** the unique instance of the upload dialog */ 72 69 private static UploadDialog uploadDialog; 73 70 … … public void actionPerformed(ActionEvent e) { 246 243 247 244 setMinimumSize(new Dimension(600, 350)); 248 245 249 Config.getPref().addPreferenceChangeListener(this); 246 OsmApi.SERVER_URL_PROPERTY.addWeakListener(event -> { 247 String url = event.getProperty().get(); 248 if (url == null) { 249 url = OsmApi.getOsmApi().getBaseUrl(); 250 } 251 setTitle(tr("Upload to ''{0}''", url)); 252 }); 250 253 } 251 254 252 255 /** … … public void propertyChange(PropertyChangeEvent evt) { 633 636 } 634 637 } 635 638 636 /* -------------------------------------------------------------------------- */637 /* Interface PreferenceChangedListener */638 /* -------------------------------------------------------------------------- */639 @Override640 public void preferenceChanged(PreferenceChangeEvent e) {641 if (e.getKey() == null || !"osm-server.url".equals(e.getKey()))642 return;643 final Setting<?> newValue = e.getNewValue();644 final String url;645 if (newValue == null || newValue.getValue() == null) {646 url = OsmApi.getOsmApi().getBaseUrl();647 } else {648 url = newValue.getValue().toString();649 }650 setTitle(tr("Upload to ''{0}''", url));651 }652 653 639 private static String getLastChangesetTagFromHistory(String historyKey, List<String> def) { 654 640 Collection<String> history = Config.getPref().getList(historyKey, def); 655 641 int age = (int) (System.currentTimeMillis() / 1000 - Config.getPref().getInt(BasicUploadSettingsPanel.HISTORY_LAST_USED_KEY, 0)); -
src/org/openstreetmap/josm/gui/preferences/ToolbarPreferences.java
diff --git a/src/org/openstreetmap/josm/gui/preferences/ToolbarPreferences.java b/src/org/openstreetmap/josm/gui/preferences/ToolbarPreferences.java index d936dd52c..0fc5ee453 100644
a b 66 66 import org.openstreetmap.josm.actions.ParameterizedActionDecorator; 67 67 import org.openstreetmap.josm.data.imagery.ImageryInfo; 68 68 import org.openstreetmap.josm.data.imagery.ImageryLayerInfo; 69 import org.openstreetmap.josm.data.preferences.BooleanProperty; 69 70 import org.openstreetmap.josm.gui.MainApplication; 70 71 import org.openstreetmap.josm.gui.help.HelpUtil; 71 72 import org.openstreetmap.josm.gui.tagging.presets.TaggingPreset; … … 85 86 public class ToolbarPreferences implements PreferenceSettingFactory { 86 87 87 88 private static final String EMPTY_TOOLBAR_MARKER = "<!-empty-!>"; 89 private static final BooleanProperty PROP_TOOLBAR_VISIBLE = new BooleanProperty("toolbar.visible", true); 88 90 89 91 /** 90 92 * The prefix for imagery toolbar entries. … … public ToolbarPreferences() { 1008 1010 control.setFloatable(false); 1009 1011 control.setComponentPopupMenu(popupMenu); 1010 1012 }); 1011 Config.getPref().addPreferenceChangeListener(e -> { 1012 if ("toolbar.visible".equals(e.getKey())) { 1013 refreshToolbarControl(); 1014 } 1015 }); 1013 PROP_TOOLBAR_VISIBLE.addListener(event -> refreshToolbarControl()); 1016 1014 } 1017 1015 1018 1016 private void loadAction(DefaultMutableTreeNode node, MenuElement menu) { … … public void refreshToolbarControl() { 1194 1192 } 1195 1193 } 1196 1194 1197 boolean visible = Config.getPref().getBoolean("toolbar.visible", true);1195 boolean visible = PROP_TOOLBAR_VISIBLE.get(); 1198 1196 1199 1197 control.setFocusTraversalKeysEnabled(!unregisterTab); 1200 1198 control.setVisible(visible && control.getComponentCount() != 0); -
src/org/openstreetmap/josm/io/OsmApi.java
diff --git a/src/org/openstreetmap/josm/io/OsmApi.java b/src/org/openstreetmap/josm/io/OsmApi.java index 858d7ed51..7ac4909cc 100644
a b 30 30 import org.openstreetmap.josm.data.osm.IPrimitive; 31 31 import org.openstreetmap.josm.data.osm.OsmPrimitive; 32 32 import org.openstreetmap.josm.data.osm.OsmPrimitiveType; 33 import org.openstreetmap.josm.data.preferences.StringProperty; 33 34 import org.openstreetmap.josm.gui.progress.NullProgressMonitor; 34 35 import org.openstreetmap.josm.gui.progress.ProgressMonitor; 35 36 import org.openstreetmap.josm.io.Capabilities.CapabilitiesParser; … … 78 79 @Deprecated 79 80 public static final String DEFAULT_API_URL = "https://api.openstreetmap.org/api"; 80 81 82 public static StringProperty SERVER_URL_PROPERTY = new StringProperty( 83 "osm-server.url", Config.getUrls().getDefaultOsmApiUrl()); 84 81 85 // The collection of instantiated OSM APIs 82 86 private static final Map<String, OsmApi> instances = new HashMap<>(); 83 87 … … protected static void cacheInstance(OsmApi api) { 136 140 instances.put(api.getServerUrl(), api); 137 141 } 138 142 139 private static String getServerUrlFromPref() {140 return Config.getPref().get("osm-server.url", Config.getUrls().getDefaultOsmApiUrl());141 }142 143 143 /** 144 144 * Replies the {@link OsmApi} for the URL given by the preference <code>osm-server.url</code> 145 145 * 146 146 * @return the OsmApi 147 147 */ 148 148 public static OsmApi getOsmApi() { 149 return getOsmApi( getServerUrlFromPref());149 return getOsmApi(SERVER_URL_PROPERTY.get()); 150 150 } 151 151 152 152 /** Server URL */ … … public String getHost() { 212 212 213 213 @Override 214 214 protected void checkOfflineAccess() { 215 OnlineResource.OSM_API.checkOfflineAccess(getBaseUrl(getServerUrlFromPref(), "0.6")+CAPABILITIES, getServerUrlFromPref()); 215 final String serverUrl = SERVER_URL_PROPERTY.get(); 216 OnlineResource.OSM_API.checkOfflineAccess(getBaseUrl(serverUrl, "0.6")+CAPABILITIES, serverUrl); 216 217 } 217 218 218 219 @Override
