reflectionnode.cs

来自「全功能c#编译器」· CS 代码 · 共 284 行

CS
284
字号
// <file>
//     <copyright see="prj:///doc/copyright.txt"/>
//     <license see="prj:///doc/license.txt"/>
//     <owner name="Georg Brandl" email="g.brandl@gmx.net"/>
//     <version value="$version"/>
// </file>

using System;
using System.Collections;
using System.IO;
using System.Drawing.Printing;
using System.Windows.Forms;
using System.Reflection;
using System.Reflection.Emit;

using ICSharpCode.Core.Services;
using ICSharpCode.SharpDevelop.Services;

namespace ICSharpCode.SharpDevelop.Internal.Reflection
{
	public enum ReflectionNodeType {
		Folder,
		Resource,
		Assembly,
		Library,
		Namespace,
		Type,
		Constructor,
		Method,
		Field,
		Property,
		SubTypes,
		SuperTypes,
		Reference,
		Event,
		Link,
		Module,
	}
	
	public class ReflectionNode : TreeNode
	{
		protected const int CLASSINDEX     = 14;
		protected const int STRUCTINDEX    = CLASSINDEX + 1 * 4;
		protected const int INTERFACEINDEX = CLASSINDEX + 2 * 4;
		protected const int ENUMINDEX      = CLASSINDEX + 3 * 4;
		protected const int METHODINDEX    = CLASSINDEX + 4 * 4;
		protected const int PROPERTYINDEX  = CLASSINDEX + 5 * 4;
		protected const int FIELDINDEX     = CLASSINDEX + 6 * 4;
		protected const int DELEGATEINDEX  = CLASSINDEX + 7 * 4;
		
		protected ReflectionNodeType type;
		protected string             name;
		protected object             attribute;
		
		protected bool  populated = false;
		
		public static ResourceService ress = (ResourceService)ServiceManager.Services.GetService(typeof(ResourceService));

		public ReflectionNodeType Type {
			get {
				return type;
			}
			set {
				type = value;
			}
		}
		
		public object Attribute {
			get {
				return attribute;
			}
		}
		
		public bool Populated {
			get {
				return populated;
			}
		}
		
		public string Name {
			get {
				return name;
			}
			set {
				name = value;
			}
		}
		
		public ReflectionNode(string name, object attribute, ReflectionNodeType type) : base(name)
		{
			this.attribute = attribute;
			this.type = type;
			this.name = name;
			
//			if (type == ReflectionNodeType.Namespace ||
//				type == ReflectionNodeType.Assembly  ||
//				type == ReflectionNodeType.Library   ||
//				type == ReflectionNodeType.Type) {
//					Nodes.Add(new ReflectionNode("", null, ReflectionNodeType.Link));
//			}
			
			SetIcon();
		}
		
	
		protected virtual void SetIcon()
		{
			ClassBrowserIconsService classBrowserIconService = (ClassBrowserIconsService)ServiceManager.Services.GetService(typeof(ClassBrowserIconsService));
			
			switch (type) {
				case ReflectionNodeType.Link:
					break;
				
				case ReflectionNodeType.Resource:
					ImageIndex  = SelectedImageIndex = 11;
					break;
				
				case ReflectionNodeType.Reference:
					ImageIndex  = SelectedImageIndex = 8;
					break;
				
				// TODO: MODULE ICON
				case ReflectionNodeType.Module:
					ImageIndex  = SelectedImageIndex = 46;
					break;
				
				case ReflectionNodeType.SubTypes:
					ImageIndex  = SelectedImageIndex = 4;
					break;
					
				case ReflectionNodeType.SuperTypes:
					ImageIndex  = SelectedImageIndex = 5;
					break;
				
				default:
					throw new Exception("ReflectionFolderNode.SetIcon : unknown ReflectionNodeType " + type.ToString());
			}
		}
		
		public virtual void Populate(bool Private, bool Internal)
		{
			switch (type) {
				case ReflectionNodeType.Assembly:
					PopulateAssembly((Assembly)attribute, this);
					break;
				
				case ReflectionNodeType.Library:
					PopulateLibrary((Assembly)attribute, this, Private, Internal);
					break;
			}
			populated = true;
		}
		
		public TreeNode GetNodeFromChildren(string title)
		{
			foreach (TreeNode node in this.Nodes) {
				if (node.Text == title) {
					return node;
				}
			}
			return null;
		}
		
		public TreeNode GetNodeFromCollection(TreeNodeCollection collection, string title)
		{
			foreach (TreeNode node in collection)
				if (node.Text == title) {
					return node;
				}
			return null;
		}
		
