new version with WorkingCopy Management
[phpeclipse.git] / net.sourceforge.phpeclipse / src / net / sourceforge / phpdt / internal / ui / viewsupport / MemberFilter.java
1 /*******************************************************************************
2  * Copyright (c) 2000, 2003 IBM Corporation and others.
3  * All rights reserved. This program and the accompanying materials 
4  * are made available under the terms of the Common Public License v1.0
5  * which accompanies this distribution, and is available at
6  * http://www.eclipse.org/legal/cpl-v10.html
7  * 
8  * Contributors:
9  *     IBM Corporation - initial API and implementation
10  *******************************************************************************/
11 package net.sourceforge.phpdt.internal.ui.viewsupport;
12
13 import net.sourceforge.phpdt.core.Flags;
14 import net.sourceforge.phpdt.core.IField;
15 import net.sourceforge.phpdt.core.IJavaElement;
16 import net.sourceforge.phpdt.core.IMember;
17 import net.sourceforge.phpdt.core.IType;
18 import net.sourceforge.phpdt.core.JavaModelException;
19
20 import org.eclipse.jface.viewers.Viewer;
21 import org.eclipse.jface.viewers.ViewerFilter;
22
23 /**
24  * Filter for the methods viewer.
25  * Changing a filter property does not trigger a refiltering of the viewer
26  */
27 public class MemberFilter extends ViewerFilter {
28
29         public static final int FILTER_NONPUBLIC= 1;
30         public static final int FILTER_STATIC= 2;
31         public static final int FILTER_FIELDS= 4;
32         
33         private int fFilterProperties;
34
35         /**
36          * Modifies filter and add a property to filter for
37          */
38         public final void addFilter(int filter) {
39                 fFilterProperties |= filter;
40         }
41         /**
42          * Modifies filter and remove a property to filter for
43          */     
44         public final void removeFilter(int filter) {
45                 fFilterProperties &= (-1 ^ filter);
46         }
47         /**
48          * Tests if a property is filtered
49          */             
50         public final boolean hasFilter(int filter) {
51                 return (fFilterProperties & filter) != 0;
52         }
53         
54         /*
55          * @see ViewerFilter@isFilterProperty
56          */
57         public boolean isFilterProperty(Object element, Object property) {
58                 return false;
59         }
60         /*
61          * @see ViewerFilter@select
62          */             
63         public boolean select(Viewer viewer, Object parentElement, Object element) {
64                 try {
65                         if (hasFilter(FILTER_FIELDS) && element instanceof IField) {
66                                 return false;
67                         }
68                         if (element instanceof IMember) {
69                                 IMember member= (IMember)element;
70                                 if (member.getElementName().startsWith("<")) { // filter out <clinit> //$NON-NLS-1$
71                                         return false;
72                                 }
73                                 int flags= member.getFlags();
74                                 if (hasFilter(FILTER_STATIC) && (Flags.isStatic(flags) || isFieldInInterface(member)) && member.getElementType() != IJavaElement.TYPE) {
75                                         return false;
76                                 }
77                                 if (hasFilter(FILTER_NONPUBLIC) && !Flags.isPublic(flags) && !isMemberInInterface(member) && !isTopLevelType(member)) {
78                                         return false;
79                                 }
80                         }                       
81                 } catch (JavaModelException e) {
82                         // ignore
83                 }
84                 return true;
85         }
86         
87         private boolean isMemberInInterface(IMember member) throws JavaModelException {
88                 IType parent= member.getDeclaringType();
89                 return parent != null && parent.isInterface();
90         }
91         
92         private boolean isFieldInInterface(IMember member) throws JavaModelException {
93                 return (member.getElementType() == IJavaElement.FIELD) && member.getDeclaringType().isInterface();
94         }       
95         
96         private boolean isTopLevelType(IMember member) throws JavaModelException {
97                 IType parent= member.getDeclaringType();
98                 return parent == null;
99         }               
100 }