Browse Source

created IInsightWindowHandler (general API)

git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/trunk@6325 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61
pull/1/head
Siegfried Pammer 16 years ago
parent
commit
f1d761cde7
  1. 2
      src/AddIns/BackendBindings/VBNetBinding/Project/Src/VBNetCompletionBinding.cs
  2. 3
      src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj
  3. 2
      src/Main/Base/Project/Src/Editor/CodeCompletion/CodeCompletionBinding.cs
  4. 27
      src/Main/Base/Project/Src/Editor/CodeCompletion/IInsightWindowHandler.cs
  5. 2
      src/Main/Base/Project/Src/Editor/CodeCompletion/NRefactoryCodeCompletionBinding.cs
  6. 73
      src/Main/Base/Project/Src/Editor/CodeCompletion/NRefactoryInsightWindowHandler.cs

2
src/AddIns/BackendBindings/VBNetBinding/Project/Src/VBNetCompletionBinding.cs

@ -38,7 +38,7 @@ namespace ICSharpCode.VBNetBinding
} }
} }
InsightWindowHandler insightHandler = new InsightWindowHandler(SupportedLanguage.VBNet); NRefactoryInsightWindowHandler insightHandler = new NRefactoryInsightWindowHandler(SupportedLanguage.VBNet);
public CodeCompletionKeyPressResult HandleKeyPress(ITextEditor editor, char ch) public CodeCompletionKeyPressResult HandleKeyPress(ITextEditor editor, char ch)
{ {

3
src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj

@ -96,7 +96,8 @@
<SubType>UserControl</SubType> <SubType>UserControl</SubType>
</Compile> </Compile>
<Compile Include="Src\Editor\CodeCompletion\ICompletionItemHandler.cs" /> <Compile Include="Src\Editor\CodeCompletion\ICompletionItemHandler.cs" />
<Compile Include="Src\Editor\CodeCompletion\InsightWindowHandler.cs" /> <Compile Include="Src\Editor\CodeCompletion\IInsightWindowHandler.cs" />
<Compile Include="Src\Editor\CodeCompletion\NRefactoryInsightWindowHandler.cs" />
<Compile Include="Src\Editor\CodeCompletion\NRefactoryCompletionItemList.cs" /> <Compile Include="Src\Editor\CodeCompletion\NRefactoryCompletionItemList.cs" />
<Compile Include="Src\Editor\Commands\ClassBookmarkSubmenuBuilder.cs" /> <Compile Include="Src\Editor\Commands\ClassBookmarkSubmenuBuilder.cs" />
<Compile Include="Src\Editor\Commands\ClassMemberMenuBuilder.cs" /> <Compile Include="Src\Editor\Commands\ClassMemberMenuBuilder.cs" />

2
src/Main/Base/Project/Src/Editor/CodeCompletion/CodeCompletionBinding.cs

@ -131,7 +131,7 @@ namespace ICSharpCode.SharpDevelop.Editor.CodeCompletion
bool enableIndexerInsight = true; bool enableIndexerInsight = true;
bool enableXmlCommentCompletion = true; bool enableXmlCommentCompletion = true;
bool enableDotCompletion = true; bool enableDotCompletion = true;
protected InsightWindowHandler insightHandler; protected IInsightWindowHandler insightHandler;
public bool EnableMethodInsight { public bool EnableMethodInsight {
get { get {

27
src/Main/Base/Project/Src/Editor/CodeCompletion/IInsightWindowHandler.cs

@ -0,0 +1,27 @@
// <file>
// <copyright see="prj:///doc/copyright.txt"/>
// <license see="prj:///doc/license.txt"/>
// <owner name="Daniel Grunwald" email="daniel@danielgrunwald.de"/>
// <version>$Revision: 6028 $</version>
// </file>
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using ICSharpCode.NRefactory;
using ICSharpCode.NRefactory.Parser;
using ICSharpCode.SharpDevelop.Dom;
using ICSharpCode.SharpDevelop.Dom.NRefactoryResolver;
using CSTokens = ICSharpCode.NRefactory.Parser.CSharp.Tokens;
using VBTokens = ICSharpCode.NRefactory.Parser.VB.Tokens;
namespace ICSharpCode.SharpDevelop.Editor.CodeCompletion
{
public interface IInsightWindowHandler
{
void InitializeOpenedInsightWindow(ITextEditor editor, IInsightWindow insightWindow);
bool InsightRefreshOnComma(ITextEditor editor, char ch);
}
}

2
src/Main/Base/Project/Src/Editor/CodeCompletion/NRefactoryCodeCompletionBinding.cs

@ -37,7 +37,7 @@ namespace ICSharpCode.SharpDevelop.Editor.CodeCompletion
languageProperties = LanguageProperties.VBNet; languageProperties = LanguageProperties.VBNet;
} }
insightHandler = new InsightWindowHandler(language); insightHandler = new NRefactoryInsightWindowHandler(language);
} }
public override bool CtrlSpace(ITextEditor editor) public override bool CtrlSpace(ITextEditor editor)

73
src/Main/Base/Project/Src/Editor/CodeCompletion/InsightWindowHandler.cs → src/Main/Base/Project/Src/Editor/CodeCompletion/NRefactoryInsightWindowHandler.cs

@ -19,13 +19,13 @@ using VBTokens = ICSharpCode.NRefactory.Parser.VB.Tokens;
namespace ICSharpCode.SharpDevelop.Editor.CodeCompletion namespace ICSharpCode.SharpDevelop.Editor.CodeCompletion
{ {
public class InsightWindowHandler public class NRefactoryInsightWindowHandler : IInsightWindowHandler
{ {
readonly SupportedLanguage language; readonly SupportedLanguage language;
readonly int eofToken, commaToken, openParensToken, closeParensToken, openBracketToken, closeBracketToken, openBracesToken, closeBracesToken, statementEndToken; readonly int eofToken, commaToken, openParensToken, closeParensToken, openBracketToken, closeBracketToken, openBracesToken, closeBracesToken, statementEndToken;
readonly LanguageProperties languageProperties; readonly LanguageProperties languageProperties;
public InsightWindowHandler(SupportedLanguage language) public NRefactoryInsightWindowHandler(SupportedLanguage language)
{ {
this.language = language; this.language = language;
if (language == SupportedLanguage.CSharp) { if (language == SupportedLanguage.CSharp) {
@ -38,7 +38,7 @@ namespace ICSharpCode.SharpDevelop.Editor.CodeCompletion
openBracesToken = CSTokens.OpenCurlyBrace; openBracesToken = CSTokens.OpenCurlyBrace;
closeBracesToken = CSTokens.CloseCurlyBrace; closeBracesToken = CSTokens.CloseCurlyBrace;
statementEndToken = CSTokens.Semicolon; statementEndToken = CSTokens.Semicolon;
languageProperties = LanguageProperties.CSharp; languageProperties = LanguageProperties.CSharp;
} else { } else {
eofToken = VBTokens.EOF; eofToken = VBTokens.EOF;
@ -50,11 +50,11 @@ namespace ICSharpCode.SharpDevelop.Editor.CodeCompletion
openBracesToken = VBTokens.OpenCurlyBrace; openBracesToken = VBTokens.OpenCurlyBrace;
closeBracesToken = VBTokens.CloseCurlyBrace; closeBracesToken = VBTokens.CloseCurlyBrace;
statementEndToken = VBTokens.EOL; statementEndToken = VBTokens.EOL;
languageProperties = LanguageProperties.VBNet; languageProperties = LanguageProperties.VBNet;
} }
} }
public void InitializeOpenedInsightWindow(ITextEditor editor, IInsightWindow insightWindow) public void InitializeOpenedInsightWindow(ITextEditor editor, IInsightWindow insightWindow)
{ {
EventHandler<TextChangeEventArgs> onDocumentChanged = delegate { EventHandler<TextChangeEventArgs> onDocumentChanged = delegate {
@ -83,14 +83,14 @@ namespace ICSharpCode.SharpDevelop.Editor.CodeCompletion
insightWindow.DocumentChanged += onDocumentChanged; insightWindow.DocumentChanged += onDocumentChanged;
onDocumentChanged(null, null); onDocumentChanged(null, null);
} }
void MarkInsightWindowEndOffset(IInsightWindow insightWindow, ITextEditor editor, Location endLocation) void MarkInsightWindowEndOffset(IInsightWindow insightWindow, ITextEditor editor, Location endLocation)
{ {
insightWindow.EndOffset = editor.Document.PositionToOffset(endLocation.Line, endLocation.Column); insightWindow.EndOffset = editor.Document.PositionToOffset(endLocation.Line, endLocation.Column);
if (editor.Caret.Offset > insightWindow.EndOffset) if (editor.Caret.Offset > insightWindow.EndOffset)
insightWindow.Close(); insightWindow.Close();
} }
class InspectedCall class InspectedCall
{ {
/// <summary> /// <summary>
@ -105,14 +105,14 @@ namespace ICSharpCode.SharpDevelop.Editor.CodeCompletion
/// reference back to parent call - used to create a stack of inspected calls /// reference back to parent call - used to create a stack of inspected calls
/// </summary> /// </summary>
internal InspectedCall parent; internal InspectedCall parent;
public InspectedCall(Location start, InspectedCall parent) public InspectedCall(Location start, InspectedCall parent)
{ {
this.start = start; this.start = start;
this.parent = parent; this.parent = parent;
} }
} }
int LocationToOffset(ITextEditor editor, Location loc) int LocationToOffset(ITextEditor editor, Location loc)
{ {
if (loc.IsEmpty || loc.Line > editor.Document.TotalNumberOfLines) if (loc.IsEmpty || loc.Line > editor.Document.TotalNumberOfLines)
@ -120,7 +120,7 @@ namespace ICSharpCode.SharpDevelop.Editor.CodeCompletion
IDocumentLine seg = editor.Document.GetLine(loc.Line); IDocumentLine seg = editor.Document.GetLine(loc.Line);
return seg.Offset + Math.Min(loc.Column, seg.Length) - 1; return seg.Offset + Math.Min(loc.Column, seg.Length) - 1;
} }
IList<ResolveResult> ResolveCallParameters(ITextEditor editor, InspectedCall call) IList<ResolveResult> ResolveCallParameters(ITextEditor editor, InspectedCall call)
{ {
List<ResolveResult> rr = new List<ResolveResult>(); List<ResolveResult> rr = new List<ResolveResult>();
@ -129,22 +129,20 @@ namespace ICSharpCode.SharpDevelop.Editor.CodeCompletion
int newOffset; int newOffset;
foreach (Location loc in call.commas) { foreach (Location loc in call.commas) {
newOffset = LocationToOffset(editor, loc); newOffset = LocationToOffset(editor, loc);
if (newOffset < 0) break; if (newOffset < 0)
string text = editor.Document.GetText(offset+1,newOffset-(offset+1)); break;
string text = editor.Document.GetText(offset + 1, newOffset - (offset + 1));
rr.Add(ParserService.Resolve(new ExpressionResult(text), loc.Line, loc.Column, editor.FileName, documentText)); rr.Add(ParserService.Resolve(new ExpressionResult(text), loc.Line, loc.Column, editor.FileName, documentText));
} }
// the last argument is between the last comma and the caret position // the last argument is between the last comma and the caret position
newOffset = editor.Caret.Offset; newOffset = editor.Caret.Offset;
if (offset < newOffset) { if (offset < newOffset) {
string text = editor.Document.GetText(offset+1,newOffset-(offset+1)); string text = editor.Document.GetText(offset + 1, newOffset - (offset + 1));
rr.Add(ParserService.Resolve(new ExpressionResult(text), rr.Add(ParserService.Resolve(new ExpressionResult(text), editor.Caret.Line, editor.Caret.Column, editor.FileName, documentText));
editor.Caret.Line,
editor.Caret.Column,
editor.FileName, documentText));
} }
return rr; return rr;
} }
public bool InsightRefreshOnComma(ITextEditor editor, char ch) public bool InsightRefreshOnComma(ITextEditor editor, char ch)
{ {
// Show MethodInsightWindow or IndexerInsightWindow // Show MethodInsightWindow or IndexerInsightWindow
@ -157,10 +155,7 @@ namespace ICSharpCode.SharpDevelop.Editor.CodeCompletion
Token token; Token token;
InspectedCall call = new InspectedCall(Location.Empty, null); InspectedCall call = new InspectedCall(Location.Empty, null);
call.parent = call; call.parent = call;
while ((token = lexer.NextToken()) != null while ((token = lexer.NextToken()) != null && token.Kind != eofToken && token.Location < cursorLocation) {
&& token.Kind != eofToken
&& token.Location < cursorLocation)
{
if (token.Kind == commaToken) { if (token.Kind == commaToken) {
call.commas.Add(token.Location); call.commas.Add(token.Location);
} else if (token.Kind == openParensToken || token.Kind == openBracketToken || token.Kind == openBracesToken) { } else if (token.Kind == openParensToken || token.Kind == openBracketToken || token.Kind == openBracesToken) {
@ -175,10 +170,7 @@ namespace ICSharpCode.SharpDevelop.Editor.CodeCompletion
if (c == '(' || c == '[') { if (c == '(' || c == '[') {
var insightProvider = new MethodInsightProvider { LookupOffset = offset }; var insightProvider = new MethodInsightProvider { LookupOffset = offset };
var insightItems = insightProvider.ProvideInsight(editor); var insightItems = insightProvider.ProvideInsight(editor);
ShowInsight(editor, ShowInsight(editor, insightItems, ResolveCallParameters(editor, call), ch);
insightItems,
ResolveCallParameters(editor, call),
ch);
return true; return true;
} else { } else {
Core.LoggingService.Warn("Expected '(' or '[' at start position"); Core.LoggingService.Warn("Expected '(' or '[' at start position");
@ -188,7 +180,7 @@ namespace ICSharpCode.SharpDevelop.Editor.CodeCompletion
} }
return false; return false;
} }
IMethodOrProperty GetMethodFromInsightItem(IInsightItem item) IMethodOrProperty GetMethodFromInsightItem(IInsightItem item)
{ {
MethodInsightItem mii = item as MethodInsightItem; MethodInsightItem mii = item as MethodInsightItem;
@ -198,7 +190,7 @@ namespace ICSharpCode.SharpDevelop.Editor.CodeCompletion
return null; return null;
} }
} }
void ShowInsight(ITextEditor editor, IList<IInsightItem> insightItems, ICollection<ResolveResult> parameters, char charTyped) void ShowInsight(ITextEditor editor, IList<IInsightItem> insightItems, ICollection<ResolveResult> parameters, char charTyped)
{ {
int paramCount = parameters.Count; int paramCount = parameters.Count;
@ -219,8 +211,7 @@ namespace ICSharpCode.SharpDevelop.Editor.CodeCompletion
} }
i++; i++;
} }
IMethodOrProperty result = Dom.CSharp.OverloadResolution.FindOverload( IMethodOrProperty result = Dom.CSharp.OverloadResolution.FindOverload(methods.Where(m => m != null), argumentTypes, true, false, out overloadIsSure);
methods.Where(m => m != null), argumentTypes, true, false, out overloadIsSure);
defaultIndex = methods.IndexOf(result); defaultIndex = methods.IndexOf(result);
} }
IInsightWindow insightWindow = editor.ShowInsightWindow(insightItems); IInsightWindow insightWindow = editor.ShowInsightWindow(insightItems);
@ -236,16 +227,21 @@ namespace ICSharpCode.SharpDevelop.Editor.CodeCompletion
} }
} }
} }
// TODO : remove this code duplication!
// see NRefactoryCodeCompletionBinding
bool ProvideContextCompletion(ITextEditor editor, IReturnType expected, char charTyped) bool ProvideContextCompletion(ITextEditor editor, IReturnType expected, char charTyped)
{ {
if (expected == null) return false; if (expected == null)
return false;
IClass c = expected.GetUnderlyingClass(); IClass c = expected.GetUnderlyingClass();
if (c == null) return false; if (c == null)
return false;
if (c.ClassType == ClassType.Enum) { if (c.ClassType == ClassType.Enum) {
CtrlSpaceCompletionItemProvider cdp = new NRefactoryCtrlSpaceCompletionItemProvider(languageProperties); CtrlSpaceCompletionItemProvider cdp = new NRefactoryCtrlSpaceCompletionItemProvider(languageProperties);
var ctrlSpaceList = cdp.GenerateCompletionList(editor); var ctrlSpaceList = cdp.GenerateCompletionList(editor);
if (ctrlSpaceList == null) return false; if (ctrlSpaceList == null)
return false;
ContextCompletionItemList contextList = new ContextCompletionItemList(); ContextCompletionItemList contextList = new ContextCompletionItemList();
contextList.Items.AddRange(ctrlSpaceList.Items); contextList.Items.AddRange(ctrlSpaceList.Items);
contextList.activationKey = charTyped; contextList.activationKey = charTyped;
@ -257,18 +253,19 @@ namespace ICSharpCode.SharpDevelop.Editor.CodeCompletion
} }
} }
if (contextList.SuggestedItem != null) { if (contextList.SuggestedItem != null) {
if (charTyped != ' ') contextList.InsertSpace = true; if (charTyped != ' ')
contextList.InsertSpace = true;
editor.ShowCompletionWindow(contextList); editor.ShowCompletionWindow(contextList);
return true; return true;
} }
} }
return false; return false;
} }
class ContextCompletionItemList : DefaultCompletionItemList class ContextCompletionItemList : DefaultCompletionItemList
{ {
internal char activationKey; internal char activationKey;
public override CompletionItemListKeyResult ProcessInput(char key) public override CompletionItemListKeyResult ProcessInput(char key)
{ {
if (key == '=' && activationKey == '=') if (key == '=' && activationKey == '=')
Loading…
Cancel
Save