Bundle: fix memory leak at init/reset
[fanfix.git] / ui / ListenerPanel.java
CommitLineData
a917f100
NR
1package be.nikiroo.utils.ui;
2
3import java.awt.event.ActionEvent;
4import java.awt.event.ActionListener;
5import java.util.LinkedList;
6import java.util.Queue;
7
8import javax.swing.JPanel;
9
10/**
11 * A {@link JPanel} with the default {@link ActionListener} add/remove/fire
12 * methods.
13 * <p>
14 * Note that it will queue all events until at least one listener comes (or
15 * comes back!); this first (or at least currently unique) listener will drain
16 * the queue.
17 *
18 * @author niki
19 */
4d4527e7 20public class ListenerPanel extends JPanel implements ListenerItem {
a917f100
NR
21 private static final long serialVersionUID = 1L;
22
23 /** Waiting queue until at least one listener is here to get the events. */
24 private final Queue<ActionEvent> waitingQueue;
25
26 /**
27 * Create a new {@link ListenerPanel}.
28 */
29 public ListenerPanel() {
30 waitingQueue = new LinkedList<ActionEvent>();
31 }
32
4d4527e7 33 @Override
a917f100
NR
34 public synchronized boolean hasListeners() {
35 return listenerList.getListenerList().length > 1;
36 }
37
4d4527e7 38 @Override
a917f100
NR
39 public synchronized int getWaitingEventCount() {
40 return waitingQueue.size();
41 }
42
4d4527e7 43 @Override
a917f100
NR
44 public synchronized void addActionListener(ActionListener listener) {
45 if (!hasListeners()) {
46 while (!waitingQueue.isEmpty()) {
47 listener.actionPerformed(waitingQueue.remove());
48 }
49 }
50
51 listenerList.add(ActionListener.class, listener);
52 }
53
4d4527e7 54 @Override
a917f100
NR
55 public synchronized void removeActionListener(ActionListener listener) {
56 listenerList.remove(ActionListener.class, listener);
57 }
58
4d4527e7
NR
59 @Override
60 public synchronized void fireActionPerformed(String listenerCommand) {
a917f100
NR
61 ActionEvent e = new ActionEvent(this, ActionEvent.ACTION_PERFORMED,
62 listenerCommand);
63
64 ActionListener[] listeners = getListeners(ActionListener.class);
65 if (listeners.length > 0) {
66 for (ActionListener action : listeners) {
67 action.actionPerformed(e);
68 }
69 } else {
70 waitingQueue.add(e);
71 }
72 }
73}