KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > eclipse > jdt > internal > ui > filters > FilterDescriptor


1 /*******************************************************************************
2  * Copyright (c) 2000, 2006 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.filters;
12
13 import com.ibm.icu.text.Collator;
14
15 import java.util.ArrayList JavaDoc;
16 import java.util.HashSet JavaDoc;
17 import java.util.List JavaDoc;
18 import java.util.Set JavaDoc;
19
20 import org.eclipse.core.runtime.Assert;
21 import org.eclipse.core.runtime.IConfigurationElement;
22 import org.eclipse.core.runtime.IExtensionRegistry;
23 import org.eclipse.core.runtime.ISafeRunnable;
24 import org.eclipse.core.runtime.Platform;
25 import org.eclipse.core.runtime.SafeRunner;
26
27 import org.eclipse.jface.util.SafeRunnable;
28 import org.eclipse.jface.viewers.ViewerFilter;
29
30 import org.eclipse.ui.IPluginContribution;
31 import org.eclipse.ui.activities.WorkbenchActivityHelper;
32
33 import org.eclipse.jdt.internal.corext.util.Messages;
34
35 import org.eclipse.jdt.ui.JavaUI;
36
37 /**
38  * Represents a custom filter which is provided by the
39  * "org.eclipse.jdt.ui.javaElementFilters" extension point.
40  *
41  * since 2.0
42  */

