Browse Source

implemented basic code completion in Console pad

git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/trunk@6228 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61
pull/1/head
Siegfried Pammer 15 years ago
parent
commit
6f675509cd
  1. 57
      src/AddIns/Debugger/Debugger.AddIn/Pads/ConsolePad.cs
  2. 1
      src/AddIns/DisplayBindings/AvalonEdit.AddIn/AvalonEdit.AddIn.csproj
  3. 13
      src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/AvalonEditorControlService.cs
  4. 71
      src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/CodeCompletionEditorAdapter.cs
  5. 90
      src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/CodeEditor.cs
  6. 43
      src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/CodeEditorAdapter.cs
  7. 58
      src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/SharpDevelopTextEditor.cs
  8. 3
      src/Main/Base/Project/Src/Editor/CodeCompletion/CodeCompletionItemProvider.cs
  9. 70
      src/Main/Base/Project/Src/Gui/Pads/AbstractConsolePad.cs

57
src/AddIns/Debugger/Debugger.AddIn/Pads/ConsolePad.cs

@ -5,17 +5,21 @@ @@ -5,17 +5,21 @@
// <version>$Revision$</version>
// </file>
using ICSharpCode.NRefactory.Visitors;
using System;
using System.Collections;
using System.Windows.Controls;
using System.Windows.Input;
using Debugger;
using Debugger.AddIn;
using ICSharpCode.Core;
using ICSharpCode.Core.Presentation;
using ICSharpCode.NRefactory;
using ICSharpCode.NRefactory.Visitors;
using ICSharpCode.SharpDevelop;
using ICSharpCode.SharpDevelop.Debugging;
using ICSharpCode.SharpDevelop.Dom;
using ICSharpCode.SharpDevelop.Dom.NRefactoryResolver;
using ICSharpCode.SharpDevelop.Editor.CodeCompletion;
using ICSharpCode.SharpDevelop.Services;
namespace ICSharpCode.SharpDevelop.Gui.Pads
@ -23,6 +27,7 @@ namespace ICSharpCode.SharpDevelop.Gui.Pads @@ -23,6 +27,7 @@ namespace ICSharpCode.SharpDevelop.Gui.Pads
public class ConsolePad : AbstractConsolePad
{
SupportedLanguage language;
NRefactoryResolver resolver;
const string debuggerConsoleToolBarTreePath = "/SharpDevelop/Pads/ConsolePad/ToolBar";
@ -77,30 +82,25 @@ namespace ICSharpCode.SharpDevelop.Gui.Pads @@ -77,30 +82,25 @@ namespace ICSharpCode.SharpDevelop.Gui.Pads
protected override void InitializeConsole()
{
base.InitializeConsole();
switch (SelectedLanguage) {
case SupportedLanguage.CSharp:
SetHighlighting("C#");
break;
case SupportedLanguage.VBNet:
SetHighlighting("VBNET");
break;
}
OnLanguageChanged();
}
void OnLanguageChanged()
{
switch (SelectedLanguage) {
case SupportedLanguage.CSharp:
resolver = new NRefactoryResolver(LanguageProperties.CSharp);
SetHighlighting("C#");
break;
case SupportedLanguage.VBNet:
resolver = new NRefactoryResolver(LanguageProperties.VBNet);
SetHighlighting("VBNET");
break;
}
}
public ConsolePad()
{
{
WindowsDebugger debugger = (WindowsDebugger)DebuggerService.CurrentDebugger;
debugger.ProcessSelected += delegate(object sender, ProcessEventArgs e) {
@ -109,6 +109,43 @@ namespace ICSharpCode.SharpDevelop.Gui.Pads @@ -109,6 +109,43 @@ namespace ICSharpCode.SharpDevelop.Gui.Pads
this.Process = debugger.DebuggedProcess;
}
protected override void AbstractConsolePadTextEntered(object sender, TextCompositionEventArgs e)
{
if (this.process == null || this.process.IsRunning)
return;
if (this.process.SelectedStackFrame == null || this.process.SelectedStackFrame.NextStatement == null)
return;
foreach (char ch in e.Text) {
if (ch == '.') {
ShowDotCompletion(console.CommandText);
}
}
}
void ShowDotCompletion(string currentText)
{
var seg = process.SelectedStackFrame.NextStatement;
var expressionFinder = ParserService.GetExpressionFinder(seg.Filename);
var info = ParserService.GetParseInformation(seg.Filename);
string text = ParserService.GetParseableFileContent(seg.Filename).Text;
int currentOffset = TextEditor.Caret.Offset - console.CommandOffset - 1;
var expr = expressionFinder.FindExpression(currentText, currentOffset);
expr.Region = new DomRegion(seg.StartLine, seg.StartColumn, seg.EndLine, seg.EndColumn);
var rr = resolver.Resolve(expr, info, text);
if (rr != null) {
TextEditor.ShowCompletionWindow(new DotCodeCompletionItemProvider().GenerateCompletionListForResolveResult(rr, expr.Context));
}
}
protected override ToolBar BuildToolBar()
{
return ToolBarService.CreateToolBar(this, debuggerConsoleToolBarTreePath);

1
src/AddIns/DisplayBindings/AvalonEdit.AddIn/AvalonEdit.AddIn.csproj

@ -86,6 +86,7 @@ @@ -86,6 +86,7 @@
<DependentUpon>ChooseEncodingDialog.xaml</DependentUpon>
<SubType>Code</SubType>
</Compile>
<Compile Include="Src\CodeCompletionEditorAdapter.cs" />
<Compile Include="Src\CodeEditor.cs" />
<Compile Include="Src\CodeEditorAdapter.cs" />
<Compile Include="Src\CodeEditorView.cs" />

13
src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/AvalonEditorControlService.cs

@ -26,18 +26,7 @@ namespace ICSharpCode.AvalonEdit.AddIn @@ -26,18 +26,7 @@ namespace ICSharpCode.AvalonEdit.AddIn
{
SharpDevelopTextEditor editor = new SharpDevelopTextEditor();
control = editor;
return new EditorAdapter(editor);
}
sealed class EditorAdapter : AvalonEditTextEditorAdapter
{
public EditorAdapter(SharpDevelopTextEditor editor) : base(editor)
{
}
public override ITextEditorOptions Options {
get { return CodeEditorOptions.Instance; }
}
return new CodeCompletionEditorAdapter(editor);
}
}
}

71
src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/CodeCompletionEditorAdapter.cs

@ -0,0 +1,71 @@ @@ -0,0 +1,71 @@
// <file>
// <copyright see="prj:///doc/copyright.txt"/>
// <license see="prj:///doc/license.txt"/>
// <author name="Daniel Grunwald"/>
// <version>$Revision: 5413 $</version>
// </file>
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using ICSharpCode.AvalonEdit.AddIn.Options;
using ICSharpCode.AvalonEdit.AddIn.Snippets;
using ICSharpCode.AvalonEdit.Indentation;
using ICSharpCode.Core;
using ICSharpCode.SharpDevelop;
using ICSharpCode.SharpDevelop.Editor;
using ICSharpCode.SharpDevelop.Editor.AvalonEdit;
using ICSharpCode.SharpDevelop.Editor.CodeCompletion;
namespace ICSharpCode.AvalonEdit.AddIn
{
class CodeCompletionEditorAdapter : AvalonEditTextEditorAdapter
{
SharpDevelopTextEditor textEditor;
public CodeCompletionEditorAdapter(SharpDevelopTextEditor textEditor)
: base(textEditor)
{
this.textEditor = textEditor;
}
public override ICompletionListWindow ShowCompletionWindow(ICompletionItemList data)
{
if (data == null || !data.Items.Any())
return null;
SharpDevelopCompletionWindow window = new SharpDevelopCompletionWindow(this, this.TextEditor.TextArea, data);
textEditor.ShowCompletionWindow(window);
return window;
}
public override IInsightWindow ShowInsightWindow(IEnumerable<IInsightItem> items)
{
if (items == null)
return null;
var insightWindow = new SharpDevelopInsightWindow(this.TextEditor.TextArea);
insightWindow.Items.AddRange(items);
if (insightWindow.Items.Count > 0) {
insightWindow.SelectedItem = insightWindow.Items[0];
} else {
// don't open insight window when there are no items
return null;
}
textEditor.ShowInsightWindow(insightWindow);
return insightWindow;
}
public override IInsightWindow ActiveInsightWindow {
get { return textEditor.ActiveInsightWindow; }
}
public override ICompletionListWindow ActiveCompletionWindow {
get { return textEditor.ActiveCompletionWindow; }
}
public override ITextEditorOptions Options {
get { return CodeEditorOptions.Instance; }
}
}
}

90
src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/CodeEditor.cs

@ -368,10 +368,24 @@ namespace ICSharpCode.AvalonEdit.AddIn @@ -368,10 +368,24 @@ namespace ICSharpCode.AvalonEdit.AddIn
}
}
SharpDevelopCompletionWindow CompletionWindow {
get {
return primaryTextEditor.ActiveCompletionWindow
?? (secondaryTextEditor == null ? null : secondaryTextEditor.ActiveCompletionWindow);
}
}
SharpDevelopInsightWindow InsightWindow {
get {
return primaryTextEditor.ActiveInsightWindow
?? (secondaryTextEditor == null ? null : secondaryTextEditor.ActiveInsightWindow);
}
}
void TextAreaTextEntering(object sender, TextCompositionEventArgs e)
{
// don't start new code completion if there is still a completion window open
if (completionWindow != null)
if (CompletionWindow != null)
return;
if (e.Handled)
@ -383,19 +397,19 @@ namespace ICSharpCode.AvalonEdit.AddIn @@ -383,19 +397,19 @@ namespace ICSharpCode.AvalonEdit.AddIn
foreach (ICodeCompletionBinding cc in CodeCompletionBindings) {
CodeCompletionKeyPressResult result = cc.HandleKeyPress(adapter, c);
if (result == CodeCompletionKeyPressResult.Completed) {
if (completionWindow != null) {
if (CompletionWindow != null) {
// a new CompletionWindow was shown, but does not eat the input
// tell it to expect the text insertion
completionWindow.ExpectInsertionBeforeStart = true;
CompletionWindow.ExpectInsertionBeforeStart = true;
}
if (insightWindow != null) {
insightWindow.ExpectInsertionBeforeStart = true;
if (InsightWindow != null) {
InsightWindow.ExpectInsertionBeforeStart = true;
}
return;
} else if (result == CodeCompletionKeyPressResult.CompletedIncludeKeyInCompletion) {
if (completionWindow != null) {
if (completionWindow.StartOffset == completionWindow.EndOffset) {
completionWindow.CloseWhenCaretAtBeginning = true;
if (CompletionWindow != null) {
if (CompletionWindow.StartOffset == CompletionWindow.EndOffset) {
CompletionWindow.CloseWhenCaretAtBeginning = true;
}
}
return;
@ -450,7 +464,8 @@ namespace ICSharpCode.AvalonEdit.AddIn @@ -450,7 +464,8 @@ namespace ICSharpCode.AvalonEdit.AddIn
void OnCodeCompletion(object sender, ExecutedRoutedEventArgs e)
{
CloseExistingCompletionWindow();
if (CompletionWindow != null)
CompletionWindow.Close();
CodeEditorView textEditor = GetTextEditorFromSender(sender);
foreach (ICodeCompletionBinding cc in CodeCompletionBindings) {
if (cc.CtrlSpace(textEditor.Adapter)) {
@ -460,63 +475,6 @@ namespace ICSharpCode.AvalonEdit.AddIn @@ -460,63 +475,6 @@ namespace ICSharpCode.AvalonEdit.AddIn
}
}
SharpDevelopCompletionWindow completionWindow;
SharpDevelopInsightWindow insightWindow;
void CloseExistingCompletionWindow()
{
if (completionWindow != null) {
completionWindow.Close();
}
}
void CloseExistingInsightWindow()
{
if (insightWindow != null) {
insightWindow.Close();
}
}
public SharpDevelopCompletionWindow ActiveCompletionWindow {
get { return completionWindow; }
}
public SharpDevelopInsightWindow ActiveInsightWindow {
get { return insightWindow; }
}
internal void ShowCompletionWindow(SharpDevelopCompletionWindow window)
{
CloseExistingCompletionWindow();
completionWindow = window;
window.Closed += delegate {
completionWindow = null;
};
Dispatcher.BeginInvoke(DispatcherPriority.Normal, new Action(
delegate {
if (completionWindow == window) {
window.Show();
}
}
));
}
internal void ShowInsightWindow(SharpDevelopInsightWindow window)
{
CloseExistingInsightWindow();
insightWindow = window;
window.Closed += delegate {
insightWindow = null;
};
Dispatcher.BeginInvoke(DispatcherPriority.Normal, new Action(
delegate {
if (insightWindow == window) {
window.Show();
}
}
));
}
public IHighlightingDefinition SyntaxHighlighting {
get { return primaryTextEditor.SyntaxHighlighting; }
set {

43
src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/CodeEditorAdapter.cs

@ -24,7 +24,7 @@ namespace ICSharpCode.AvalonEdit.AddIn @@ -24,7 +24,7 @@ namespace ICSharpCode.AvalonEdit.AddIn
/// <summary>
/// Wraps the CodeEditor class to provide the ITextEditor interface.
/// </summary>
sealed class CodeEditorAdapter : AvalonEditTextEditorAdapter
sealed class CodeEditorAdapter : CodeCompletionEditorAdapter
{
readonly CodeEditor codeEditor;
@ -39,18 +39,14 @@ namespace ICSharpCode.AvalonEdit.AddIn @@ -39,18 +39,14 @@ namespace ICSharpCode.AvalonEdit.AddIn
get { return codeEditor.FileName; }
}
public override ICompletionListWindow ActiveCompletionWindow {
get { return codeEditor.ActiveCompletionWindow; }
}
ILanguageBinding languageBinding;
public override ILanguageBinding Language {
get { return languageBinding; }
}
public override ITextEditorOptions Options {
get { return CodeEditorOptions.Instance; }
public override ITextEditor PrimaryView {
get { return codeEditor.PrimaryTextEditorAdapter; }
}
internal void FileNameChanged()
@ -84,39 +80,6 @@ namespace ICSharpCode.AvalonEdit.AddIn @@ -84,39 +80,6 @@ namespace ICSharpCode.AvalonEdit.AddIn
// so we keep it enabled even when the option is set to false.
}
public override ICompletionListWindow ShowCompletionWindow(ICompletionItemList data)
{
if (data == null || !data.Items.Any())
return null;
SharpDevelopCompletionWindow window = new SharpDevelopCompletionWindow(this, this.TextEditor.TextArea, data);
codeEditor.ShowCompletionWindow(window);
return window;
}
public override IInsightWindow ShowInsightWindow(IEnumerable<IInsightItem> items)
{
if (items == null)
return null;
var insightWindow = new SharpDevelopInsightWindow(this.TextEditor.TextArea);
insightWindow.Items.AddRange(items);
if (insightWindow.Items.Count > 0) {
insightWindow.SelectedItem = insightWindow.Items[0];
} else {
// don't open insight window when there are no items
return null;
}
codeEditor.ShowInsightWindow(insightWindow);
return insightWindow;
}
public override IInsightWindow ActiveInsightWindow {
get { return codeEditor.ActiveInsightWindow; }
}
public override ITextEditor PrimaryView {
get { return codeEditor.PrimaryTextEditorAdapter; }
}
public override IEnumerable<ICompletionItem> GetSnippets()
{
CodeSnippetGroup g = SnippetManager.Instance.FindGroup(Path.GetExtension(this.FileName));

58
src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/SharpDevelopTextEditor.cs

@ -19,6 +19,7 @@ using System.Windows.Data; @@ -19,6 +19,7 @@ using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Threading;
using ICSharpCode.AvalonEdit.AddIn.Options;
using ICSharpCode.AvalonEdit.AddIn.Snippets;
@ -64,6 +65,63 @@ namespace ICSharpCode.AvalonEdit.AddIn @@ -64,6 +65,63 @@ namespace ICSharpCode.AvalonEdit.AddIn
get { return "untitled"; }
}
SharpDevelopCompletionWindow completionWindow;
SharpDevelopInsightWindow insightWindow;
void CloseExistingCompletionWindow()
{
if (completionWindow != null) {
completionWindow.Close();
}
}
void CloseExistingInsightWindow()
{
if (insightWindow != null) {
insightWindow.Close();
}
}
public SharpDevelopCompletionWindow ActiveCompletionWindow {
get { return completionWindow; }
}
public SharpDevelopInsightWindow ActiveInsightWindow {
get { return insightWindow; }
}
internal void ShowCompletionWindow(SharpDevelopCompletionWindow window)
{
CloseExistingCompletionWindow();
completionWindow = window;
window.Closed += delegate {
completionWindow = null;
};
Dispatcher.BeginInvoke(DispatcherPriority.Normal, new Action(
delegate {
if (completionWindow == window) {
window.Show();
}
}
));
}
internal void ShowInsightWindow(SharpDevelopInsightWindow window)
{
CloseExistingInsightWindow();
insightWindow = window;
window.Closed += delegate {
insightWindow = null;
};
Dispatcher.BeginInvoke(DispatcherPriority.Normal, new Action(
delegate {
if (insightWindow == window) {
window.Show();
}
}
));
}
#region Printing
void OnPrint(object sender, ExecutedRoutedEventArgs e)
{

3
src/Main/Base/Project/Src/Editor/CodeCompletion/CodeCompletionItemProvider.cs

@ -356,6 +356,9 @@ namespace ICSharpCode.SharpDevelop.Editor.CodeCompletion @@ -356,6 +356,9 @@ namespace ICSharpCode.SharpDevelop.Editor.CodeCompletion
ResolveResult ResolveAtCurrentOffset(string className, CompletionContext context)
{
if (context.Editor.FileName == null)
return null;
var document = context.Editor.Document;
var position = document.OffsetToPosition(context.StartOffset);
return ParserService.Resolve(new ExpressionResult(className), position.Line, position.Column, context.Editor.FileName, document.Text);

70
src/Main/Base/Project/Src/Gui/Pads/AbstractConsolePad.cs

@ -27,7 +27,7 @@ namespace ICSharpCode.SharpDevelop.Gui @@ -27,7 +27,7 @@ namespace ICSharpCode.SharpDevelop.Gui
const string toolBarTreePath = "/SharpDevelop/Pads/CommonConsole/ToolBar";
DockPanel panel;
ConsoleControl console;
protected ConsoleControl console;
ToolBar toolbar;
bool cleared;
@ -53,8 +53,14 @@ namespace ICSharpCode.SharpDevelop.Gui @@ -53,8 +53,14 @@ namespace ICSharpCode.SharpDevelop.Gui
e.Handled = HandleInput(e.Key);
};
this.console.editor.TextArea.TextEntered += new TextCompositionEventHandler(AbstractConsolePadTextEntered);
this.InitializeConsole();
}
protected virtual void AbstractConsolePadTextEntered(object sender, TextCompositionEventArgs e)
{
}
protected virtual ToolBar BuildToolBar()
{
@ -151,31 +157,31 @@ namespace ICSharpCode.SharpDevelop.Gui @@ -151,31 +157,31 @@ namespace ICSharpCode.SharpDevelop.Gui
console.CommandText = "";
else
console.CommandText = this.history[this.historyPointer];
console.editor.ScrollToEnd();
return true;
case Key.Return:
if (Keyboard.Modifiers == ModifierKeys.Shift)
return false;
int caretOffset = this.console.TextEditor.Caret.Offset;
string commandText = console.CommandText;
cleared = false;
if (AcceptCommand(commandText)) {
IDocument document = console.TextEditor.Document;
if (!cleared) {
if (document.GetCharAt(document.TextLength - 1) != '\n')
document.Insert(document.TextLength, Environment.NewLine);
AppendPrompt();
console.TextEditor.Select(document.TextLength, 0);
} else {
console.CommandText = "";
}
cleared = false;
this.history.Add(commandText);
this.historyPointer = this.history.Count;
console.editor.ScrollToEnd();
return true;
}
return false;
case Key.Return:
if (Keyboard.Modifiers == ModifierKeys.Shift)
return false;
int caretOffset = this.console.TextEditor.Caret.Offset;
string commandText = console.CommandText;
cleared = false;
if (AcceptCommand(commandText)) {
IDocument document = console.TextEditor.Document;
if (!cleared) {
if (document.GetCharAt(document.TextLength - 1) != '\n')
document.Insert(document.TextLength, Environment.NewLine);
AppendPrompt();
console.TextEditor.Select(document.TextLength, 0);
} else {
console.CommandText = "";
}
cleared = false;
this.history.Add(commandText);
this.historyPointer = this.history.Count;
console.editor.ScrollToEnd();
return true;
}
return false;
default:
return false;
}
@ -254,9 +260,10 @@ namespace ICSharpCode.SharpDevelop.Gui @@ -254,9 +260,10 @@ namespace ICSharpCode.SharpDevelop.Gui
}
}
class ConsoleControl : Grid
public class ConsoleControl : Grid
{
internal AvalonEdit.TextEditor editor;
internal ITextEditor editorAdapter;
internal BeginReadOnlySectionProvider readOnlyRegion;
public ConsoleControl()
@ -264,9 +271,14 @@ namespace ICSharpCode.SharpDevelop.Gui @@ -264,9 +271,14 @@ namespace ICSharpCode.SharpDevelop.Gui
this.ColumnDefinitions.Add(new ColumnDefinition() { Width = new GridLength(1, GridUnitType.Star) });
this.RowDefinitions.Add(new RowDefinition() { Height = new GridLength(1, GridUnitType.Star) });
this.editor = Editor.AvalonEdit.AvalonEditTextEditorAdapter.CreateAvalonEditInstance();
object tmp;
this.editorAdapter = EditorControlService.CreateEditor(out tmp);
this.editor = (AvalonEdit.TextEditor)tmp;
this.editor.SetValue(Grid.ColumnProperty, 0);
this.editor.SetValue(Grid.RowProperty, 0);
this.editor.ShowLineNumbers = false;
this.Children.Add(editor);
@ -275,7 +287,7 @@ namespace ICSharpCode.SharpDevelop.Gui @@ -275,7 +287,7 @@ namespace ICSharpCode.SharpDevelop.Gui
public ITextEditor TextEditor {
get {
return new AvalonEditTextEditorAdapter(editor);
return editorAdapter;
}
}
@ -305,6 +317,10 @@ namespace ICSharpCode.SharpDevelop.Gui @@ -305,6 +317,10 @@ namespace ICSharpCode.SharpDevelop.Gui
readOnlyRegion.EndOffset = editor.Document.TextLength;
}
public int CommandOffset {
get { return readOnlyRegion.EndOffset; }
}
/// <summary>
/// Gets/sets the command text displayed at the command prompt.
/// </summary>

Loading…
Cancel
Save