1 /*
2 * Created on 11.03.2004
3 */
4 package org.xpcards.utils;
5
6 import java.util.Vector;
7
8 import org.eclipse.swt.widgets.Listener;
9
10 /***
11 * @author galu02
12 */
13 public class EventListenersSupport {
14
15 Class[] types;
16 Object[] listeners;
17 int level;
18
19 public void hook(Class type, Object listener) {
20
21 if ( listener == null || type == null || !type.isAssignableFrom(listener.getClass())) {
22 return;
23 }
24
25 if (types == null)
26 types = new Class[4];
27 if (listeners == null)
28 listeners = new Listener[4];
29
30 int length = types.length, index = length - 1;
31 while (index >= 0) {
32 if (types[index] != null)
33 break;
34 --index;
35 }
36 index++;
37 if (index == length) {
38 if (level == 0) {
39 index = 0;
40 for (int i = 0; i < types.length; i++) {
41 if (types[i] != null) {
42 types[index] = types[i];
43 listeners[index] = listeners[i];
44 index++;
45 }
46 }
47 for (int i = index; i < types.length; i++) {
48 types[i] = null;
49 listeners[i] = null;
50 }
51 }
52 if (index == length) {
53 Class[] newTypes = new Class[length + 4];
54 System.arraycopy(types, 0, newTypes, 0, length);
55 types = newTypes;
56 Listener[] newListeners = new Listener[length + 4];
57 System.arraycopy(listeners, 0, newListeners, 0, length);
58 listeners = newListeners;
59 }
60 }
61 types[index] = type;
62 listeners[index] = listener;
63 }
64
65 public boolean hooks(Class eventType) {
66 if (types == null)
67 return false;
68 for (int i = 0; i < types.length; i++) {
69 if (types[i] == eventType)
70 return true;
71 }
72 return false;
73 }
74
75 public Object[] getListeners(Class type) {
76 if (types == null)
77 return null;
78 level++;
79 try {
80 Vector v = null;
81
82 for (int i = 0; i < types.length; i++) {
83 if (types[i] == type) {
84 Object listener = listeners[i];
85 if (listener != null) {
86 v.add(listener);
87 }
88 }
89 }
90 if ( v != null ) {
91 return v.toArray();
92 }
93 } finally {
94 --level;
95 }
96 return null;
97 }
98
99 public int size() {
100 if (types == null)
101 return 0;
102 int count = 0;
103 for (int i = 0; i < types.length; i++) {
104 if (types[i] != null )
105 count++;
106 }
107 return count;
108 }
109
110 void remove(int index) {
111 if (level == 0) {
112 int end = types.length - 1;
113 System.arraycopy(types, index + 1, types, index, end - index);
114 System.arraycopy(
115 listeners,
116 index + 1,
117 listeners,
118 index,
119 end - index);
120 index = end;
121 }
122 types[index] = null;
123 listeners[index] = null;
124 }
125
126 public void unhook(Class eventType, Listener listener) {
127 if (types == null)
128 return;
129 for (int i = 0; i < types.length; i++) {
130 if (types[i] == eventType && listeners[i] == listener) {
131 remove(i);
132 return;
133 }
134 }
135 }
136
137 }
This page was automatically generated by Maven