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

📄 abstractcompletiondataprovider.cs

📁 SharpDevelop2.0.0 c#开发免费工具
💻 CS
字号:
// <file>
//     <copyright see="prj:///doc/copyright.txt"/>
//     <license see="prj:///doc/license.txt"/>
//     <owner name="Mike Krüger" email="mike@icsharpcode.net"/>
//     <version>$Revision: 1105 $</version>
// </file>

using System;
using System.Collections;
using System.Collections.Specialized;
using System.Windows.Forms;

using ICSharpCode.Core;
using ICSharpCode.TextEditor.Document;
using ICSharpCode.TextEditor;
using ICSharpCode.SharpDevelop.Dom;
using ICSharpCode.TextEditor.Gui.CompletionWindow;

namespace ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor
{
	public abstract class AbstractCompletionDataProvider : ICompletionDataProvider
	{
		public virtual ImageList ImageList {
			get {
				return ClassBrowserIconService.ImageList;
			}
		}
		
		int defaultIndex = -1;
		
		/// <summary>
		/// Gets the index of the element in the list that is chosen by default.
		/// </summary>
		public int DefaultIndex {
			get {
				return defaultIndex;
			}
			set {
				defaultIndex = value;
			}
		}
		
		protected string preSelection = null;
		
		public string PreSelection {
			get {
				return preSelection;
			}
		}
		
		bool insertSpace;
		
		/// <summary>
		/// Gets/Sets if a space should be inserted in front of the completed expression.
		/// </summary>
		public bool InsertSpace {
			get {
				return insertSpace;
			}
			set {
				insertSpace = value;
			}
		}
		
		/// <summary>
		/// Gets if pressing 'key' should trigger the insertion of the currently selected element.
		/// </summary>
		public virtual bool IsInsertionKey(char key)
		{
			return !char.IsLetterOrDigit(key) && key != '_';
		}
		
		/// <summary>
		/// Generates the completion data. This method is called by the text editor control.
		/// </summary>
		public abstract ICompletionData[] GenerateCompletionData(string fileName, TextArea textArea, char charTyped);
	}
	
	public abstract class AbstractCodeCompletionDataProvider : AbstractCompletionDataProvider
	{
		Hashtable insertedElements           = new Hashtable();
		Hashtable insertedPropertiesElements = new Hashtable();
		Hashtable insertedEventElements      = new Hashtable();
		
		protected int caretLineNumber;
		protected int caretColumn;
		protected string fileName;
		
		protected ArrayList completionData = null;
		protected ExpressionContext overrideContext;
		
		/// <summary>
		/// Generates the completion data. This method is called by the text editor control.
		/// </summary>
		public override ICompletionData[] GenerateCompletionData(string fileName, TextArea textArea, char charTyped)
		{
			completionData = new ArrayList();
			this.fileName = fileName;
			IDocument document = textArea.Document;
			
			// the parser works with 1 based coordinates
			caretLineNumber      = document.GetLineNumberForOffset(textArea.Caret.Offset) + 1;
			caretColumn          = textArea.Caret.Offset - document.GetLineSegment(caretLineNumber - 1).Offset + 1;
			
			GenerateCompletionData(textArea, charTyped);
			
			return (ICompletionData[])completionData.ToArray(typeof(ICompletionData));
		}
		
		protected ExpressionResult GetExpression(TextArea textArea)
		{
			IDocument document = textArea.Document;
			IExpressionFinder expressionFinder = ParserService.GetExpressionFinder(fileName);
			if (expressionFinder == null) {
				return new ExpressionResult(TextUtilities.GetExpressionBeforeOffset(textArea, textArea.Caret.Offset));
			} else {
				ExpressionResult res = expressionFinder.FindExpression(document.GetText(0, textArea.Caret.Offset), textArea.Caret.Offset - 1);
				if (overrideContext != null)
					res.Context = overrideContext;
				return res;
			}
		}
		
		protected abstract void GenerateCompletionData(TextArea textArea, char charTyped);
		
		protected void AddResolveResults(ICollection list, ExpressionContext context)
		{
			if (list == null) {
				return;
			}
			completionData.Capacity += list.Count;
			CodeCompletionData suggestedData = null;
			foreach (object o in list) {
				if (context != null && !context.ShowEntry(o))
					continue;
				CodeCompletionData ccd = CreateItem(o, context);
				if (object.Equals(o, context.SuggestedItem))
					suggestedData = ccd;
				if (ccd != null && !ccd.Text.StartsWith("___"))
					completionData.Add(ccd);
			}
			if (context.SuggestedItem != null) {
				if (suggestedData == null) {
					suggestedData = CreateItem(context.SuggestedItem, context);
					if (suggestedData != null) {
						completionData.Add(suggestedData);
					}
				}
				if (suggestedData != null) {
					completionData.Sort();
					this.DefaultIndex = completionData.IndexOf(suggestedData);
				}
			}
		}
		
		CodeCompletionData CreateItem(object o, ExpressionContext context)
		{
			if (o is string) {
				return new CodeCompletionData(o.ToString(), ClassBrowserIconService.NamespaceIndex);
			} else if (o is IClass) {
				return new CodeCompletionData((IClass)o);
			} else if (o is IProperty) {
				IProperty property = (IProperty)o;
				if (property.Name != null && insertedPropertiesElements[property.Name] == null) {
					insertedPropertiesElements[property.Name] = property;
					return new CodeCompletionData(property);
				}
			} else if (o is IMethod) {
				IMethod method = (IMethod)o;
				if (method.Name != null &&!method.IsConstructor) {
					CodeCompletionData ccd = new CodeCompletionData(method);
					if (insertedElements[method.Name] == null) {
						insertedElements[method.Name] = ccd;
						return ccd;
					} else {
						CodeCompletionData oldMethod = (CodeCompletionData)insertedElements[method.Name];
						++oldMethod.Overloads;
					}
				}
			} else if (o is IField) {
				return new CodeCompletionData((IField)o);
			} else if (o is IEvent) {
				IEvent e = (IEvent)o;
				if (e.Name != null && insertedEventElements[e.Name] == null) {
					insertedEventElements[e.Name] = e;
					return new CodeCompletionData(e);
				}
			} else {
				throw new ApplicationException("Unknown object: " + o);
			}
			return null;
		}
		
		protected void AddResolveResults(ResolveResult results, ExpressionContext context)
		{
			insertedElements.Clear();
			insertedPropertiesElements.Clear();
			insertedEventElements.Clear();
			
			if (results != null) {
				AddResolveResults(results.GetCompletionData(ParserService.CurrentProjectContent), context);
			}
		}
	}
}

⌨️ 快捷键说明

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