30
30
using MonoDevelop.Projects;
31
31
using MonoDevelop.Projects.Gui.Completion;
32
using MonoDevelop.Projects.Parser;
33
using MonoDevelop.Projects.Ambience;
32
using MonoDevelop.Projects.Dom;
33
using MonoDevelop.Projects.Dom.Output;
34
using MonoDevelop.Projects.Dom.Parser;
34
35
using MonoDevelop.Components.Commands;
35
36
using MonoDevelop.Ide.Commands;
37
using MonoDevelop.Core;
37
39
namespace MonoDevelop.Ide.Gui.Content
41
43
CodeCompletionContext currentCompletionContext;
42
44
ICompletionWidget completionWidget;
43
45
bool autoHideCompletionWindow = true;
46
bool enableCodeCompletion = false;
45
48
// When a key is pressed, and before the key is processed by the editor, this method will be invoked.
46
49
// Return true if the key press should be processed by the editor.
47
public override bool KeyPress (Gdk.Key key, Gdk.ModifierType modifier)
50
public override bool KeyPress (Gdk.Key key, char keyChar, Gdk.ModifierType modifier)
52
55
autoHideCompletionWindow = false;
53
56
if (CompletionWindowManager.ProcessKeyEvent (key, modifier)) {
54
57
autoHideCompletionWindow = true;
57
60
autoHideCompletionWindow = false;
60
63
if (ParameterInformationWindowManager.IsWindowVisible) {
61
64
if (ParameterInformationWindowManager.ProcessKeyEvent (key, modifier))
63
66
autoHideCompletionWindow = false;
66
res = base.KeyPress (key, modifier);
69
res = base.KeyPress (key, keyChar, modifier);
70
if ((modifier & Gdk.ModifierType.ControlMask) == Gdk.ModifierType.ControlMask)
73
if (!enableCodeCompletion)
68
76
// Handle code completion
70
78
if (completionWidget != null && currentCompletionContext == null) {
71
79
currentCompletionContext = completionWidget.CreateCodeCompletionContext (Editor.CursorPosition);
72
ICompletionDataProvider cp = HandleCodeCompletion (currentCompletionContext, (char)(uint)key);
75
CompletionWindowManager.ShowWindow ((char)(uint)key, cp, completionWidget, currentCompletionContext, OnCompletionWindowClosed);
81
int triggerWordLength = currentCompletionContext.TriggerWordLength;
82
ICompletionDataList completionList = HandleCodeCompletion (currentCompletionContext, keyChar,
83
ref triggerWordLength);
85
if (triggerWordLength > 0 && (triggerWordLength < Editor.CursorPosition
86
|| (triggerWordLength == 1 && Editor.CursorPosition == 1)))
88
currentCompletionContext
89
= completionWidget.CreateCodeCompletionContext (Editor.CursorPosition - triggerWordLength);
90
currentCompletionContext.TriggerWordLength = triggerWordLength;
93
if (completionList != null) {
94
if (!CompletionWindowManager.ShowWindow (keyChar, completionList, completionWidget,
95
currentCompletionContext, OnCompletionWindowClosed))
96
currentCompletionContext = null;
77
98
currentCompletionContext = null;
80
102
// Handle parameter completion
82
if (ParameterInformationWindowManager.IsWindowVisible)
104
if (ParameterInformationWindowManager.IsWindowVisible) {
105
ParameterInformationWindowManager.CurrentCodeCompletionContext = Editor.CurrentCodeCompletionContext;
83
106
ParameterInformationWindowManager.PostProcessKeyEvent (key, modifier);
85
109
if (completionWidget != null) {
86
110
ICodeCompletionContext ctx = completionWidget.CreateCodeCompletionContext (Editor.CursorPosition);
87
IParameterDataProvider paramProvider = HandleParameterCompletion (ctx, (char)(uint)key);
111
IParameterDataProvider paramProvider = HandleParameterCompletion (ctx, keyChar);
88
112
if (paramProvider != null)
89
113
ParameterInformationWindowManager.ShowWindow (ctx, paramProvider);
121
protected void ShowCompletion (ICompletionDataList completionList, int triggerWordLength, char keyChar)
123
if (completionWidget != null && currentCompletionContext == null) {
124
currentCompletionContext = completionWidget.CreateCodeCompletionContext (Editor.CursorPosition);
125
if (triggerWordLength > 0 && triggerWordLength < Editor.CursorPosition) {
126
currentCompletionContext =
127
completionWidget.CreateCodeCompletionContext (Editor.CursorPosition - triggerWordLength);
128
currentCompletionContext.TriggerWordLength = triggerWordLength;
130
if (completionList != null)
131
CompletionWindowManager.ShowWindow (keyChar, completionList, completionWidget,
132
currentCompletionContext, OnCompletionWindowClosed);
134
currentCompletionContext = null;
136
autoHideCompletionWindow = true;
97
139
void OnCompletionWindowClosed ()
99
141
currentCompletionContext = null;
132
174
currentCompletionContext = completionWidget.CreateCodeCompletionContext (cpos);
133
175
currentCompletionContext.TriggerWordLength = wlen;
134
cp = CodeCompletionCommand (currentCompletionContext);
176
completionList = CodeCompletionCommand (currentCompletionContext);
137
CompletionWindowManager.ShowWindow ((char)0, cp, completionWidget, currentCompletionContext, OnCompletionWindowClosed);
178
if (completionList != null)
179
CompletionWindowManager.ShowWindow ((char)0, completionList, completionWidget,
180
currentCompletionContext, OnCompletionWindowClosed);
139
182
currentCompletionContext = null;
163
208
return (completionWidget != null && !ParameterInformationWindowManager.IsWindowVisible);
166
public virtual ICompletionDataProvider HandleCodeCompletion (ICodeCompletionContext completionContext, char completionChar)
212
public virtual ICompletionDataList HandleCodeCompletion (ICodeCompletionContext completionContext,
213
char completionChar, ref int triggerWordLength)
215
return HandleCodeCompletion (completionContext, completionChar);
218
public virtual ICompletionDataList HandleCodeCompletion (ICodeCompletionContext completionContext,
215
268
int pos = completionContext.TriggerOffset;
216
269
string txt = Editor.GetText (pos - 1, pos);
217
270
if (txt.Length > 0) {
218
ICompletionDataProvider cp = HandleCodeCompletion (completionContext, txt[0]);
271
ICompletionDataList completionList = HandleCodeCompletion (completionContext, txt[0]);
272
if (completionList != null)
273
return completionList;
223
276
// If there is a parser context, try resolving by calling CtrlSpace.
224
IParserContext ctx = GetParserContext();
277
ProjectDom ctx = GetParserContext();
225
278
if (ctx != null) {
226
CodeCompletionDataProvider completionProvider = new CodeCompletionDataProvider (ctx, GetAmbience ());
227
completionProvider.AddResolveResults (ctx.CtrlSpace (completionContext.TriggerLine + 1, completionContext.TriggerLineOffset + 1, FileName), true, SimpleTypeNameResolver.Instance);
228
if (!completionProvider.IsEmpty)
229
return completionProvider;
280
//CodeCompletionDataProvider completionProvider = new CodeCompletionDataProvider (ctx, GetAmbience ());
281
//completionProvider.AddResolveResults (ctx.CtrlSpace (completionContext.TriggerLine + 1,
282
// completionContext.TriggerLineOffset + 1, FileName), true, SimpleTypeNameResolver.Instance);
283
// if (!completionProvider.IsEmpty)
284
// return completionProvider;
251
306
base.Initialize ();
308
enableCodeCompletion = (bool)PropertyService.Get ("EnableCodeCompletion", true);
309
PropertyService.PropertyChanged += OnPropertyUpdated;
253
310
completionWidget = Document.GetContent <ICompletionWidget> ();
254
311
if (completionWidget != null)
255
312
completionWidget.CompletionContextChanged += OnCompletionContextChanged;
316
public override void Dispose ()
320
PropertyService.PropertyChanged -= OnPropertyUpdated;
325
void OnPropertyUpdated (object sender, PropertyChangedEventArgs e)
327
if (e.Key == "EnableCodeCompletion" && e.NewValue != e.OldValue)
328
enableCodeCompletion = (bool)e.NewValue;
331
public interface ITypeNameResolver
333
string ResolveName (string typeName);
259
335
class SimpleTypeNameResolver: ITypeNameResolver
261
337
// This simple resolver removes the namespace from all class names.