Bug 502843 Add "Hide java.lang.Object Methods" to Quick Outline

apply review comments

Change-Id: I6251f69bac55442a2515cf8e531cee8e2d099d77
Signed-off-by: Björn Michael <b.michael@gmx.de>
diff --git a/org.eclipse.jdt.ui/plugin.properties b/org.eclipse.jdt.ui/plugin.properties
index 9a40b70..8299cf0 100644
--- a/org.eclipse.jdt.ui/plugin.properties
+++ b/org.eclipse.jdt.ui/plugin.properties
@@ -589,6 +589,9 @@
 HideOutputFolder.description= Hides Java output folders of the Java projects. A Java output folder is where the compiled Java classes are.
 HideJavaOutputFolder.label= Java output folders
 
+HideJavaLangObjectMembersFilter.label=Inherited java.lang.Object members
+HideJavaLangObjectMembersFilter.description=Hides all inherited members from java.lang.Object
+
 sourceHover= Source
 sourceHoverDescription= Shows the source of the selected element, or the source near the matching opening curly brace.
 javadocHover= Javadoc
diff --git a/org.eclipse.jdt.ui/plugin.xml b/org.eclipse.jdt.ui/plugin.xml
index c1a39cb..1b8fcae 100644
--- a/org.eclipse.jdt.ui/plugin.xml
+++ b/org.eclipse.jdt.ui/plugin.xml
@@ -5290,6 +5290,14 @@
             class="org.eclipse.jdt.internal.ui.filters.SyntheticMembersFilter"
             id="org.eclipse.jdt.internal.ui.text.QuickOutline.SyntheticMembersFilter">
       </filter>
+      <filter
+            targetId="org.eclipse.jdt.internal.ui.text.QuickOutline"
+            name="%HideJavaLangObjectMembersFilter.label"
+            enabled="false"
+            description="%HideJavaLangObjectMembersFilter.description"
+            class="org.eclipse.jdt.internal.ui.filters.JavaLangObjectMembersFilter"
+            id="org.eclipse.jdt.internal.ui.text.QuickOutline.JavaLangObjectMembersFilter">
+      </filter>
 <!-- Quick Hierarchy -->
       <filter
             targetId="org.eclipse.jdt.internal.ui.typehierarchy.QuickHierarchy"
diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/filters/JavaLangObjectMembersFilter.java b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/filters/JavaLangObjectMembersFilter.java
new file mode 100644
index 0000000..a9149d7
--- /dev/null
+++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/filters/JavaLangObjectMembersFilter.java
@@ -0,0 +1,71 @@
+/*******************************************************************************

+ * Copyright (c) 2016 Björn Michael and others.

+ * All rights reserved. This program and the accompanying materials

+ * are made available under the terms of the Eclipse Public License v1.0

+ * which accompanies this distribution, and is available at

+ * http://www.eclipse.org/legal/epl-v10.html

+ *

+ * Contributors:

+ *     Björn Michael <b.michael@gmx.de> - initial API and implementation

+ *******************************************************************************/

+package org.eclipse.jdt.internal.ui.filters;

+

+import org.eclipse.jface.viewers.Viewer;

+import org.eclipse.jface.viewers.ViewerFilter;

+

+import org.eclipse.jdt.core.IJavaElement;

+import org.eclipse.jdt.core.IMember;

+import org.eclipse.jdt.core.IType;

+import org.eclipse.jdt.core.ITypeRoot;

+

+/**

+ * Filters out members (method and fields) of {@link java.lang.Object}.

+ *

+ * @author Björn Michael

+ * @since 3.13

+ */

+public class JavaLangObjectMembersFilter extends ViewerFilter {

+

+	private static final String JAVA_LANG_OBJECT_CLASS_NAME= Object.class.getName();

+

+	/**

+	 * Creates a new filter instance.

+	 */

+	public JavaLangObjectMembersFilter() { // instantiated by org.eclipse.jdt.ui.javaElementFilters extension

+		super();

+	}

+

+	@Override

+	public boolean select(final Viewer viewer, final Object parentElement, final Object element) {

+		if (parentElement instanceof IType) {

+			if (JAVA_LANG_OBJECT_CLASS_NAME.equals(((IType) parentElement).getFullyQualifiedName())) {

+				return true; // java.lang.Object itself is shown; don't filter it out

+			}

+		}

+

+		if (parentElement instanceof ITypeRoot) {

+			IType primaryType= ((ITypeRoot) parentElement).findPrimaryType();

+			if (primaryType != null && JAVA_LANG_OBJECT_CLASS_NAME.equals(primaryType.getFullyQualifiedName())) {

+				return true; // top-level type is java.lang.Object itself; don't filter it out

+			}

+		}

+

+		if (element instanceof IMember) {

+			IMember member= (IMember) element;

+			switch (member.getElementType()) {

+				case IJavaElement.FIELD: // may be in future versions of JDK

+				case IJavaElement.METHOD:

+					IType declaringType= member.getDeclaringType();

+					if (declaringType != null) {

+						String fullyQualifiedName= declaringType.getFullyQualifiedName();

+						if (JAVA_LANG_OBJECT_CLASS_NAME.equals(fullyQualifiedName)) {

+							return false;

+						}

+					}

+			}

+		}

+

+		return true;

+	}

+

+}