source: josm/trunk/src/org/openstreetmap/josm/data/osm/event/DatasetEventManager.java@ 2652

Last change on this file since 2652 was 2652, checked in by jttt, 14 years ago

Added listener for edit layer change (not just active layer)

  • Property svn:mime-type set to text/plain
File size: 3.2 KB
Line 
1// License: GPL. For details, see LICENSE file.
2package org.openstreetmap.josm.data.osm.event;
3
4import java.util.ArrayList;
5import java.util.List;
6import java.util.Queue;
7import java.util.concurrent.LinkedBlockingQueue;
8
9import javax.swing.SwingUtilities;
10
11import org.openstreetmap.josm.data.osm.event.DataSetListenerAdapter.Listener;
12import org.openstreetmap.josm.gui.MapView;
13import org.openstreetmap.josm.gui.layer.OsmDataLayer;
14
15
16/**
17 * This class allows to add DatasetListener to currently active dataset. If active
18 * layer is changed, listeners are automatically registered at new active dataset
19 * (it's no longer necessary to register for layer events and reregister every time
20 * new layer is selected)
21 *
22 * Events in EDT are supported, see {@link #addDatasetListener(DataSetListener, boolean)}
23 *
24 */
25public class DatasetEventManager implements MapView.EditLayerChangeListener, Listener {
26
27 private static final DatasetEventManager instance = new DatasetEventManager();
28
29 public static DatasetEventManager getInstance() {
30 return instance;
31 }
32
33 private final Queue<AbstractDatasetChangedEvent> eventsInEDT = new LinkedBlockingQueue<AbstractDatasetChangedEvent>();
34 private final List<DataSetListener> inEDTListeners = new ArrayList<DataSetListener>();
35 private final List<DataSetListener> normalListeners = new ArrayList<DataSetListener>();
36 private final DataSetListener myListener = new DataSetListenerAdapter(this);
37
38 public DatasetEventManager() {
39 MapView.addEditLayerChangeListener(this);
40 }
41
42 /**
43 * Register listener, that will receive events from currently active dataset
44 * @param listener
45 * @param fireInEDT If true, listener will be notified in event dispatch thread
46 * instead of thread that caused the dataset change
47 */
48 public void addDatasetListener(DataSetListener listener, boolean fireInEDT) {
49 if (fireInEDT) {
50 inEDTListeners.add(listener);
51 } else {
52 normalListeners.add(listener);
53 }
54 }
55
56 public void removeDatasetListener(DataSetListener listener) {
57 inEDTListeners.remove(listener);
58 normalListeners.remove(listener);
59 }
60
61 public void editLayerChanged(OsmDataLayer oldLayer, OsmDataLayer newLayer) {
62 if (oldLayer != null) {
63 oldLayer.data.removeDataSetListener(myListener);
64 }
65
66 if (newLayer != null) {
67 newLayer.data.addDataSetListener(myListener);
68 processDatasetEvent(new DataChangedEvent(newLayer.data));
69 } else {
70 processDatasetEvent(new DataChangedEvent(null));
71 }
72 }
73
74 public void processDatasetEvent(AbstractDatasetChangedEvent event) {
75 for (DataSetListener listener: normalListeners) {
76 event.fire(listener);
77 }
78 eventsInEDT.add(event);
79 SwingUtilities.invokeLater(edtRunnable);
80 }
81
82 private final Runnable edtRunnable = new Runnable() {
83 public void run() {
84 AbstractDatasetChangedEvent event = null;
85 while ((event = eventsInEDT.poll()) != null) {
86 for (DataSetListener listener: inEDTListeners) {
87 event.fire(listener);
88 }
89 }
90 }
91 };
92}
Note: See TracBrowser for help on using the repository browser.