43 public class FilterDescriptor implements Comparable JavaDoc, IPluginContribution {
44
45     private static String JavaDoc PATTERN_FILTER_ID_PREFIX= "_patternFilterId_"; //$NON-NLS-1$
46

47
48     private static final String JavaDoc EXTENSION_POINT_NAME= "javaElementFilters"; //$NON-NLS-1$
49

50     private static final String JavaDoc FILTER_TAG= "filter"; //$NON-NLS-1$
51

52     private static final String JavaDoc PATTERN_ATTRIBUTE= "pattern"; //$NON-NLS-1$
53
private static final String JavaDoc ID_ATTRIBUTE= "id"; //$NON-NLS-1$
54
/**
55      * @deprecated as of 3.0 use {@link FilterDescriptor#TARGET_ID_ATTRIBUTE}
56      */

57     private static final String JavaDoc VIEW_ID_ATTRIBUTE= "viewId"; //$NON-NLS-1$
58
private static final String JavaDoc TARGET_ID_ATTRIBUTE= "targetId"; //$NON-NLS-1$
59
private static final String JavaDoc CLASS_ATTRIBUTE= "class"; //$NON-NLS-1$
60
private static final String JavaDoc NAME_ATTRIBUTE= "name"; //$NON-NLS-1$
61
private static final String JavaDoc ENABLED_ATTRIBUTE= "enabled"; //$NON-NLS-1$
62
private static final String JavaDoc DESCRIPTION_ATTRIBUTE= "description"; //$NON-NLS-1$
63
/**
64      * @deprecated use "enabled" instead
65      */

66     private static final String JavaDoc SELECTED_ATTRIBUTE= "selected"; //$NON-NLS-1$
67

68     private static FilterDescriptor[] fgFilterDescriptors;
69
70
71     private IConfigurationElement fElement;
72
73     /**
74      * Returns all contributed Java element filters.
75      */

76     public static FilterDescriptor[] getFilterDescriptors() {
77         if (fgFilterDescriptors == null) {
78             IExtensionRegistry registry= Platform.getExtensionRegistry();
79             IConfigurationElement[] elements= registry.getConfigurationElementsFor(JavaUI.ID_PLUGIN, EXTENSION_POINT_NAME);
80             fgFilterDescriptors= createFilterDescriptors(elements);
81         }
82         return fgFilterDescriptors;
83     }
84     /**
85      * Returns all Java element filters which
86      * are contributed to the given view.
87      */

88     public static FilterDescriptor[] getFilterDescriptors(String JavaDoc targetId) {
89         FilterDescriptor[] filterDescs= FilterDescriptor.getFilterDescriptors();
90         List JavaDoc result= new ArrayList JavaDoc(filterDescs.length);
91         for (int i= 0; i < filterDescs.length; i++) {
92             String JavaDoc tid= filterDescs[i].getTargetId();
93             if (WorkbenchActivityHelper.filterItem(filterDescs[i]))
94                 continue;
95             if (tid == null || tid.equals(targetId))
96                 result.add(filterDescs[i]);
97         }
98         return (FilterDescriptor[])result.toArray(new FilterDescriptor[result.size()]);
99     }
100     
101     /**
102      * Creates a new filter descriptor for the given configuration element.
103      */

104     private FilterDescriptor(IConfigurationElement element) {
105         fElement= element;
106         // it is either a pattern filter or a custom filter
107
Assert.isTrue(isPatternFilter() ^ isCustomFilter(), "An extension for extension-point org.eclipse.jdt.ui.javaElementFilters does not specify a correct filter"); //$NON-NLS-1$
108
Assert.isNotNull(getId(), "An extension for extension-point org.eclipse.jdt.ui.javaElementFilters does not provide a valid ID"); //$NON-NLS-1$
109
Assert.isNotNull(getName(), "An extension for extension-point org.eclipse.jdt.ui.javaElementFilters does not provide a valid name"); //$NON-NLS-1$
110
}
111
112     /**
113      * Creates a new <code>ViewerFilter</code>.
114      * This method is only valid for viewer filters.
115      */

116     public ViewerFilter createViewerFilter() {
117         if (!isCustomFilter())
118             return null;
119         
120         final ViewerFilter[] result= new ViewerFilter[1];
121         String JavaDoc message= Messages.format(FilterMessages.FilterDescriptor_filterCreationError_message, getId());
122         ISafeRunnable code= new SafeRunnable(message) {
123             /*
124              * @see org.eclipse.core.runtime.ISafeRunnable#run()
125              */

126             public void run() throws Exception JavaDoc {
127                 result[0]= (ViewerFilter)fElement.createExecutableExtension(CLASS_ATTRIBUTE);
128             }
129             
130         };
131         SafeRunner.run(code);
132         return result[0];
133     }
134     
135     //---- XML Attribute accessors ---------------------------------------------
136

137     /**
138      * Returns the filter's id.
139      * <p>
140      * This attribute is mandatory for custom filters.
141      * The ID for pattern filters is
142      * PATTERN_FILTER_ID_PREFIX plus the pattern itself.
143      * </p>
144      */

145     public String JavaDoc getId() {
146         if (isPatternFilter()) {
147             String JavaDoc targetId= getTargetId();
148             if (targetId == null)
149                 return PATTERN_FILTER_ID_PREFIX + getPattern();
150             else
151                 return targetId + PATTERN_FILTER_ID_PREFIX + getPattern();
152         } else
153             return fElement.getAttribute(ID_ATTRIBUTE);
154     }
155     
156     /**
157      * Returns the filter's name.
158      * <p>
159      * If the name of a pattern filter is missing
160      * then the pattern is used as its name.
161      * </p>
162      */

163     public String JavaDoc getName() {
164         String JavaDoc name= fElement.getAttribute(NAME_ATTRIBUTE);
165         if (name == null && isPatternFilter())
166             name= getPattern();
167         return name;
168     }
169
170     /**
171      * Returns the filter's pattern.
172      *
173      * @return the pattern string or <code>null</code> if it's not a pattern filter
174      */

175     public String JavaDoc getPattern() {
176         return fElement.getAttribute(PATTERN_ATTRIBUTE);
177     }
178
179     /**
180      * Returns the filter's viewId.
181      *
182      * @return the view ID or <code>null</code> if the filter is for all views
183      * @since 3.0
184      */

185     public String JavaDoc getTargetId() {
186         String JavaDoc tid= fElement.getAttribute(TARGET_ID_ATTRIBUTE);
187         
188         if (tid != null)
189             return tid;
190         
191         // Backwards compatibility code
192
return fElement.getAttribute(VIEW_ID_ATTRIBUTE);
193         
194     }
195
196     /**
197      * Returns the filter's description.
198      *
199      * @return the description or <code>null</code> if no description is provided
200      */

201     public String JavaDoc getDescription() {
202         String JavaDoc description= fElement.getAttribute(DESCRIPTION_ATTRIBUTE);
203         if (description == null)
204             description= ""; //$NON-NLS-1$
205
return description;
206     }
207
208     /**
209      * @return <code>true</code> if this filter is a custom filter.
210      */

211     public boolean isPatternFilter() {
212         return getPattern() != null;
213     }
214
215     /**
216      * @return <code>true</code> if this filter is a pattern filter.
217      */

218     public boolean isCustomFilter() {
219         return fElement.getAttribute(CLASS_ATTRIBUTE) != null;
220     }
221
222     /**
223      * Returns <code>true</code> if the filter
224      * is initially enabled.
225      *
226      * This attribute is optional and defaults to <code>true</code>.
227      */

228     public boolean isEnabled() {
229         String JavaDoc strVal= fElement.getAttribute(ENABLED_ATTRIBUTE);
230         if (strVal == null)
231             // backward compatibility
232
strVal= fElement.getAttribute(SELECTED_ATTRIBUTE);
233         return strVal == null || Boolean.valueOf(strVal).booleanValue();
234     }
235
236     /*
237      * Implements a method from IComparable
238      */

239     public int compareTo(Object JavaDoc o) {
240         if (o instanceof FilterDescriptor)
241             return Collator.getInstance().compare(getName(), ((FilterDescriptor)o).getName());
242         else
243             return Integer.MIN_VALUE;
244     }
245
246     //---- initialization ---------------------------------------------------
247

248     /**
249      * Creates the filter descriptors.
250      */

251     private static FilterDescriptor[] createFilterDescriptors(IConfigurationElement[] elements) {
252         List JavaDoc result= new ArrayList JavaDoc(5);
253         Set JavaDoc descIds= new HashSet JavaDoc(5);
254         for (int i= 0; i < elements.length; i++) {
255             final IConfigurationElement element= elements[i];
256             if (FILTER_TAG.equals(element.getName())) {
257
258                 final FilterDescriptor[] desc= new FilterDescriptor[1];
259                 SafeRunner.run(new SafeRunnable(FilterMessages.FilterDescriptor_filterDescriptionCreationError_message) {
260                     public void run() throws Exception JavaDoc {
261                         desc[0]= new FilterDescriptor(element);
262                     }
263                 });
264
265                 if (desc[0] != null && !descIds.contains(desc[0].getId())) {
266                     result.add(desc[0]);
267                     descIds.add(desc[0].getId());
268                 }
269             }
270         }
271         return (FilterDescriptor[])result.toArray(new FilterDescriptor[result.size()]);
272     }
273     
274     public String JavaDoc getLocalId() {
275         return fElement.getAttribute(ID_ATTRIBUTE);
276     }
277
278     public String JavaDoc getPluginId() {
279         return fElement.getContributor().getName();
280     }
281 }
282
Popular Tags