		void PopulateLibrary(Assembly assembly, TreeNode parentnode, bool Private, bool Internal)
		{
			parentnode.Nodes.Clear();
			Type[] types = new Type[0];
			
			try {
				types = assembly.GetTypes();
			} catch {
				try {
					types = assembly.GetExportedTypes();
					MessageBox.Show(ress.GetString("ObjectBrowser.OnlyExportedShown"), ress.GetString("Global.WarningText"), MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
				} catch {
					MessageBox.Show(ress.GetString("ObjectBrowser.ErrorLoadingTypes"), ress.GetString("Global.WarningText"), MessageBoxButtons.OK, MessageBoxIcon.Exclamation);					
				}
			}
			
			ArrayList nodes = new ArrayList();
			ArrayList namespaces = new ArrayList();
			ArrayList namespacenames = new ArrayList();
			TreeNodeComparer comp = new TreeNodeComparer();
			
			foreach (Type type in types) {
				if(type.ToString().IndexOf("PrivateImplementationDetails") != -1) continue;
				if(type.IsNotPublic && !Internal) continue;
				if(type.IsNestedAssembly && !Internal) continue;
				if(type.IsNestedFamANDAssem && !Internal) continue;
				if(type.IsNestedPrivate && !Private) continue;
				
				string   typename  = type.FullName;
				int      lastindex = typename.LastIndexOf('.');

				nodes.Add(new ReflectionTypeNode(typename.Substring(lastindex + 1), type));
				if (type.Namespace != null && type.Namespace != "") {
					if (!namespacenames.Contains(type.Namespace)) {
						namespaces.Add(new ReflectionFolderNode(type.Namespace, assembly, ReflectionNodeType.Namespace, 3, 3));
						namespacenames.Add(type.Namespace);
					}
				}
			}
			nodes.Sort(comp);
			namespaces.Sort(comp);
			foreach (TreeNode tn in namespaces) {
				parentnode.Nodes.Add(tn);
			}
			foreach (TreeNode tn in nodes) {
				Type type = (Type)((ReflectionNode)tn).Attribute;
				if (type.Namespace != null && type.Namespace != "") {
					GetNodeFromCollection(parentnode.Nodes, type.Namespace).Nodes.Add(tn);
				} else {
					parentnode.Nodes.Add(tn);
				}
			}
				
			
//				TreeNode path      = parentnode;
//				string   nodename  = typename;
//				
//				if (lastindex != -1) {
//					string pathname = typename.Substring(0, lastindex);
//					TreeNode node = GetNodeFromCollection(parentnode.Nodes, pathname);
//					if (node == null) {
//						TreeNode newnode = new ReflectionFolderNode(pathname, assembly, ReflectionNodeType.Namespace, 3, 3);
//						parentnode.Nodes.Add(newnode);
//						path = newnode;
//					} else
//						path = node;
//					nodename = typename.Substring(lastindex + 1);
//				}
//				
//				path.Nodes.Add(new ReflectionTypeNode(nodename, type));

		}
		
		void PopulateAssembly(Assembly assembly, TreeNode parentnode)
		{
			parentnode.Nodes.Clear();
			
			TreeNode node = new ReflectionFolderNode(Path.GetFileName(assembly.CodeBase), assembly, ReflectionNodeType.Library, 2, 2);
			parentnode.Nodes.Add(node);
			
			ReflectionFolderNode resourcefolder = new ReflectionFolderNode(ress.GetString("ObjectBrowser.Nodes.Resources"), assembly, ReflectionNodeType.Folder, 6, 7);
			string[] resources = assembly.GetManifestResourceNames();
			foreach (string resource in resources) {
				resourcefolder.Nodes.Add(new ReflectionNode(resource, assembly, ReflectionNodeType.Resource));
			}
			parentnode.Nodes.Add(resourcefolder);
			
			ReflectionFolderNode referencefolder = new ReflectionFolderNode(ress.GetString("ObjectBrowser.Nodes.References"), assembly, ReflectionNodeType.Folder, 9, 10);
			AssemblyName[] references = assembly.GetReferencedAssemblies();
			foreach (AssemblyName name in references) {
				referencefolder.Nodes.Add(new ReflectionNode(name.Name, name, ReflectionNodeType.Reference));
			}
			parentnode.Nodes.Add(referencefolder);
			
			ReflectionFolderNode modulefolder = new ReflectionFolderNode(ress.GetString("ObjectBrowser.Nodes.Modules"), assembly, ReflectionNodeType.Folder, 9, 10);
			parentnode.Nodes.Add(modulefolder);
			Module[] modules = assembly.GetModules(true);
			foreach(Module module in modules) {
				modulefolder.Nodes.Add(new ReflectionNode(module.Name, module, ReflectionNodeType.Module));
			}
		}
		
		public virtual void OnExpand()
		{
		}
		
		public virtual void OnCollapse()
		{
		}
	}
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?