Ignore:
Timestamp:
2017-05-15T19:28:35+02:00 (7 years ago)
Author:
michael2402
Message:

Add a new ListenableWeakReference. Use it to not lose references to weak preference listeners too early.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/org/openstreetmap/josm/data/preferences/AbstractProperty.java

    r11553 r12181  
    66import org.openstreetmap.josm.data.Preferences.PreferenceChangeEvent;
    77import org.openstreetmap.josm.data.Preferences.PreferenceChangedListener;
     8import org.openstreetmap.josm.tools.ListenableWeakReference;
    89
    910/**
     
    250251     */
    251252    public void addWeakListener(ValueChangeListener<? super T> listener) {
    252         addWeakListenerImpl(new PreferenceChangedListenerAdapter(listener));
    253     }
    254 
    255     protected void addWeakListenerImpl(PreferenceChangedListener adapter) {
    256         getPreferences().addWeakKeyPreferenceChangeListener(getKey(), adapter);
     253        ValueChangeListener<T> weakListener = new WeakPreferenceAdapter(listener);
     254        PreferenceChangedListenerAdapter adapter = new PreferenceChangedListenerAdapter(weakListener);
     255        addListenerImpl(adapter);
     256    }
     257
     258    private class WeakPreferenceAdapter extends ListenableWeakReference<ValueChangeListener<? super T>>
     259            implements ValueChangeListener<T> {
     260        public WeakPreferenceAdapter(ValueChangeListener<? super T> referent) {
     261            super(referent);
     262        }
     263
     264        @Override
     265        public void valueChanged(ValueChangeEvent<? extends T> e) {
     266            ValueChangeListener<? super T> r = this.get();
     267            r.valueChanged(e);
     268        }
     269
     270        @Override
     271        protected void onDereference() {
     272            removeListenerImpl(new PreferenceChangedListenerAdapter(this));
     273        }
     274
    257275    }
    258276
Note: See TracChangeset for help on using the changeset viewer.