001// License: GPL. For details, see LICENSE file. 002package org.openstreetmap.josm.plugins.streetside; 003 004import java.util.AbstractSet; 005import java.util.Collections; 006import java.util.HashSet; 007import java.util.Iterator; 008import java.util.Set; 009import java.util.concurrent.ConcurrentHashMap; 010 011import org.openstreetmap.josm.plugins.streetside.utils.StreetsideChangesetListener; 012 013public class StreetsideLocationChangeset extends AbstractSet<StreetsideImage> { 014 private final Set<StreetsideChangesetListener> listeners = new HashSet<>(); 015 private final Set<StreetsideImage> changeset = Collections.newSetFromMap(new ConcurrentHashMap<>()); 016 017 public void addChangesetListener(StreetsideChangesetListener listener) { 018 listeners.add(listener); 019 } 020 021 public void cleanChangeset() { 022 changeset.clear(); 023 fireListeners(); 024 } 025 026 private void fireListeners() { 027 listeners.forEach(StreetsideChangesetListener::changesetChanged); 028 } 029 030 @Override 031 public boolean add(StreetsideImage image) { 032 boolean add = changeset.add(image); 033 fireListeners(); 034 return add; 035 } 036 037 @Override 038 public Iterator<StreetsideImage> iterator() { 039 return changeset.iterator(); 040 } 041 042 @Override 043 public int size() { 044 return changeset.size(); 045 } 046 047 @Override 048 public boolean remove(Object image) { 049 boolean remove = changeset.remove(image); 050 fireListeners(); 051 return remove; 052 } 053}