You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							150 lines
						
					
					
						
							5.9 KiB
						
					
					
				
			
		
		
	
	
							150 lines
						
					
					
						
							5.9 KiB
						
					
					
				// CSharp Editor Example with Code Completion | 
						|
// Copyright (c) 2007, Daniel Grunwald | 
						|
// All rights reserved. | 
						|
//  | 
						|
// Redistribution and use in source and binary forms, with or without modification, are | 
						|
// permitted provided that the following conditions are met: | 
						|
//  | 
						|
// - Redistributions of source code must retain the above copyright notice, this list | 
						|
//   of conditions and the following disclaimer. | 
						|
//  | 
						|
// - Redistributions in binary form must reproduce the above copyright notice, this list | 
						|
//   of conditions and the following disclaimer in the documentation and/or other materials | 
						|
//   provided with the distribution. | 
						|
//  | 
						|
// - Neither the name of the ICSharpCode team nor the names of its contributors may be used to | 
						|
//   endorse or promote products derived from this software without specific prior written | 
						|
//   permission. | 
						|
//  | 
						|
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS &AS IS& AND ANY EXPRESS | 
						|
// OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY | 
						|
// AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR | 
						|
// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | 
						|
// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | 
						|
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER | 
						|
// IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT | 
						|
// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 
						|
 | 
						|
using System; | 
						|
using System.Text; | 
						|
using ICSharpCode.SharpDevelop.Dom; | 
						|
using ICSharpCode.SharpDevelop.Dom.CSharp; | 
						|
using ICSharpCode.SharpDevelop.Dom.VBNet; | 
						|
using TextEditor = ICSharpCode.TextEditor; | 
						|
using NRefactoryResolver = ICSharpCode.SharpDevelop.Dom.NRefactoryResolver.NRefactoryResolver; | 
						|
 | 
						|
