Lines 53-59
Link Here
|
53 |
// empty result |
53 |
// empty result |
54 |
return Lookup.EMPTY.lookup (template); |
54 |
return Lookup.EMPTY.lookup (template); |
55 |
} |
55 |
} |
56 |
return new R (delegate.lookup (template)); |
56 |
return delegate.lookup (template); |
57 |
} |
57 |
} |
58 |
|
58 |
|
59 |
public Object lookup(Class clazz) { |
59 |
public Object lookup(Class clazz) { |
Lines 61-92
Link Here
|
61 |
return null; |
61 |
return null; |
62 |
} |
62 |
} |
63 |
|
63 |
|
64 |
Object res = delegate.lookup (clazz); |
64 |
return delegate.lookup (clazz); |
65 |
if (res == null) { |
|
|
66 |
return null; |
67 |
} |
68 |
|
69 |
Class[] arr = classes(); |
70 |
for (int i = 0; i < arr.length; i++) { |
71 |
if (arr[i].isInstance (res)) { |
72 |
return null; |
73 |
} |
74 |
} |
75 |
return res; |
76 |
} |
65 |
} |
77 |
|
66 |
|
78 |
public org.openide.util.Lookup.Item lookupItem (org.openide.util.Lookup.Template template) { |
67 |
public org.openide.util.Lookup.Item lookupItem (org.openide.util.Lookup.Template template) { |
79 |
org.openide.util.Lookup.Item retValue = delegate.lookupItem (template); |
68 |
if (areSubclassesOfThisClassAlwaysExcluded (template.getType ())) { |
80 |
if (retValue == null) return null; |
69 |
return null; |
81 |
|
|
|
82 |
Class[] arr = classes(); |
83 |
for (int i = 0; i < arr.length; i++) { |
84 |
if (acceptFilter (arr[i], retValue, 2)) { |
85 |
return null; |
86 |
} |
87 |
} |
70 |
} |
88 |
|
71 |
return delegate.lookupItem (template); |
89 |
return retValue; |
|
|
90 |
} |
72 |
} |
91 |
|
73 |
|
92 |
/** @return true if the instance of class c shall never be returned from this lookup |
74 |
/** @return true if the instance of class c shall never be returned from this lookup |
Lines 109-239
Link Here
|
109 |
} else { |
91 |
} else { |
110 |
return new Class[] { (Class)classes }; |
92 |
return new Class[] { (Class)classes }; |
111 |
} |
93 |
} |
112 |
} |
94 |
} |
113 |
|
|
|
114 |
/** based on type decides whether the class accepts or not anObject |
115 |
*/ |
116 |
static boolean acceptFilter (Class filter, Object anObject, int type) { |
117 |
switch (type) { |
118 |
case 0: return filter.isInstance (anObject); |
119 |
case 1: return filter.isAssignableFrom ((Class)anObject); |
120 |
case 2: { |
121 |
Item item = (Item)anObject; |
122 |
return filter.isAssignableFrom (item.getType ()); |
123 |
} |
124 |
default: throw new IllegalStateException ("Type: " + type); |
125 |
} |
126 |
} |
127 |
|
128 |
/** Filters collection accroding to set of given filters. |
129 |
*/ |
130 |
static java.util.Collection filter (Class[] arr, java.util.Collection c, int type) { |
131 |
java.util.Collection ret = null; |
132 |
|
133 |
TWICE: for (;;) { |
134 |
Iterator it = c.iterator (); |
135 |
BIG: while (it.hasNext ()) { |
136 |
Object res = it.next (); |
137 |
for (int i = 0; i < arr.length; i++) { |
138 |
if (acceptFilter (arr[i], res, type)) { |
139 |
if (ret == null) { |
140 |
// we need to restart the scanning again |
141 |
// as there is an active filter |
142 |
if (type == 1) { |
143 |
ret = new java.util.HashSet (); |
144 |
} else { |
145 |
ret = new ArrayList (c.size ()); |
146 |
} |
147 |
continue TWICE; |
148 |
} |
149 |
continue BIG; |
150 |
} |
151 |
} |
152 |
if (ret != null) { |
153 |
// if we are running the second round from TWICE |
154 |
ret.add (res); |
155 |
} |
156 |
} |
157 |
// ok, processed |
158 |
break TWICE; |
159 |
} |
160 |
|
161 |
return ret != null ? ret : c; |
162 |
} |
163 |
|
164 |
|
165 |
/** Delegating result that filters unwanted items and instances. |
166 |
*/ |
167 |
private final class R extends WaitableResult implements LookupListener { |
168 |
private Result result; |
169 |
private Object listeners; |
170 |
|
171 |
R (Result delegate) { |
172 |
this.result = delegate; |
173 |
} |
174 |
|
175 |
protected void beforeLookup (Template t) { |
176 |
if (result instanceof WaitableResult) { |
177 |
((WaitableResult)result).beforeLookup (t); |
178 |
} |
179 |
} |
180 |
|
181 |
public void addLookupListener (LookupListener l) { |
182 |
boolean add; |
183 |
synchronized (this) { |
184 |
listeners = AbstractLookup.modifyListenerList (true, l, listeners); |
185 |
add = listeners != null; |
186 |
} |
187 |
if (add) { |
188 |
result.addLookupListener (this); |
189 |
} |
190 |
} |
191 |
|
192 |
public void removeLookupListener (LookupListener l) { |
193 |
boolean remove; |
194 |
synchronized (this) { |
195 |
listeners = AbstractLookup.modifyListenerList (false, l, listeners); |
196 |
remove = listeners == null; |
197 |
} |
198 |
if (remove) { |
199 |
result.removeLookupListener (this); |
200 |
} |
201 |
} |
202 |
|
203 |
public java.util.Collection allInstances() { |
204 |
return filter (classes (), result.allInstances (), 0); |
205 |
} |
206 |
|
207 |
public Set allClasses () { |
208 |
return (Set)filter (classes (), result.allClasses (), 1); |
209 |
} |
210 |
|
211 |
public Collection allItems () { |
212 |
return filter (classes (), result.allItems (), 2); |
213 |
} |
214 |
|
215 |
public void resultChanged (org.openide.util.LookupEvent ev) { |
216 |
if (ev.getSource () == result) { |
217 |
LookupListener[] arr; |
218 |
synchronized (this) { |
219 |
if (listeners == null) return; |
220 |
|
221 |
if (listeners instanceof LookupListener) { |
222 |
arr = new LookupListener[] { (LookupListener) listeners }; |
223 |
} else { |
224 |
ArrayList l = (ArrayList)listeners; |
225 |
arr = (LookupListener[])l.toArray ( |
226 |
new LookupListener[l.size ()] |
227 |
); |
228 |
} |
229 |
} |
230 |
|
231 |
final LookupListener[] ll = arr; |
232 |
final org.openide.util.LookupEvent newev = new org.openide.util.LookupEvent (this); |
233 |
for (int i = 0; i < ll.length; i++) { |
234 |
ll[i].resultChanged(newev); |
235 |
} |
236 |
} |
237 |
} |
238 |
} |
239 |
} |
95 |
} |