KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > eclipse > jdt > internal > ui > search > JavaMatchFilter


1 /*******************************************************************************
2  * Copyright (c) 2000, 2007 IBM Corporation and others.
3  * All rights reserved. This program and the accompanying materials
4  * are made available under the terms of the Eclipse Public License v1.0
5  * which accompanies this distribution, and is available at
6  * http://www.eclipse.org/legal/epl-v10.html
7  *
8  * Contributors:
9  * IBM Corporation - initial API and implementation
10  *******************************************************************************/

11 package org.eclipse.jdt.internal.ui.search;
12
13 import java.util.ArrayList JavaDoc;
14 import java.util.HashSet JavaDoc;
15 import java.util.StringTokenizer JavaDoc;
16
17 import org.eclipse.search.ui.text.Match;
18 import org.eclipse.search.ui.text.MatchFilter;
19
20 import org.eclipse.jdt.core.IField;
21 import org.eclipse.jdt.core.IImportDeclaration;
22 import org.eclipse.jdt.core.IJavaElement;
23 import org.eclipse.jdt.core.ILocalVariable;
24 import org.eclipse.jdt.core.IMember;
25 import org.eclipse.jdt.core.IMethod;
26 import org.eclipse.jdt.core.IPackageFragment;
27 import org.eclipse.jdt.core.IType;
28 import org.eclipse.jdt.core.ITypeParameter;
29 import org.eclipse.jdt.core.JavaModelException;
30 import org.eclipse.jdt.core.search.IJavaSearchConstants;
31 import org.eclipse.jdt.core.search.SearchMatch;
32 import org.eclipse.jdt.core.search.SearchPattern;
33
34 import org.eclipse.jdt.internal.corext.util.JdtFlags;
35
36 import org.eclipse.jdt.ui.search.ElementQuerySpecification;
37 import org.eclipse.jdt.ui.search.PatternQuerySpecification;
38 import org.eclipse.jdt.ui.search.QuerySpecification;
39
40 import org.eclipse.jdt.internal.ui.JavaPlugin;
41
42 abstract class JavaMatchFilter extends MatchFilter {
43     
44     public abstract boolean filters(JavaElementMatch match);
45     
46     /**
47      * Returns whether this filter is applicable for this query
48      * @param query
49      * @return returns <code>true</code> if this match filter is applicable for the given query
50      */

51     public abstract boolean isApplicable(JavaSearchQuery query);
52     
53     /* (non-Javadoc)
54      * @see org.eclipse.search.ui.text.MatchFilter#filters(org.eclipse.search.ui.text.Match)
55      */

56     public boolean filters(Match match) {
57         if (match instanceof JavaElementMatch) {
58             return filters((JavaElementMatch) match);
59         }
60         return false;
61     }
62     
63     private static final String JavaDoc SETTINGS_LAST_USED_FILTERS= "filters_last_used"; //$NON-NLS-1$
64

65     public static MatchFilter[] getLastUsedFilters() {
66         String JavaDoc string= JavaPlugin.getDefault().getDialogSettings().get(SETTINGS_LAST_USED_FILTERS);
67         if (string != null && string.length() > 0) {
68             return decodeFiltersString(string);
69         }
70         return getDefaultFilters();
71     }
72     
73     public static void setLastUsedFilters(MatchFilter[] filters) {
74         String JavaDoc encoded= encodeFilters(filters);
75         JavaPlugin.getDefault().getDialogSettings().put(SETTINGS_LAST_USED_FILTERS, encoded);
76     }
77     
78     public static MatchFilter[] getDefaultFilters() {
79         return new MatchFilter[] { IMPORT_FILTER };
80     }
81     
82     private static String JavaDoc encodeFilters(MatchFilter[] enabledFilters) {
83         StringBuffer JavaDoc buf= new StringBuffer JavaDoc();
84         for (int i= 0; i < enabledFilters.length; i++) {
85             MatchFilter matchFilter= enabledFilters[i];
86             buf.append(matchFilter.getID());
87             buf.append(';');
88         }
89         return buf.toString();
90     }
91     
92     private static JavaMatchFilter[] decodeFiltersString(String JavaDoc encodedString) {
93         StringTokenizer JavaDoc tokenizer= new StringTokenizer JavaDoc(encodedString, String.valueOf(';'));
94         HashSet JavaDoc result= new HashSet JavaDoc();
95         while (tokenizer.hasMoreTokens()) {
96             JavaMatchFilter curr= findMatchFilter(tokenizer.nextToken());
97             if (curr != null) {
98                 result.add(curr);
99             }
100         }
101         return (JavaMatchFilter[]) result.toArray(new JavaMatchFilter[result.size()]);
102     }
103         
104     private static final JavaMatchFilter POTENTIAL_FILTER= new PotentialFilter();
105     private static final JavaMatchFilter IMPORT_FILTER= new ImportFilter();
106     private static final JavaMatchFilter JAVADOC_FILTER= new JavadocFilter();
107     private static final JavaMatchFilter READ_FILTER= new ReadFilter();
108     private static final JavaMatchFilter WRITE_FILTER= new WriteFilter();
109     
110     private static final JavaMatchFilter POLYMORPHIC_FILTER= new PolymorphicFilter();
111     private static final JavaMatchFilter INEXACT_FILTER= new InexactMatchFilter();
112     private static final JavaMatchFilter ERASURE_FILTER= new ErasureMatchFilter();
113     
114     private static final JavaMatchFilter NON_PUBLIC_FILTER= new NonPublicFilter();
115     private static final JavaMatchFilter STATIC_FILTER= new StaticFilter();
116     private static final JavaMatchFilter NON_STATIC_FILTER= new NonStaticFilter();
117     private static final JavaMatchFilter DEPRECATED_FILTER= new DeprecatedFilter();
118     private static final JavaMatchFilter NON_DEPRECATED_FILTER= new NonDeprecatedFilter();
119     
120     private static final JavaMatchFilter[] ALL_FILTERS= new JavaMatchFilter[] {
121             POTENTIAL_FILTER,
122             IMPORT_FILTER,
123             JAVADOC_FILTER,
124             READ_FILTER,
125             WRITE_FILTER,
126             
127             POLYMORPHIC_FILTER,
128             INEXACT_FILTER,
129             ERASURE_FILTER,
130             
131             NON_PUBLIC_FILTER,
132             STATIC_FILTER,
133             NON_STATIC_FILTER,
134             DEPRECATED_FILTER,
135             NON_DEPRECATED_FILTER
136     };
137         
138     public static JavaMatchFilter[] allFilters() {
139         return ALL_FILTERS;
140     }
141     
142     public static JavaMatchFilter[] allFilters(JavaSearchQuery query) {
143         ArrayList JavaDoc res= new ArrayList JavaDoc();
144         for (int i= 0; i < ALL_FILTERS.length; i++) {
145             JavaMatchFilter curr= ALL_FILTERS[i];
146             if (curr.isApplicable(query)) {
147                 res.add(curr);
148             }
149         }
150         return (JavaMatchFilter[]) res.toArray(new JavaMatchFilter[res.size()]);
151     }
152     
153     private static JavaMatchFilter findMatchFilter(String JavaDoc id) {
154         for (int i= 0; i < ALL_FILTERS.length; i++) {
155             JavaMatchFilter matchFilter= ALL_FILTERS[i];
156             if (matchFilter.getID().equals(id))
157                 return matchFilter;
158         }
159         return null;
160     }
161 }
162
163 class PotentialFilter extends JavaMatchFilter {
164     public boolean filters(JavaElementMatch match) {
165         return match.getAccuracy() == SearchMatch.A_INACCURATE;
166     }
167     
168     public String JavaDoc getName() {
169         return SearchMessages.MatchFilter_PotentialFilter_name;
170     }
171     
172     public String JavaDoc getActionLabel() {
173         return SearchMessages.MatchFilter_PotentialFilter_actionLabel;
174     }
175     
176     public String JavaDoc getDescription() {
177         return SearchMessages.MatchFilter_PotentialFilter_description;
178     }
179     
180     public boolean isApplicable(JavaSearchQuery query) {
181         return true;
182     }
183     
184     public String JavaDoc getID() {
185         return "filter_potential"; //$NON-NLS-1$
186
}
187 }
188
189 class ImportFilter extends JavaMatchFilter {
190     public boolean filters(JavaElementMatch match) {
191         return match.getElement() instanceof IImportDeclaration;
192     }
193
194     public String JavaDoc getName() {
195         return SearchMessages.MatchFilter_ImportFilter_name;
196     }
197
198     public String JavaDoc getActionLabel() {
199         return SearchMessages.MatchFilter_ImportFilter_actionLabel;
200     }
201
202     public String JavaDoc getDescription() {
203         return SearchMessages.MatchFilter_ImportFilter_description;
204     }
205     
206     public boolean isApplicable(JavaSearchQuery query) {
207         QuerySpecification spec= query.getSpecification();
208         if (spec instanceof ElementQuerySpecification) {
209             ElementQuerySpecification elementSpec= (ElementQuerySpecification) spec;
210             IJavaElement element= elementSpec.getElement();
211             return element instanceof IType || element instanceof IPackageFragment;
212         } else if (spec instanceof PatternQuerySpecification) {
213             PatternQuerySpecification patternSpec= (PatternQuerySpecification) spec;
214             int searchFor= patternSpec.getSearchFor();
215             return searchFor == IJavaSearchConstants.TYPE || searchFor == IJavaSearchConstants.PACKAGE;
216         }
217         return false;
218     }
219
220     public String JavaDoc getID() {
221         return "filter_imports"; //$NON-NLS-1$
222
}
223 }
224
225 abstract class VariableFilter extends JavaMatchFilter {
226     public boolean isApplicable(JavaSearchQuery query) {
227         QuerySpecification spec= query.getSpecification();
228         if (spec instanceof ElementQuerySpecification) {
229             ElementQuerySpecification elementSpec= (ElementQuerySpecification) spec;
230             IJavaElement element= elementSpec.getElement();
231             return element instanceof IField || element instanceof ILocalVariable;
232         } else if (spec instanceof PatternQuerySpecification) {
233             PatternQuerySpecification patternSpec= (PatternQuerySpecification) spec;
234             return patternSpec.getSearchFor() == IJavaSearchConstants.FIELD;
235         }
236         return false;
237     }
238
239 }
240
241 class WriteFilter extends VariableFilter {
242     public boolean filters(JavaElementMatch match) {
243         return match.isWriteAccess() && !match.isReadAccess();
244     }
245     public String JavaDoc getName() {
246         return SearchMessages.MatchFilter_WriteFilter_name;
247     }
248     public String JavaDoc getActionLabel() {
249         return SearchMessages.MatchFilter_WriteFilter_actionLabel;
250     }
251     public String JavaDoc getDescription() {
252         return SearchMessages.MatchFilter_WriteFilter_description;
253     }
254     public String JavaDoc getID() {
255         return "filter_writes"; //$NON-NLS-1$
256
}
257 }
258
259 class ReadFilter extends VariableFilter {
260     public boolean filters(JavaElementMatch match) {
261         return match.isReadAccess() && !match.isWriteAccess();
262     }
263     public String JavaDoc getName() {
264         return SearchMessages.MatchFilter_ReadFilter_name;
265     }
266     public String JavaDoc getActionLabel() {
267         return SearchMessages.MatchFilter_ReadFilter_actionLabel;
268     }
269     public String JavaDoc getDescription() {
270         return SearchMessages.MatchFilter_ReadFilter_description;
271     }
272     public String JavaDoc getID() {
273         return "filter_reads"; //$NON-NLS-1$
274
}
275 }
276
277 class JavadocFilter extends JavaMatchFilter {
278     public boolean filters(JavaElementMatch match) {
279         return match.isJavadoc();
280     }
281     public String JavaDoc getName() {
282         return SearchMessages.MatchFilter_JavadocFilter_name;
283     }
284     public String JavaDoc getActionLabel() {
285         return SearchMessages.MatchFilter_JavadocFilter_actionLabel;
286     }
287     public String JavaDoc getDescription() {
288         return SearchMessages.MatchFilter_JavadocFilter_description;
289     }
290     public boolean isApplicable(JavaSearchQuery query) {
291         return true;
292     }
293     public String JavaDoc getID() {
294         return "filter_javadoc"; //$NON-NLS-1$
295
}
296 }
297
298 class PolymorphicFilter extends JavaMatchFilter {
299     public boolean filters(JavaElementMatch match) {
300         return match.isSuperInvocation();
301     }
302
303     public String JavaDoc getName() {
304         return SearchMessages.MatchFilter_PolymorphicFilter_name;
305     }
306
307     public String JavaDoc getActionLabel() {
308         return SearchMessages.MatchFilter_PolymorphicFilter_actionLabel;
309     }
310
311     public String JavaDoc getDescription() {
312         return SearchMessages.MatchFilter_PolymorphicFilter_description;
313     }
314     
315     public boolean isApplicable(JavaSearchQuery query) {
316         QuerySpecification spec= query.getSpecification();
317         switch (spec.getLimitTo()) {
318             case IJavaSearchConstants.REFERENCES:
319             case IJavaSearchConstants.ALL_OCCURRENCES:
320                 if (spec instanceof ElementQuerySpecification) {
321                     ElementQuerySpecification elementSpec= (ElementQuerySpecification) spec;
322                     return elementSpec.getElement() instanceof IMethod;
323                 } else if (spec instanceof PatternQuerySpecification) {
324                     PatternQuerySpecification patternSpec= (PatternQuerySpecification) spec;
325                     return patternSpec.getSearchFor() == IJavaSearchConstants.METHOD;
326                 }
327         }
328         return false;
329     }
330
331     public String JavaDoc getID() {
332         return "filter_polymorphic"; //$NON-NLS-1$
333
}
334 }
335
336 abstract class GenericTypeFilter extends JavaMatchFilter {
337     public boolean isApplicable(JavaSearchQuery query) {
338         QuerySpecification spec= query.getSpecification();
339         if (spec instanceof ElementQuerySpecification) {
340             ElementQuerySpecification elementSpec= (ElementQuerySpecification) spec;
341             Object JavaDoc element= elementSpec.getElement();
342             ITypeParameter[] typeParameters= null;
343             try {
344                 if (element instanceof IType) {
345                     typeParameters= ((IType)element).getTypeParameters();
346                 } else if (element instanceof IMethod) {
347                     typeParameters= ((IMethod)element).getTypeParameters();
348                 }
349             } catch (JavaModelException e) {
350                 return false;
351             }
352             return typeParameters != null && typeParameters.length > 0;
353         }
354         return false;
355     }
356 }
357
358 class ErasureMatchFilter extends GenericTypeFilter {
359     public boolean filters(JavaElementMatch match) {
360         return (match.getMatchRule() & (SearchPattern.R_FULL_MATCH | SearchPattern.R_EQUIVALENT_MATCH)) == 0;
361     }
362     public String JavaDoc getName() {
363         return SearchMessages.MatchFilter_ErasureFilter_name;
364     }
365     public String JavaDoc getActionLabel() {
366         return SearchMessages.MatchFilter_ErasureFilter_actionLabel;
367     }
368     public String JavaDoc getDescription() {
369         return SearchMessages.MatchFilter_ErasureFilter_description;
370     }
371     public String JavaDoc getID() {
372         return "filter_erasure"; //$NON-NLS-1$
373
}
374 }
375
376 class InexactMatchFilter extends GenericTypeFilter {
377     public boolean filters(JavaElementMatch match) {
378         return (match.getMatchRule() & (SearchPattern.R_FULL_MATCH)) == 0;
379     }
380     public String JavaDoc getName() {
381         return SearchMessages.MatchFilter_InexactFilter_name;
382     }
383     public String JavaDoc getActionLabel() {
384         return SearchMessages.MatchFilter_InexactFilter_actionLabel;
385     }
386     public String JavaDoc getDescription() {
387         return SearchMessages.MatchFilter_InexactFilter_description;
388     }
389     public String JavaDoc getID() {
390         return "filter_inexact"; //$NON-NLS-1$
391
}
392 }
393
394 abstract class ModifierFilter extends JavaMatchFilter {
395     public boolean isApplicable(JavaSearchQuery query) {
396         return true;
397     }
398 }
399
400 class NonPublicFilter extends ModifierFilter {
401     public boolean filters(JavaElementMatch match) {
402         Object JavaDoc element= match.getElement();
403         if (element instanceof IMember) {
404             try {
405                 return ! JdtFlags.isPublic((IMember) element);
406             } catch (JavaModelException e) {
407                 JavaPlugin.log(e);
408             }
409         }
410         return false;
411     }
412     public String JavaDoc getName() {
413         return SearchMessages.MatchFilter_NonPublicFilter_name;
414     }
415     public String JavaDoc getActionLabel() {
416         return SearchMessages.MatchFilter_NonPublicFilter_actionLabel;
417     }
418     public String JavaDoc getDescription() {
419         return SearchMessages.MatchFilter_NonPublicFilter_description;
420     }
421     public String JavaDoc getID() {
422         return "filter_non_public"; //$NON-NLS-1$
423
}
424 }
425
426 class StaticFilter extends ModifierFilter {
427     public boolean filters(JavaElementMatch match) {
428         Object JavaDoc element= match.getElement();
429         if (element instanceof IMember) {
430             try {
431                 return JdtFlags.isStatic((IMember) element);
432             } catch (JavaModelException e) {
433                 JavaPlugin.log(e);
434             }
435         }
436         return false;
437     }
438     public String JavaDoc getName() {
439         return SearchMessages.MatchFilter_StaticFilter_name;
440     }
441     public String JavaDoc getActionLabel() {
442         return SearchMessages.MatchFilter_StaticFilter_actionLabel;
443     }
444     public String JavaDoc getDescription() {
445         return SearchMessages.MatchFilter_StaticFilter_description;
446     }
447     public String JavaDoc getID() {
448         return "filter_static"; //$NON-NLS-1$
449
}
450 }
451
452 class NonStaticFilter extends ModifierFilter {
453     public boolean filters(JavaElementMatch match) {
454         Object JavaDoc element= match.getElement();
455         if (element instanceof IMember) {
456             try {
457                 return ! JdtFlags.isStatic((IMember) element);
458             } catch (JavaModelException e) {
459                 JavaPlugin.log(e);
460             }
461         }
462         return false;
463     }
464     public String JavaDoc getName() {
465         return SearchMessages.MatchFilter_NonStaticFilter_name;
466     }
467     public String JavaDoc getActionLabel() {
468         return SearchMessages.MatchFilter_NonStaticFilter_actionLabel;
469     }
470     public String JavaDoc getDescription() {
471         return SearchMessages.MatchFilter_NonStaticFilter_description;
472     }
473     public String JavaDoc getID() {
474         return "filter_non_static"; //$NON-NLS-1$
475
}
476 }
477
478 class DeprecatedFilter extends ModifierFilter {
479     public boolean filters(JavaElementMatch match) {
480         Object JavaDoc element= match.getElement();
481         if (element instanceof IMember) {
482             try {
483                 return JdtFlags.isDeprecated((IMember) element);
484             } catch (JavaModelException e) {
485                 JavaPlugin.log(e);
486             }
487         }
488         return false;
489     }
490     public String JavaDoc getName() {
491         return SearchMessages.MatchFilter_DeprecatedFilter_name;
492     }
493     public String JavaDoc getActionLabel() {
494         return SearchMessages.MatchFilter_DeprecatedFilter_actionLabel;
495     }
496     public String JavaDoc getDescription() {
497         return SearchMessages.MatchFilter_DeprecatedFilter_description;
498     }
499     public String JavaDoc getID() {
500         return "filter_deprecated"; //$NON-NLS-1$
501
}
502 }
503
504 class NonDeprecatedFilter extends ModifierFilter {
505     public boolean filters(JavaElementMatch match) {
506         Object JavaDoc element= match.getElement();
507         if (element instanceof IMember) {
508             try {
509                 return !JdtFlags.isDeprecated((IMember) element);
510             } catch (JavaModelException e) {
511                 JavaPlugin.log(e);
512             }
513         }
514         return false;
515     }
516     public String JavaDoc getName() {
517         return SearchMessages.MatchFilter_NonDeprecatedFilter_name;
518     }
519     public String JavaDoc getActionLabel() {
520         return SearchMessages.MatchFilter_NonDeprecatedFilter_actionLabel;
521     }
522     public String JavaDoc getDescription() {
523         return SearchMessages.MatchFilter_NonDeprecatedFilter_description;
524     }
525     public String JavaDoc getID() {
526         return "filter_non_deprecated"; //$NON-NLS-1$
527
}
528 }
529
Popular Tags