namespace CSharpEditor | 
						|
{ | 
						|
	sealed class ToolTipProvider | 
						|
	{ | 
						|
		MainForm mainForm; | 
						|
		TextEditor.TextEditorControl editor; | 
						|
		 | 
						|
		private ToolTipProvider(MainForm mainForm, TextEditor.TextEditorControl editor) | 
						|
		{ | 
						|
			this.mainForm = mainForm; | 
						|
			this.editor = editor; | 
						|
		} | 
						|
		 | 
						|
		public static void Attach(MainForm mainForm, TextEditor.TextEditorControl editor) | 
						|
		{ | 
						|
			ToolTipProvider tp = new ToolTipProvider(mainForm, editor); | 
						|
			editor.ActiveTextAreaControl.TextArea.ToolTipRequest += tp.OnToolTipRequest; | 
						|
		} | 
						|
		 | 
						|
		void OnToolTipRequest(object sender, TextEditor.ToolTipRequestEventArgs e) | 
						|
		{ | 
						|
			if (e.InDocument && !e.ToolTipShown) { | 
						|
				IExpressionFinder expressionFinder; | 
						|
				if (MainForm.IsVisualBasic) { | 
						|
					expressionFinder = new VBExpressionFinder(); | 
						|
				} else { | 
						|
					expressionFinder = new CSharpExpressionFinder(mainForm.parseInformation); | 
						|
				} | 
						|
				ExpressionResult expression = expressionFinder.FindFullExpression( | 
						|
					editor.Text, | 
						|
					editor.Document.PositionToOffset(e.LogicalPosition)); | 
						|
				if (expression.Region.IsEmpty) { | 
						|
					expression.Region = new DomRegion(e.LogicalPosition.Line + 1, e.LogicalPosition.Column + 1); | 
						|
				} | 
						|
				 | 
						|
				TextEditor.TextArea textArea = editor.ActiveTextAreaControl.TextArea; | 
						|
				NRefactoryResolver resolver = new NRefactoryResolver(mainForm.myProjectContent.Language); | 
						|
				ResolveResult rr = resolver.Resolve(expression, | 
						|
				                                    mainForm.parseInformation, | 
						|
				                                    textArea.MotherTextEditorControl.Text); | 
						|
				string toolTipText = GetText(rr); | 
						|
				if (toolTipText != null) { | 
						|
					e.ShowToolTip(toolTipText); | 
						|
				} | 
						|
			} | 
						|
		} | 
						|
		 | 
						|
		static string GetText(ResolveResult result) | 
						|
		{ | 
						|
			if (result == null) { | 
						|
				return null; | 
						|
			} | 
						|
			if (result is MixedResolveResult) | 
						|
				return GetText(((MixedResolveResult)result).PrimaryResult); | 
						|
			IAmbience ambience = MainForm.IsVisualBasic ? (IAmbience)new VBNetAmbience() : new CSharpAmbience(); | 
						|
			ambience.ConversionFlags = ConversionFlags.StandardConversionFlags | ConversionFlags.ShowAccessibility; | 
						|
			if (result is MemberResolveResult) { | 
						|
				return GetMemberText(ambience, ((MemberResolveResult)result).ResolvedMember); | 
						|
			} else if (result is LocalResolveResult) { | 
						|
				LocalResolveResult rr = (LocalResolveResult)result; | 
						|
				ambience.ConversionFlags = ConversionFlags.UseFullyQualifiedTypeNames | 
						|
					| ConversionFlags.ShowReturnType; | 
						|
				StringBuilder b = new StringBuilder(); | 
						|
				if (rr.IsParameter) | 
						|
					b.Append("parameter "); | 
						|
				else | 
						|
					b.Append("local variable "); | 
						|
				b.Append(ambience.Convert(rr.Field)); | 
						|
				return b.ToString(); | 
						|
			} else if (result is NamespaceResolveResult) { | 
						|
				return "namespace " + ((NamespaceResolveResult)result).Name; | 
						|
			} else if (result is TypeResolveResult) { | 
						|
				IClass c = ((TypeResolveResult)result).ResolvedClass; | 
						|
				if (c != null) | 
						|
					return GetMemberText(ambience, c); | 
						|
				else | 
						|
					return ambience.Convert(result.ResolvedType); | 
						|
			} else if (result is MethodGroupResolveResult) { | 
						|
				MethodGroupResolveResult mrr = result as MethodGroupResolveResult; | 
						|
				IMethod m = mrr.GetMethodIfSingleOverload(); | 
						|
				if (m != null) | 
						|
					return GetMemberText(ambience, m); | 
						|
				else | 
						|
					return "Overload of " + ambience.Convert(mrr.ContainingType) + "." + mrr.Name; | 
						|
			} else { | 
						|
				return null; | 
						|
			} | 
						|
		} | 
						|
		 | 
						|
		static string GetMemberText(IAmbience ambience, IEntity member) | 
						|
		{ | 
						|
			StringBuilder text = new StringBuilder(); | 
						|
			if (member is IField) { | 
						|
				text.Append(ambience.Convert(member as IField)); | 
						|
			} else if (member is IProperty) { | 
						|
				text.Append(ambience.Convert(member as IProperty)); | 
						|
			} else if (member is IEvent) { | 
						|
				text.Append(ambience.Convert(member as IEvent)); | 
						|
			} else if (member is IMethod) { | 
						|
				text.Append(ambience.Convert(member as IMethod)); | 
						|
			} else if (member is IClass) { | 
						|
				text.Append(ambience.Convert(member as IClass)); | 
						|
			} else { | 
						|
				text.Append("unknown member "); | 
						|
				text.Append(member.ToString()); | 
						|
			} | 
						|
			string documentation = member.Documentation; | 
						|
			if (documentation != null && documentation.Length > 0) { | 
						|
				text.Append('\n'); | 
						|
				text.Append(CodeCompletionData.XmlDocumentationToText(documentation)); | 
						|
			} | 
						|
			return text.ToString(); | 
						|
		} | 
						|
	} | 
						|
}
 | 
						|
 |