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

📄 quickclassbrowserpanel.cs

📁 SharpDevelop2.0.0 c#开发免费工具
💻 CS
📖 第 1 页 / 共 2 页
字号:
// <file>
//     <copyright see="prj:///doc/copyright.txt"/>
//     <license see="prj:///doc/license.txt"/>
//     <owner name="none" email=""/>
//     <version>$Revision: 1297 $</version>
// </file>

// created on 07.03.2004 at 19:12
using System;
using System.Threading;
using System.Collections;
using System.IO;
using System.Drawing;
using System.Windows.Forms;
using ICSharpCode.SharpDevelop.Dom;
using ICSharpCode.Core;

namespace ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor
{
	public class QuickClassBrowserPanel : System.Windows.Forms.UserControl
	{
		private System.Windows.Forms.ComboBox classComboBox;
		private System.Windows.Forms.ComboBox membersComboBox;
		
		ICompilationUnit            currentCompilationUnit;
		SharpDevelopTextAreaControl textAreaControl;
		bool                        autoselect = true;
		
		class ComboBoxItem : System.IComparable
		{
			object item;
			string text;
			int    iconIndex;
			bool   isInCurrentPart;
			
			public int IconIndex {
				get {
					return iconIndex;
				}
			}
			
			public object Item {
				get {
					return item;
				}
			}
			
			public bool IsInCurrentPart {
				get {
					return isInCurrentPart;
				}
			}
			
			public DomRegion ItemRegion {
				get {
					IClass classItem = item as IClass;
					if (item is IClass)
						return ((IClass)item).Region;
					else if (item is IMember)
						return ((IMember)item).Region;
					else
						return DomRegion.Empty;
				}
			}
			
			public int Line {
				get {
					DomRegion r = this.ItemRegion;
					if (r.IsEmpty)
						return 0;
					else
						return r.BeginLine - 1;
				}
			}
			
			public int Column {
				get {
					DomRegion r = this.ItemRegion;
					if (r.IsEmpty)
						return 0;
					else
						return r.BeginColumn - 1;
				}
			}
			
			public int EndLine {
				get {
					DomRegion r = this.ItemRegion;
					if (r.IsEmpty)
						return 0;
					else
						return r.EndLine - 1;
				}
			}
			
			public ComboBoxItem(object item, string text, int iconIndex, bool isInCurrentPart)
			{
				this.item = item;
				this.text = text;
				this.iconIndex = iconIndex;
				this.isInCurrentPart = isInCurrentPart;
			}
			
			public bool IsInside(int lineNumber)
			{
				if (!isInCurrentPart)
					return false;
				IClass classItem = item as IClass;
				if (classItem != null) {
					if (classItem.Region.IsEmpty)
						return false;
					return classItem.Region.BeginLine - 1 <= lineNumber &&
						classItem.Region.EndLine - 1 >= lineNumber;
				}
				
				IMember member = item as IMember;
				if (member == null || member.Region.IsEmpty) {
					return false;
				}
				bool isInside = member.Region.BeginLine - 1 <= lineNumber;
				
				if (member is IMethodOrProperty) {
					if (((IMethodOrProperty)member).BodyRegion.EndLine >= 0) {
						isInside &= lineNumber <= ((IMethodOrProperty)member).BodyRegion.EndLine - 1;
					} else {
						return member.Region.BeginLine - 1 == lineNumber;
					}
				} else {
					isInside &= lineNumber <= member.Region.EndLine - 1;
				}
				return isInside;
			}
			
			public int CompareItemTo(object obj)
			{
				ComboBoxItem boxItem = (ComboBoxItem)obj;
				
				if (boxItem.Item is IComparable) {
					return ((IComparable)boxItem.Item).CompareTo(item);
				}
				if (boxItem.text != text || boxItem.Line != Line || boxItem.EndLine != EndLine || boxItem.iconIndex != iconIndex) {
					return 1;
				}
				return 0;
			}
			
