⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 componentlibraryloader.cs

📁 SharpDevelop2.0.0 c#开发免费工具
💻 CS
字号:
// <file>
//     <copyright see="prj:///doc/copyright.txt"/>
//     <license see="prj:///doc/license.txt"/>
//     <owner name="Denis ERCHOFF" email="d_erchoff@hotmail.com"/>
//     <version>$Revision: 1221 $</version>
// </file>

using System;
using System.IO;
using System.Drawing;
using System.Reflection;
using System.Collections;
using System.Xml;

namespace ICSharpCode.FormsDesigner.Gui
{
	public class ToolComponent
	{
		string fullName;
		string assemblyName;
		string hintPath;
		bool   isEnabled = true;
		
		public string HintPath {
			get {
				return hintPath;
			}
			set {
				hintPath = value;
			}
		}
		
		public string FullName {
			get {
				return fullName;
			}
			set {
				fullName = value;
			}
		}
		
		public string Name {
			get {
				int idx = fullName.LastIndexOf('.');
				if (idx > 0) {
					return fullName.Substring(idx + 1);
				}
				return fullName;
			}
		}
		
		public string Namespace {
			get {
				int idx = fullName.LastIndexOf('.');
				if (idx > 0) {
					return fullName.Substring(0, idx);
				}
				return String.Empty;
			}
		}
		
		public bool IsEnabled {
			get {
				return isEnabled;
			}
			set {
				isEnabled = value;
			}
		}
		
		string AssemblyFileNameWithoutPath {
			get {
				int idx = assemblyName.IndexOf(',');
				
				return assemblyName.Substring(0, idx) + ".dll";
			}
		}
		
		public string AssemblyName {
			get {
				return assemblyName;
			}
			set {
				assemblyName = value;
			}
		}
		protected ToolComponent()
		{
		}
		public ToolComponent(string fullName, ComponentAssembly assembly, bool enabled)
		{
			this.fullName = fullName;
			this.assemblyName = assembly.Name;
			this.hintPath = assembly.HintPath;
			this.isEnabled = enabled;
		}
		public string FileName {
			get {
				if (HintPath == null) {
					return null;
				}
				return Path.Combine(HintPath, AssemblyFileNameWithoutPath);
			}
		}
		
		public Assembly LoadAssembly()
		{
			//ICSharpCode.Core.LoggingService.Debug("ToolComponent.LoadAssembly(): " + AssemblyName);
			Assembly assembly;
			if (HintPath != null) {
				assembly = Assembly.LoadFrom(FileName);
			} else {
				assembly = Assembly.Load(AssemblyName);
			}
			if (!ICSharpCode.FormsDesigner.Services.TypeResolutionService.DesignerAssemblies.Contains(assembly))
				ICSharpCode.FormsDesigner.Services.TypeResolutionService.DesignerAssemblies.Add(assembly);
			return assembly;
		}
		
		public object Clone()
		{
			ToolComponent toolComponent = new ToolComponent();
			toolComponent.FullName     = fullName;
			toolComponent.AssemblyName = assemblyName;
			toolComponent.IsEnabled    = isEnabled;
			return toolComponent;
		}
	}
	
	public class Category
	{
		string    name;
		bool      isEnabled  = true;
		ArrayList components = new ArrayList();
		
		public string Name {
			get {
				return name;
			}
			set {
				name = value;
			}
		}
		
		public bool IsEnabled {
			get {
				return isEnabled;
			}
			set {
				isEnabled = value;
			}
		}
		
		public ArrayList ToolComponents {
			get {
				return components;
			}
		}
		
		protected Category()
		{
		}
		
		public Category(string name)
		{
			this.name = name;
		}
		
		public object Clone()
		{
			Category newCategory = new Category();
			newCategory.Name      = name;
			newCategory.IsEnabled = isEnabled;
			foreach (ToolComponent toolComponent in components) {
				newCategory.ToolComponents.Add(toolComponent.Clone());
			}
			return newCategory;
		}
	}
	
	public class ComponentAssembly
	{
		string name;
		string hintPath;
		
