--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2000, 2003 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Common Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/cpl-v10.html
+ *
+ * Contributors:
+ * IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package net.sourceforge.phpdt.internal.ui.viewsupport;
+
+import net.sourceforge.phpdt.core.Flags;
+import net.sourceforge.phpdt.core.IField;
+import net.sourceforge.phpdt.core.IJavaElement;
+import net.sourceforge.phpdt.core.IMember;
+import net.sourceforge.phpdt.core.IType;
+import net.sourceforge.phpdt.core.JavaModelException;
+
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.viewers.ViewerFilter;
+
+/**
+ * Filter for the methods viewer. Changing a filter property does not trigger a
+ * refiltering of the viewer
+ */
+public class MemberFilter extends ViewerFilter {
+
+ public static final int FILTER_NONPUBLIC = 1;
+
+ public static final int FILTER_STATIC = 2;
+
+ public static final int FILTER_FIELDS = 4;
+
+ private int fFilterProperties;
+
+ /**
+ * Modifies filter and add a property to filter for
+ */
+ public final void addFilter(int filter) {
+ fFilterProperties |= filter;
+ }
+
+ /**
+ * Modifies filter and remove a property to filter for
+ */
+ public final void removeFilter(int filter) {
+ fFilterProperties &= (-1 ^ filter);
+ }
+
+ /**
+ * Tests if a property is filtered
+ */
+ public final boolean hasFilter(int filter) {
+ return (fFilterProperties & filter) != 0;
+ }
+
+ /*
+ * @see ViewerFilter@isFilterProperty
+ */
+// public boolean isFilterProperty(Object element, Object property) {
+// return false;
+// }
+
+ /*
+ * @see ViewerFilter@select
+ */
+ public boolean select(Viewer viewer, Object parentElement, Object element) {
+ try {
+ if (hasFilter(FILTER_FIELDS) && element instanceof IField) {
+ return false;
+ }
+ if (element instanceof IMember) {
+ IMember member = (IMember) element;
+ if (member.getElementName().startsWith("<")) { // filter out
+ // <clinit>
+ // //$NON-NLS-1$
+ return false;
+ }
+ int flags = member.getFlags();
+ if (hasFilter(FILTER_STATIC)
+ && (Flags.isStatic(flags) || isFieldInInterface(member))
+ && member.getElementType() != IJavaElement.TYPE) {
+ return false;
+ }
+ if (hasFilter(FILTER_NONPUBLIC) && !Flags.isPublic(flags)
+ && !isMemberInInterface(member)
+ && !isTopLevelType(member)) {
+ return false;
+ }
+ }
+ } catch (JavaModelException e) {
+ // ignore
+ }
+ return true;
+ }
+
+ private boolean isMemberInInterface(IMember member)
+ throws JavaModelException {
+ IType parent = member.getDeclaringType();
+ return parent != null && parent.isInterface();
+ }
+
+ private boolean isFieldInInterface(IMember member)
+ throws JavaModelException {
+ return (member.getElementType() == IJavaElement.FIELD)
+ && member.getDeclaringType().isInterface();
+ }
+
+ private boolean isTopLevelType(IMember member) throws JavaModelException {
+ IType parent = member.getDeclaringType();
+ return parent == null;
+ }
+}