From 43e867c2ae25f59ee3b95715104e16c94ec99d0c Mon Sep 17 00:00:00 2001
From: Ed Harvey <edharvey@optusnet.com.au>
Date: Sun, 29 May 2011 17:02:17 +1000
Subject: [PATCH] Implement filtering on DerivedTypesTreeNode.

---
 ILSpy/TreeNodes/DerivedTypesTreeNode.cs | 52 +++++++++++++++++++------
 1 file changed, 41 insertions(+), 11 deletions(-)

diff --git a/ILSpy/TreeNodes/DerivedTypesTreeNode.cs b/ILSpy/TreeNodes/DerivedTypesTreeNode.cs
index 2fd497395..9c3f77c70 100644
--- a/ILSpy/TreeNodes/DerivedTypesTreeNode.cs
+++ b/ILSpy/TreeNodes/DerivedTypesTreeNode.cs
@@ -105,13 +105,13 @@ namespace ICSharpCode.ILSpy.TreeNodes
 	
 	class DerivedTypesEntryNode : ILSpyTreeNode, IMemberTreeNode
 	{
-		TypeDefinition def;
+		TypeDefinition type;
 		AssemblyDefinition[] assemblies;
 		ThreadingSupport threading;
 		
-		public DerivedTypesEntryNode(TypeDefinition def, AssemblyDefinition[] assemblies)
+		public DerivedTypesEntryNode(TypeDefinition type, AssemblyDefinition[] assemblies)
 		{
-			this.def = def;
+			this.type = type;
 			this.assemblies = assemblies;
 			this.LazyLoading = true;
 			threading = new ThreadingSupport();
@@ -119,20 +119,50 @@ namespace ICSharpCode.ILSpy.TreeNodes
 		
 		public override bool ShowExpander {
 			get {
-				return !def.IsSealed && base.ShowExpander;
+				return !type.IsSealed && base.ShowExpander;
 			}
 		}
 		
 		public override object Text {
-			get { return this.Language.TypeToString(def, true); }
+			get { return this.Language.TypeToString(type, true); }
 		}
 		
 		public override object Icon {
 			get {
-				return TypeTreeNode.GetIcon(def);
+				return TypeTreeNode.GetIcon(type);
 			}
 		}
-		
+
+		public override FilterResult Filter(FilterSettings settings)
+		{
+			if (!settings.ShowInternalApi && !IsPublicAPI)
+				return FilterResult.Hidden;
+			if (settings.SearchTermMatches(type.Name)) {
+				if (type.IsNested && !settings.Language.ShowMember(type))
+					return FilterResult.Hidden;
+				else
+					return FilterResult.Match;
+			} else {
+				return FilterResult.Recurse;
+			}
+		}
+
+		public bool IsPublicAPI
+		{
+			get
+			{
+				switch (type.Attributes & TypeAttributes.VisibilityMask) {
+					case TypeAttributes.Public:
+					case TypeAttributes.NestedPublic:
+					case TypeAttributes.NestedFamily:
+					case TypeAttributes.NestedFamORAssem:
+						return true;
+					default:
+						return false;
+				}
+			}
+		}
+
 		protected override void LoadChildren()
 		{
 			threading.LoadChildren(this, FetchChildren);
@@ -141,21 +171,21 @@ namespace ICSharpCode.ILSpy.TreeNodes
 		IEnumerable<ILSpyTreeNode> FetchChildren(CancellationToken ct)
 		{
 			// FetchChildren() runs on the main thread; but the enumerator will be consumed on a background thread
-			return DerivedTypesTreeNode.FindDerivedTypes(def, assemblies, ct);
+			return DerivedTypesTreeNode.FindDerivedTypes(type, assemblies, ct);
 		}
 		
 		public override void ActivateItem(System.Windows.RoutedEventArgs e)
 		{
-			e.Handled = BaseTypesEntryNode.ActivateItem(this, def);
+			e.Handled = BaseTypesEntryNode.ActivateItem(this, type);
 		}
 		
 		public override void Decompile(Language language, ITextOutput output, DecompilationOptions options)
 		{
-			language.WriteCommentLine(output, language.TypeToString(def, true));
+			language.WriteCommentLine(output, language.TypeToString(type, true));
 		}
 		
 		MemberReference IMemberTreeNode.Member {
-			get { return def; }
+			get { return type; }
 		}
 	}
 }