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

📄 quickclassbrowserpanel.cs

📁 全功能c#编译器
💻 CS
📖 第 1 页 / 共 2 页
字号:
// 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 SharpDevelop.Internal.Parser;
using ICSharpCode.Core.Services;
using ICSharpCode.SharpDevelop.Services;

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;
			static AmbienceService ambienceService = (AmbienceService)ServiceManager.Services.GetService(typeof(AmbienceService));
			
			
			
			public int IconIndex {
				get {
					return iconIndex;
				}
			}
			
			public object Item {
				get {
					return item;
				}
			}
			
			public int Line {
				get {
					if (item is IClass) {
						return ((IClass)item).Region.BeginLine - 1;
					}
					
					// also exception on delegate invoke
					try {
						return (item as IMember).Region.BeginLine - 1;
					}
					catch {
						return 0;
					}
				}
			}
			
			public int Column {
				get {
					if (item is IClass) {
						return ((IClass)item).Region.BeginColumn - 1;
					}
					
					// causes exception when delegate is selected in class windows - Invoke is visible in methods and when selected causes exception
					try {
						return (item as IMember).Region.BeginColumn - 1;
					}
					catch {
						return 0;
					}
				}
			}
			
			public int EndLine {
				get {
					if (item is IClass) {
						return ((IClass)item).Region.EndLine - 1;
					}
					return (item as IMember).Region.EndLine - 1;
				}
			}
			
			public ComboBoxItem(object item, string text, int iconIndex)
			{
				this.item = item;
				this.text = text;
				this.iconIndex = iconIndex;
			}
			
			public bool IsInside(int lineNumber)
			{
				if (item is IClass) {
					return ((IClass)item).Region.BeginLine - 1 <= lineNumber &&
					       ((IClass)item).Region.EndLine - 1 >= lineNumber;
				}
				
				IMember member = item as IMember;
				if (member == null) {
					return false;
				}
				bool isInside = member.Region.BeginLine - 1 <= lineNumber;
				
				if (member is IMethod) {
					if (((IMethod)member).BodyRegion.EndLine >= 0) {
						isInside &= lineNumber <= ((IMethod)member).BodyRegion.EndLine - 1;
					} else {
						return member.Region.BeginLine - 1 == lineNumber;
					}
				} else if (member is IProperty) {
					isInside &= lineNumber <= ((IProperty)member).BodyRegion.EndLine - 1;
				} else if (member is IIndexer) {
					isInside &= lineNumber <= ((IIndexer)member).BodyRegion.EndLine - 1;
				} 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;
			}
			
			public override string ToString()
			{
				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 IIndexer) {
					return ambience.Convert((IIndexer)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();
			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);
			}
			base.Dispose(disposing);
		}
		
		void CaretPositionChanged(object sender, EventArgs e)
		{
			// ignore simple movements
			if (e != EventArgs.Empty) {
				return;
			}
			try {
				IParserService parserService = (IParserService)ICSharpCode.Core.Services.ServiceManager.Services.GetService(typeof(IParserService));
				IParseInformation 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) {}
		}
		
		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) {
				IParserService parserService = (IParserService)ICSharpCode.Core.Services.ServiceManager.Services.GetService(typeof(IParserService));
				if (parserService != null) {
					currentCompilationUnit = (ICompilationUnit)parserService.GetParseInformation(Path.GetFullPath(textAreaControl.FileName)).MostRecentCompilationUnit;
				}
			}
			
			autoselect = false;
			try {
				if (currentCompilationUnit != null) {
//// Alex: when changing between files in different compilation units whole process must be restarted
//// happens usually when files are opened from different project(s)
					if (classComboBox.Items == null || classComboBox.Items.Count == 0) {
						FillClassComboBox(false);
					}

⌨️ 快捷键说明

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