Changeset 15609 in josm


Ignore:
Timestamp:
2019-12-23T22:41:07+01:00 (6 years ago)
Author:
Don-vip
Message:

fix #18436 - add listeners to know when a DataSet's DataSources change (patch by taylor.smock)

Location:
trunk
Files:
7 added
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/org/openstreetmap/josm/actions/AbstractUploadAction.java

    r15513 r15609  
    1212 * Abstract super-class of all upload actions.
    1313 * Listens to layer change events to update its enabled state.
    14  * @since xxx
     14 * @since 15513
    1515 */
    1616public abstract class AbstractUploadAction extends JosmAction {
  • trunk/src/org/openstreetmap/josm/data/osm/DataSet.java

    r15497 r15609  
    1111import java.util.HashSet;
    1212import java.util.Iterator;
     13import java.util.LinkedHashSet;
    1314import java.util.LinkedList;
    1415import java.util.List;
     
    4344import org.openstreetmap.josm.data.osm.event.DataChangedEvent;
    4445import org.openstreetmap.josm.data.osm.event.DataSetListener;
     46import org.openstreetmap.josm.data.osm.event.DataSourceAddedEvent;
     47import org.openstreetmap.josm.data.osm.event.DataSourceRemovedEvent;
    4548import org.openstreetmap.josm.data.osm.event.FilterChangedEvent;
    4649import org.openstreetmap.josm.data.osm.event.NodeMovedEvent;
     
    166169    private final Collection<DataSource> dataSources = new LinkedList<>();
    167170
     171    /**
     172     * A list of listeners that listen to DataSource changes on this layer
     173     */
     174    private final ListenerList<DataSourceListener> dataSourceListeners = ListenerList.create();
     175
    168176    private final ConflictCollection conflicts = new ConflictCollection();
    169177
     
    226234                        .collect(Collectors.toList()));
    227235            }
     236            DataSourceAddedEvent addedEvent = new DataSourceAddedEvent(this,
     237                    new LinkedHashSet<>(dataSources), copyFrom.dataSources.stream());
    228238            for (DataSource source : copyFrom.dataSources) {
    229239                dataSources.add(new DataSource(source));
    230240            }
     241            dataSourceListeners.fireEvent(d -> d.dataSourceChange(addedEvent));
    231242            version = copyFrom.version;
    232243            uploadPolicy = copyFrom.uploadPolicy;
     
    272283     */
    273284    public synchronized boolean addDataSources(Collection<DataSource> sources) {
     285        DataSourceAddedEvent addedEvent = new DataSourceAddedEvent(this,
     286                new LinkedHashSet<>(dataSources), sources.stream());
    274287        boolean changed = dataSources.addAll(sources);
    275288        if (changed) {
     
    277290            cachedDataSourceBounds = null;
    278291        }
     292        dataSourceListeners.fireEvent(d -> d.dataSourceChange(addedEvent));
    279293        return changed;
    280294    }
     
    573587    public void removeHighlightUpdateListener(HighlightUpdateListener listener) {
    574588        highlightUpdateListeners.removeListener(listener);
     589    }
     590
     591    /**
     592     * Adds a listener that gets notified whenever the data sources change
     593     *
     594     * @param listener The listener
     595     * @see #removeDataSourceListener
     596     * @see #getDataSources
     597     * @since 15609
     598     */
     599    public void addDataSourceListener(DataSourceListener listener) {
     600        dataSourceListeners.addListener(listener);
     601    }
     602
     603    /**
     604     * Removes a listener that gets notified whenever the data sources change
     605     *
     606     * @param listener The listener
     607     * @see #addDataSourceListener
     608     * @see #getDataSources
     609     * @since 15609
     610     */
     611    public void removeDataSourceListener(DataSourceListener listener) {
     612        dataSourceListeners.removeListener(listener);
    575613    }
    576614
     
    10851123            synchronized (from) {
    10861124                if (!from.dataSources.isEmpty()) {
    1087                     if (dataSources.addAll(from.dataSources)) {
     1125                    DataSourceAddedEvent addedEvent = new DataSourceAddedEvent(
     1126                            this, new LinkedHashSet<>(dataSources), from.dataSources.stream());
     1127                    DataSourceRemovedEvent clearEvent = new DataSourceRemovedEvent(
     1128                            this, new LinkedHashSet<>(from.dataSources), from.dataSources.stream());
     1129                    if (from.dataSources.stream().filter(dataSource -> !dataSources.contains(dataSource))
     1130                            .map(dataSources::add).filter(Boolean.TRUE::equals).count() > 0) {
    10881131                        cachedDataSourceArea = null;
    10891132                        cachedDataSourceBounds = null;
     
    10921135                    from.cachedDataSourceArea = null;
    10931136                    from.cachedDataSourceBounds = null;
     1137                    dataSourceListeners.fireEvent(d -> d.dataSourceChange(addedEvent));
     1138                    from.dataSourceListeners.fireEvent(d -> d.dataSourceChange(clearEvent));
    10941139                }
    10951140            }
  • trunk/test/unit/org/openstreetmap/josm/data/osm/DataSetTest.java

    r13565 r15609  
    1414import org.junit.Rule;
    1515import org.junit.Test;
     16import org.openstreetmap.josm.data.Bounds;
     17import org.openstreetmap.josm.data.DataSource;
    1618import org.openstreetmap.josm.data.coor.LatLon;
     19import org.openstreetmap.josm.data.osm.event.DataSourceAddedEvent;
     20import org.openstreetmap.josm.data.osm.event.DataSourceRemovedEvent;
    1721import org.openstreetmap.josm.testutils.JOSMTestRules;
    1822
     
    248252        assertTrue(UploadPolicy.DISCOURAGED.compareTo(UploadPolicy.NORMAL) > 0);
    249253    }
     254
     255    /**
     256     * Checks that data source listeners get called when a data source is added
     257     */
     258    @Test
     259    public void testAddDataSourceListener() {
     260        DataSourceListener addListener = new DataSourceListener() {
     261            @Override
     262            public void dataSourceChange(DataSourceChangeEvent event) {
     263                assertTrue(event instanceof DataSourceAddedEvent);
     264            }
     265        };
     266
     267        DataSet ds = new DataSet();
     268        ds.addDataSourceListener(addListener);
     269        ds.addDataSource(new DataSource(new Bounds(0, 0, 0.1, 0.1), "fake source"));
     270
     271    }
     272
     273    /**
     274     * Checks that data source listeners get called when a data source is removed
     275     */
     276    @Test
     277    public void testRemoveDataSourceListener() {
     278        DataSourceListener removeListener = new DataSourceListener() {
     279            @Override
     280            public void dataSourceChange(DataSourceChangeEvent event) {
     281                assertTrue(event instanceof DataSourceRemovedEvent);
     282            }
     283        };
     284
     285        DataSet ds = new DataSet();
     286        ds.addDataSource(new DataSource(new Bounds(0, 0, 0.1, 0.1), "fake source"));
     287        ds.addDataSourceListener(removeListener);
     288        new DataSet().mergeFrom(ds);
     289    }
    250290}
Note: See TracChangeset for help on using the changeset viewer.