		public string Name {
			get {
				return name;
			}
			set {
				name = value;
			}
		}
		public string HintPath {
			get {
				return hintPath;
			}
			set {
				hintPath = value;
			}
		}
		public ComponentAssembly(string name)
		{
			this.name = name;
			this.hintPath = null;
		}
		public ComponentAssembly(string name, string hintPath)
		{
			this.name = name;
			this.hintPath = hintPath;
		}
		public override string ToString()
		{
			return name;
		}
	}
	
	public class ComponentLibraryLoader
	{
		static readonly string VERSION = "1.1.0";
		
		ArrayList assemblies = new ArrayList();
		ArrayList categories = new ArrayList();
		
		public ArrayList Categories {
			get {
				return categories;
			}
			set {
				categories = value;
			}
		}
		
		public ArrayList CopyCategories()
		{
			ArrayList newCategories = new ArrayList();
			foreach (Category category in categories) {
				newCategories.Add(category.Clone());
			}
			return newCategories;
		}
		
		public void RemoveCategory(string name)
		{
			foreach (Category category in categories) {
				if (category.Name == name) {
					categories.Remove(category);
					break;
				}
			}
		}
		
		public void DisableToolComponent(string categoryName, string fullName)
		{
			foreach (Category category in categories) {
				if (category.Name == categoryName) {
					foreach (ToolComponent component in category.ToolComponents) {
						if (component.FullName == fullName) {
							component.IsEnabled = false;
							return;
						}
					}
				}
			}
		}
		
		/// <summary>
		/// Swaps the order of the two specified tool components
		/// </summary>
		public void ExchangeToolComponents(string categoryName, string fullName1, string fullName2)
		{
			foreach (Category category in categories) {
				if (category.Name == categoryName) {
					int index1 = -1;
					int index2 = -1;
					for (int i = 0; i < category.ToolComponents.Count; ++i) {
						ToolComponent component = (ToolComponent)category.ToolComponents[i];
						if (component.FullName == fullName1) {
							index1 = i;
						} else if (component.FullName == fullName2) {
							index2 = i;
						}
						
						if (index1 != -1 && index2 != -1) {
							ToolComponent component1 = (ToolComponent)category.ToolComponents[index1];
							category.ToolComponents[index1] = category.ToolComponents[index2];
							category.ToolComponents[index2] = component1;
							return;
						}
					}
				}
			}
		}
		
		public bool LoadToolComponentLibrary(string fileName)
		{
			if (!File.Exists(fileName)) {
				return false;
			}
			
			try {
				XmlDocument doc = new XmlDocument();
				doc.Load(fileName);
				
				if (doc.DocumentElement.Name != "SharpDevelopControlLibrary" ||
				    doc.DocumentElement.Attributes["version"] == null ||
				    doc.DocumentElement.Attributes["version"].InnerText != VERSION) {
					return false;
				}
				
				foreach (XmlNode node in doc.DocumentElement["Assemblies"].ChildNodes) {
					if (node.Name == "Assembly") {
						string assemblyName = node.Attributes["assembly"].InnerText;
						if (node.Attributes["path"] != null) {
							assemblies.Add(new ComponentAssembly(assemblyName, node.Attributes["path"].InnerText));
						} else {
							assemblies.Add(new ComponentAssembly(assemblyName));
						}
					}
				}
				
				foreach (XmlNode node in doc.DocumentElement["Categories"].ChildNodes) {
					if (node.Name == "Category") {
						string name = node.Attributes["name"].InnerText;
						Category newCategory = new Category(name);
						foreach (XmlNode componentNode in node.ChildNodes) {
							ToolComponent newToolComponent = new ToolComponent(componentNode.Attributes["class"].InnerText,
								(ComponentAssembly)assemblies[Int32.Parse(componentNode.Attributes["assembly"].InnerText)],
								IsEnabled(componentNode.Attributes["enabled"]));
							newCategory.ToolComponents.Add(newToolComponent);
						}
						categories.Add(newCategory);
					}
				}
			} catch (Exception e) {
				ICSharpCode.Core.LoggingService.Warn("ComponentLibraryLoader.LoadToolComponentLibrary: " + e.Message);
				return false;
			}
			return true;
		}
		