			string cachedString;
			
			public override string ToString()
			{
				// ambience lookups can be expensive when the return type is
				// resolved on the fly.
				// Therefore, we need to cache the generated string because it is used
				// very often for the sorting.
				if (cachedString == null)
					cachedString = ToStringInternal();
				return cachedString;
			}
			
			string ToStringInternal()
			{
				IAmbience ambience = AmbienceService.CurrentAmbience;
				ambience.ConversionFlags = ConversionFlags.ShowParameterNames;
				if (item is IMethod) {
					return ambience.Convert((IMethod)item);
				}
				if (item is IProperty) {
					return ambience.Convert((IProperty)item);
				}
				if (item is IField) {
					return ambience.Convert((IField)item);
				}
				if (item is IProperty) {
					return ambience.Convert((IProperty)item);
				}
				if (item is IEvent) {
					return ambience.Convert((IEvent)item);
				}
				return text;
			}
			
			#region System.IComparable interface implementation
			public int CompareTo(object obj)
			{
				return ToString().CompareTo(obj.ToString());
			}
			#endregion
			
		}
		
		public QuickClassBrowserPanel(SharpDevelopTextAreaControl textAreaControl)
		{
			InitializeComponent();
			this.membersComboBox.MaxDropDownItems = 20;
			
			base.Dock = DockStyle.Top;
			this.textAreaControl = textAreaControl;
			this.textAreaControl.ActiveTextAreaControl.Caret.PositionChanged += new EventHandler(CaretPositionChanged);
		}
		
		protected override void Dispose(bool disposing)
		{
			if (disposing) {
				this.textAreaControl.ActiveTextAreaControl.Caret.PositionChanged -= new EventHandler(CaretPositionChanged);
				this.membersComboBox.Dispose();
				this.classComboBox.Dispose();
			}
			base.Dispose(disposing);
		}
		
		void CaretPositionChanged(object sender, EventArgs e)
		{
			// ignore simple movements
			if (e != EventArgs.Empty) {
				return;
			}
			try {
				
				ParseInformation parseInfo = ParserService.GetParseInformation(textAreaControl.FileName);
				if (parseInfo != null) {
					if (currentCompilationUnit != (ICompilationUnit)parseInfo.MostRecentCompilationUnit) {
						currentCompilationUnit = (ICompilationUnit)parseInfo.MostRecentCompilationUnit;
						if (currentCompilationUnit != null) {
							
							FillClassComboBox(true);
							FillMembersComboBox();
						}
					}
					UpdateClassComboBox();
					UpdateMembersComboBox();
				}
			} catch (Exception ex) {
				MessageService.ShowError(ex);
			}
		}
		
		bool membersComboBoxSelectedMember = false;
		void UpdateMembersComboBox()
		{
			autoselect = false;
			try {
				if (currentCompilationUnit != null) {
					for (int i = 0; i < membersComboBox.Items.Count; ++i) {
						if (((ComboBoxItem)membersComboBox.Items[i]).IsInside(textAreaControl.ActiveTextAreaControl.Caret.Line)) {
							if (membersComboBox.SelectedIndex != i) {
								membersComboBox.SelectedIndex = i;
								
							}
							if (!membersComboBoxSelectedMember) {
								membersComboBox.Refresh();
							}
							membersComboBoxSelectedMember = true;
							return;
						}
					}
				}
				if (membersComboBoxSelectedMember) {
					membersComboBox.Refresh();
					membersComboBoxSelectedMember = false;
				}
			} finally {
				autoselect = true;
			}
		}
		
		bool classComboBoxSelectedMember = false;
		void UpdateClassComboBox()
		{
			// Still needed ?
			if (currentCompilationUnit == null) {
				currentCompilationUnit = (ICompilationUnit)ParserService.GetParseInformation(Path.GetFullPath(textAreaControl.FileName)).MostRecentCompilationUnit;
			}
			
			autoselect = false;
			try {

⌨️ 快捷键说明

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