diff --git a/src/AddIns/Debugger/Debugger.AddIn/Pads/ConsolePad.cs b/src/AddIns/Debugger/Debugger.AddIn/Pads/ConsolePad.cs
index 319c275985..763f0da641 100644
--- a/src/AddIns/Debugger/Debugger.AddIn/Pads/ConsolePad.cs
+++ b/src/AddIns/Debugger/Debugger.AddIn/Pads/ConsolePad.cs
@@ -5,17 +5,21 @@
// $Revision$
//
-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
public class ConsolePad : AbstractConsolePad
{
SupportedLanguage language;
+ NRefactoryResolver resolver;
const string debuggerConsoleToolBarTreePath = "/SharpDevelop/Pads/ConsolePad/ToolBar";
@@ -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
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);
diff --git a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/AvalonEdit.AddIn.csproj b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/AvalonEdit.AddIn.csproj
index ec0cd2f2be..09f7888d11 100644
--- a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/AvalonEdit.AddIn.csproj
+++ b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/AvalonEdit.AddIn.csproj
@@ -86,6 +86,7 @@
ChooseEncodingDialog.xaml
Code
+
diff --git a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/AvalonEditorControlService.cs b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/AvalonEditorControlService.cs
index bbd90cbfb1..9e1a5e7b98 100644
--- a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/AvalonEditorControlService.cs
+++ b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/AvalonEditorControlService.cs
@@ -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);
}
}
}
diff --git a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/CodeCompletionEditorAdapter.cs b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/CodeCompletionEditorAdapter.cs
new file mode 100644
index 0000000000..b8b5cd3114
--- /dev/null
+++ b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/CodeCompletionEditorAdapter.cs
@@ -0,0 +1,71 @@
+//
+//
+//
+//
+// $Revision: 5413 $
+//
+
+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 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; }
+ }
+ }
+}
diff --git a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/CodeEditor.cs b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/CodeEditor.cs
index f0132e621b..2f15f4bc0c 100644
--- a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/CodeEditor.cs
+++ b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/CodeEditor.cs
@@ -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
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
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
}
}
- 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 {
diff --git a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/CodeEditorAdapter.cs b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/CodeEditorAdapter.cs
index 058c93f14c..7a6ad1ef17 100644
--- a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/CodeEditorAdapter.cs
+++ b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/CodeEditorAdapter.cs
@@ -24,7 +24,7 @@ namespace ICSharpCode.AvalonEdit.AddIn
///
/// Wraps the CodeEditor class to provide the ITextEditor interface.
///
- sealed class CodeEditorAdapter : AvalonEditTextEditorAdapter
+ sealed class CodeEditorAdapter : CodeCompletionEditorAdapter
{
readonly CodeEditor codeEditor;
@@ -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
// 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 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 GetSnippets()
{
CodeSnippetGroup g = SnippetManager.Instance.FindGroup(Path.GetExtension(this.FileName));
diff --git a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/SharpDevelopTextEditor.cs b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/SharpDevelopTextEditor.cs
index 8c419bdb5c..905d717f55 100755
--- a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/SharpDevelopTextEditor.cs
+++ b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/SharpDevelopTextEditor.cs
@@ -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
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)
{
diff --git a/src/Main/Base/Project/Src/Editor/CodeCompletion/CodeCompletionItemProvider.cs b/src/Main/Base/Project/Src/Editor/CodeCompletion/CodeCompletionItemProvider.cs
index 5033fdc93d..a99d83c178 100644
--- a/src/Main/Base/Project/Src/Editor/CodeCompletion/CodeCompletionItemProvider.cs
+++ b/src/Main/Base/Project/Src/Editor/CodeCompletion/CodeCompletionItemProvider.cs
@@ -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);
diff --git a/src/Main/Base/Project/Src/Gui/Pads/AbstractConsolePad.cs b/src/Main/Base/Project/Src/Gui/Pads/AbstractConsolePad.cs
index a6b30a31c8..832a42c658 100755
--- a/src/Main/Base/Project/Src/Gui/Pads/AbstractConsolePad.cs
+++ b/src/Main/Base/Project/Src/Gui/Pads/AbstractConsolePad.cs
@@ -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
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
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
}
}
- 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
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
public ITextEditor TextEditor {
get {
- return new AvalonEditTextEditorAdapter(editor);
+ return editorAdapter;
}
}
@@ -305,6 +317,10 @@ namespace ICSharpCode.SharpDevelop.Gui
readOnlyRegion.EndOffset = editor.Document.TextLength;
}
+ public int CommandOffset {
+ get { return readOnlyRegion.EndOffset; }
+ }
+
///
/// Gets/sets the command text displayed at the command prompt.
///