		public Bitmap GetIcon(ToolComponent component)
		{
			Assembly asm = component.LoadAssembly();
			Type type = asm.GetType(component.FullName);
			Bitmap b = null;
			if (type != null) {
				object[] attributes = type.GetCustomAttributes(false);
				foreach (object attr in attributes) {
					if (attr is ToolboxBitmapAttribute) {
						ToolboxBitmapAttribute toolboxBitmapAttribute = (ToolboxBitmapAttribute)attr;
						b = new Bitmap(toolboxBitmapAttribute.GetImage(type));
						b.MakeTransparent();
						break;
					}
				}
			}
			if (b == null) {
				try {
					Stream imageStream = asm.GetManifestResourceStream(component.FullName + ".bmp");
					if (imageStream != null) {
						b = new Bitmap(Image.FromStream(imageStream));
						b.MakeTransparent();
					}
				} catch (Exception e) {
					ICSharpCode.Core.LoggingService.Warn("ComponentLibraryLoader.GetIcon: " + e.Message);
				}
			}
			
			// TODO: Maybe default icon needed ??!?!
			return b;
		}
		
		public ToolComponent GetToolComponent(string assemblyName)
		{
			foreach (Category category in categories) {
				foreach (ToolComponent component in category.ToolComponents) {
					if (component.AssemblyName == assemblyName) {
						return component;
					}
				}
			}
			return null;
		}
		
		public void SaveToolComponentLibrary(string fileName)
		{
			XmlDocument doc = new XmlDocument();
			doc.LoadXml("<SharpDevelopControlLibrary version=\"" + VERSION + "\"/>");
			Hashtable assemblyHashTable = new Hashtable();
			
			XmlElement assemblyNode = doc.CreateElement("Assemblies");
			doc.DocumentElement.AppendChild(assemblyNode);
			for (int i = 0; i < assemblies.Count; ++i) {
				ComponentAssembly componentAssembly = (ComponentAssembly)assemblies[i];
				assemblyHashTable[componentAssembly.Name] = i;
				
				XmlElement newAssembly = doc.CreateElement("Assembly");
				
				newAssembly.SetAttribute("assembly", componentAssembly.Name);
				if (componentAssembly.HintPath != null) {
					newAssembly.SetAttribute("path", componentAssembly.HintPath);
				}
				assemblyNode.AppendChild(newAssembly);
			}
			
			XmlElement categoryNode = doc.CreateElement("Categories");
			doc.DocumentElement.AppendChild(categoryNode);
			foreach (Category category in categories) {
				XmlElement newCategory = doc.CreateElement("Category");
				newCategory.SetAttribute("name", category.Name);
				newCategory.SetAttribute("enabled", category.IsEnabled.ToString());
				categoryNode.AppendChild(newCategory);
				
				foreach (ToolComponent component in category.ToolComponents) {
					XmlElement newToolComponent = doc.CreateElement("ToolComponent");
					newToolComponent.SetAttribute("class", component.FullName);
					
					if (assemblyHashTable[component.AssemblyName] == null) {
						XmlElement newAssembly = doc.CreateElement("Assembly");
						newAssembly.SetAttribute("assembly", component.AssemblyName);
						if (component.HintPath != null) {
							newAssembly.SetAttribute("path", component.HintPath);
						}
						
						assemblyNode.AppendChild(newAssembly);
						assemblyHashTable[component.AssemblyName] = assemblyHashTable.Values.Count;
					}
					
					newToolComponent.SetAttribute("assembly", assemblyHashTable[component.AssemblyName].ToString());
					newToolComponent.SetAttribute("enabled", component.IsEnabled.ToString());
					newCategory.AppendChild(newToolComponent);
				}
			}
			doc.Save(fileName);
		}
		
		bool IsEnabled(XmlAttribute attribute)
		{
			if (attribute != null && attribute.InnerText != null) {
				bool enabled = true;
				if (Boolean.TryParse(attribute.InnerText, out enabled)) {
					return enabled;
				}
			}
			return true;
		}
	}
}

⌨️ 快捷键说明

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