Changeset 8509 in josm for trunk/src/org/openstreetmap/josm/data/osm/event/DatasetEventManager.java
- Timestamp:
- 2015-06-20T14:36:00+02:00 (9 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/org/openstreetmap/josm/data/osm/event/DatasetEventManager.java
r8285 r8509 29 29 private static final DatasetEventManager instance = new DatasetEventManager(); 30 30 31 public enum FireMode { 32 /** 33 * Fire in calling thread immediately. 34 */ 35 IMMEDIATELY, 36 /** 37 * Fire in event dispatch thread. 38 */ 39 IN_EDT, 40 /** 41 * Fire in event dispatch thread. If more than one event arrived when event queue is checked, merged them to 42 * one event 43 */ 44 IN_EDT_CONSOLIDATED} 45 46 private static class ListenerInfo { 47 private final DataSetListener listener; 48 private final boolean consolidate; 49 50 public ListenerInfo(DataSetListener listener, boolean consolidate) { 51 this.listener = listener; 52 this.consolidate = consolidate; 53 } 54 55 @Override 56 public int hashCode() { 57 return listener.hashCode(); 58 } 59 60 @Override 61 public boolean equals(Object o) { 62 return o instanceof ListenerInfo && ((ListenerInfo)o).listener == listener; 63 } 64 } 65 66 public static DatasetEventManager getInstance() { 67 return instance; 68 } 69 70 private final Queue<AbstractDatasetChangedEvent> eventsInEDT = new LinkedBlockingQueue<>(); 71 private final CopyOnWriteArrayList<ListenerInfo> inEDTListeners = new CopyOnWriteArrayList<>(); 72 private final CopyOnWriteArrayList<ListenerInfo> normalListeners = new CopyOnWriteArrayList<>(); 73 private final DataSetListener myListener = new DataSetListenerAdapter(this); 74 75 /** 76 * Constructs a new {@code DatasetEventManager}. 77 */ 78 public DatasetEventManager() { 79 MapView.addEditLayerChangeListener(this); 80 } 81 82 /** 83 * Register listener, that will receive events from currently active dataset 84 * @param listener the listener to be registered 85 * @param fireMode If {@link FireMode#IN_EDT} or {@link FireMode#IN_EDT_CONSOLIDATED}, 86 * listener will be notified in event dispatch thread instead of thread that caused 87 * the dataset change 88 */ 89 public void addDatasetListener(DataSetListener listener, FireMode fireMode) { 90 if (fireMode == FireMode.IN_EDT || fireMode == FireMode.IN_EDT_CONSOLIDATED) { 91 inEDTListeners.addIfAbsent(new ListenerInfo(listener, fireMode == FireMode.IN_EDT_CONSOLIDATED)); 92 } else { 93 normalListeners.addIfAbsent(new ListenerInfo(listener, false)); 94 } 95 } 96 97 public void removeDatasetListener(DataSetListener listener) { 98 ListenerInfo searchListener = new ListenerInfo(listener, false); 99 inEDTListeners.remove(searchListener); 100 normalListeners.remove(searchListener); 101 } 102 103 @Override 104 public void editLayerChanged(OsmDataLayer oldLayer, OsmDataLayer newLayer) { 105 if (oldLayer != null) { 106 oldLayer.data.removeDataSetListener(myListener); 107 } 108 109 if (newLayer != null) { 110 newLayer.data.addDataSetListener(myListener); 111 processDatasetEvent(new DataChangedEvent(newLayer.data)); 112 } else { 113 processDatasetEvent(new DataChangedEvent(null)); 114 } 115 } 116 117 private void fireEvents(List<ListenerInfo> listeners, AbstractDatasetChangedEvent event) { 118 for (ListenerInfo listener: listeners) { 119 if (!listener.consolidate) { 120 event.fire(listener.listener); 121 } 122 } 123 } 124 125 private void fireConsolidatedEvents(List<ListenerInfo> listeners, AbstractDatasetChangedEvent event) { 126 for (ListenerInfo listener: listeners) { 127 if (listener.consolidate) { 128 event.fire(listener.listener); 129 } 130 } 131 } 132 133 @Override 134 public void processDatasetEvent(AbstractDatasetChangedEvent event) { 135 fireEvents(normalListeners, event); 136 eventsInEDT.add(event); 137 SwingUtilities.invokeLater(edtRunnable); 138 } 139 140 private final Runnable edtRunnable = new Runnable() { 31 private final class EdtRunnable implements Runnable { 141 32 @Override 142 33 public void run() { 143 34 while (!eventsInEDT.isEmpty()) { 144 List<AbstractDatasetChangedEvent> events = new ArrayList<>(); 145 events.addAll(eventsInEDT); 35 List<AbstractDatasetChangedEvent> events = new ArrayList<>(eventsInEDT); 146 36 147 37 DataSet dataSet = null; … … 192 82 consolidatedEvent = new DataChangedEvent(dataSet, new ArrayList<>(Arrays.asList(consolidatedEvent))); 193 83 } 194 195 84 } 196 85 } … … 200 89 } 201 90 } 202 }; 91 } 92 93 public enum FireMode { 94 /** 95 * Fire in calling thread immediately. 96 */ 97 IMMEDIATELY, 98 /** 99 * Fire in event dispatch thread. 100 */ 101 IN_EDT, 102 /** 103 * Fire in event dispatch thread. If more than one event arrived when event queue is checked, merged them to 104 * one event 105 */ 106 IN_EDT_CONSOLIDATED} 107 108 private static class ListenerInfo { 109 private final DataSetListener listener; 110 private final boolean consolidate; 111 112 public ListenerInfo(DataSetListener listener, boolean consolidate) { 113 this.listener = listener; 114 this.consolidate = consolidate; 115 } 116 117 @Override 118 public int hashCode() { 119 return listener.hashCode(); 120 } 121 122 @Override 123 public boolean equals(Object o) { 124 return o instanceof ListenerInfo && ((ListenerInfo)o).listener == listener; 125 } 126 } 127 128 public static DatasetEventManager getInstance() { 129 return instance; 130 } 131 132 private final Queue<AbstractDatasetChangedEvent> eventsInEDT = new LinkedBlockingQueue<>(); 133 private final CopyOnWriteArrayList<ListenerInfo> inEDTListeners = new CopyOnWriteArrayList<>(); 134 private final CopyOnWriteArrayList<ListenerInfo> normalListeners = new CopyOnWriteArrayList<>(); 135 private final DataSetListener myListener = new DataSetListenerAdapter(this); 136 private final Runnable edtRunnable = new EdtRunnable(); 137 138 /** 139 * Constructs a new {@code DatasetEventManager}. 140 */ 141 public DatasetEventManager() { 142 MapView.addEditLayerChangeListener(this); 143 } 144 145 /** 146 * Register listener, that will receive events from currently active dataset 147 * @param listener the listener to be registered 148 * @param fireMode If {@link FireMode#IN_EDT} or {@link FireMode#IN_EDT_CONSOLIDATED}, 149 * listener will be notified in event dispatch thread instead of thread that caused 150 * the dataset change 151 */ 152 public void addDatasetListener(DataSetListener listener, FireMode fireMode) { 153 if (fireMode == FireMode.IN_EDT || fireMode == FireMode.IN_EDT_CONSOLIDATED) { 154 inEDTListeners.addIfAbsent(new ListenerInfo(listener, fireMode == FireMode.IN_EDT_CONSOLIDATED)); 155 } else { 156 normalListeners.addIfAbsent(new ListenerInfo(listener, false)); 157 } 158 } 159 160 public void removeDatasetListener(DataSetListener listener) { 161 ListenerInfo searchListener = new ListenerInfo(listener, false); 162 inEDTListeners.remove(searchListener); 163 normalListeners.remove(searchListener); 164 } 165 166 @Override 167 public void editLayerChanged(OsmDataLayer oldLayer, OsmDataLayer newLayer) { 168 if (oldLayer != null) { 169 oldLayer.data.removeDataSetListener(myListener); 170 } 171 172 if (newLayer != null) { 173 newLayer.data.addDataSetListener(myListener); 174 processDatasetEvent(new DataChangedEvent(newLayer.data)); 175 } else { 176 processDatasetEvent(new DataChangedEvent(null)); 177 } 178 } 179 180 private void fireEvents(List<ListenerInfo> listeners, AbstractDatasetChangedEvent event) { 181 for (ListenerInfo listener: listeners) { 182 if (!listener.consolidate) { 183 event.fire(listener.listener); 184 } 185 } 186 } 187 188 private void fireConsolidatedEvents(List<ListenerInfo> listeners, AbstractDatasetChangedEvent event) { 189 for (ListenerInfo listener: listeners) { 190 if (listener.consolidate) { 191 event.fire(listener.listener); 192 } 193 } 194 } 195 196 @Override 197 public void processDatasetEvent(AbstractDatasetChangedEvent event) { 198 fireEvents(normalListeners, event); 199 eventsInEDT.add(event); 200 SwingUtilities.invokeLater(edtRunnable); 201 } 203 202 }
Note:
See TracChangeset
for help on using the changeset viewer.