source: josm/trunk/src/org/openstreetmap/josm/data/osm/event/SelectionEventManager.java@ 10608

Last change on this file since 10608 was 10608, checked in by Don-vip, 8 years ago

see #11390 - sonar - squid:S1604 - Java 8: Anonymous inner classes containing only one method should become lambdas

  • Property svn:eol-style set to native
File size: 3.3 KB
Line 
1// License: GPL. For details, see LICENSE file.
2package org.openstreetmap.josm.data.osm.event;
3
4import java.util.Collection;
5import java.util.List;
6import java.util.Objects;
7import java.util.concurrent.CopyOnWriteArrayList;
8
9import javax.swing.SwingUtilities;
10
11import org.openstreetmap.josm.data.SelectionChangedListener;
12import org.openstreetmap.josm.data.osm.DataSet;
13import org.openstreetmap.josm.data.osm.OsmPrimitive;
14import org.openstreetmap.josm.data.osm.event.DatasetEventManager.FireMode;
15
16/**
17 * Similar like {@link DatasetEventManager}, just for selection events. Because currently selection changed
18 * event are global, only FIRE_IN_EDT and FIRE_EDT_CONSOLIDATED modes are really useful
19 *
20 */
21public class SelectionEventManager implements SelectionChangedListener {
22
23 private static final SelectionEventManager instance = new SelectionEventManager();
24
25 public static SelectionEventManager getInstance() {
26 return instance;
27 }
28
29 private static class ListenerInfo {
30 private final SelectionChangedListener listener;
31
32 ListenerInfo(SelectionChangedListener listener) {
33 this.listener = listener;
34 }
35
36 @Override
37 public int hashCode() {
38 return Objects.hash(listener);
39 }
40
41 @Override
42 public boolean equals(Object o) {
43 if (this == o) return true;
44 if (o == null || getClass() != o.getClass()) return false;
45 ListenerInfo that = (ListenerInfo) o;
46 return Objects.equals(listener, that.listener);
47 }
48 }
49
50 private Collection<? extends OsmPrimitive> selection;
51 private final CopyOnWriteArrayList<ListenerInfo> inEDTListeners = new CopyOnWriteArrayList<>();
52 private final CopyOnWriteArrayList<ListenerInfo> normalListeners = new CopyOnWriteArrayList<>();
53
54 /**
55 * Constructs a new {@code SelectionEventManager}.
56 */
57 public SelectionEventManager() {
58 DataSet.addSelectionListener(this);
59 }
60
61 public void addSelectionListener(SelectionChangedListener listener, FireMode fireMode) {
62 if (fireMode == FireMode.IN_EDT)
63 throw new UnsupportedOperationException("IN_EDT mode not supported, you probably want to use IN_EDT_CONSOLIDATED.");
64 if (fireMode == FireMode.IN_EDT || fireMode == FireMode.IN_EDT_CONSOLIDATED) {
65 inEDTListeners.addIfAbsent(new ListenerInfo(listener));
66 } else {
67 normalListeners.addIfAbsent(new ListenerInfo(listener));
68 }
69 }
70
71 public void removeSelectionListener(SelectionChangedListener listener) {
72 ListenerInfo searchListener = new ListenerInfo(listener);
73 inEDTListeners.remove(searchListener);
74 normalListeners.remove(searchListener);
75 }
76
77 @Override
78 public void selectionChanged(Collection<? extends OsmPrimitive> newSelection) {
79 fireEvents(normalListeners, newSelection);
80 selection = newSelection;
81 SwingUtilities.invokeLater(edtRunnable);
82 }
83
84 private static void fireEvents(List<ListenerInfo> listeners, Collection<? extends OsmPrimitive> newSelection) {
85 for (ListenerInfo listener: listeners) {
86 listener.listener.selectionChanged(newSelection);
87 }
88 }
89
90 private final Runnable edtRunnable = () -> {
91 if (selection != null) {
92 fireEvents(inEDTListeners, selection);
93 }
94 };
95}
Note: See TracBrowser for help on using the repository browser.