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. ///