1 package org.apidesign.openfixed;
3 import java.util.HashSet;
6 import java.util.concurrent.CopyOnWriteArrayList;
7 import java.util.concurrent.Executor;
8 import java.util.concurrent.Executors;
12 * @author Jaroslav Tulach <jtulach@netbeans.org>
14 final class PostEventSupport implements EventSupport, Runnable {
15 private final List<ModificationListener> listeners = new CopyOnWriteArrayList<ModificationListener>();
16 private final List<Deliverable> deliverables = new CopyOnWriteArrayList<Deliverable>();
17 private static final Executor EXEC = Executors.newSingleThreadExecutor();
23 public void fireModificationEvent(ModificationEvent ev) {
24 synchronized (deliverables) {
25 final Deliverable d = new Deliverable(ev, listeners.toArray(new ModificationListener[0]));
32 public void add(ModificationListener l) {
37 public void remove(ModificationListener l) {
43 Deliverable[] pending;
44 synchronized (deliverables) {
45 if (deliverables.isEmpty()) {
48 pending = deliverables.toArray(new Deliverable[0]);
51 Calculator calc = null;
52 Set<PostModificationListener> notify = new HashSet<PostModificationListener>();
53 int pendingCount = pending.length;
54 for (Deliverable d : pending) {
55 calc = (Calculator)d.ev.getSource();
56 d.ev.pending = --pendingCount;
58 for (ModificationListener l : d.listeners) {
64 for (PostModificationListener pml : notify) {
65 pml.postProcess(new PostModificationEvent(calc));
69 private static class Deliverable {
70 final ModificationEvent ev;
71 final ModificationListener[] listeners;
73 public Deliverable(ModificationEvent ev, ModificationListener[] listeners) {
75 this.listeners = listeners;