42
42
public class CompletionTextEditorExtension: TextEditorExtension
44
44
CodeCompletionContext currentCompletionContext;
45
ICompletionWidget completionWidget;
46
46
bool autoHideCompletionWindow = true;
47
47
bool enableCodeCompletion = false;
48
48
bool enableParameterInsight = false;
50
protected ICompletionWidget CompletionWidget {
52
return completionWidget;
50
public ICompletionWidget CompletionWidget {
56
55
public void ShowCompletion (ICompletionDataList completionList)
58
completionWidget = Document.GetContent <ICompletionWidget> ();
59
currentCompletionContext = completionWidget.CreateCodeCompletionContext (Document.TextEditorData.Caret.Offset);
57
currentCompletionContext = CompletionWidget.CreateCodeCompletionContext (Document.Editor.Caret.Offset);
61
59
if (!GetCompletionCommandOffset (out cpos, out wlen)) {
62
cpos = Document.TextEditorData.Caret.Offset;
60
cpos = Document.Editor.Caret.Offset;
65
63
currentCompletionContext.TriggerOffset = cpos;
66
64
currentCompletionContext.TriggerWordLength = wlen;
68
CompletionWindowManager.ShowWindow ('\0', completionList, completionWidget, currentCompletionContext, OnCompletionWindowClosed);
66
CompletionWindowManager.ShowWindow ('\0', completionList, CompletionWidget, currentCompletionContext, OnCompletionWindowClosed);
71
69
// When a key is pressed, and before the key is processed by the editor, this method will be invoked.
88
86
if (ParameterInformationWindowManager.IsWindowVisible) {
89
if (ParameterInformationWindowManager.ProcessKeyEvent (key, modifier))
87
if (ParameterInformationWindowManager.ProcessKeyEvent (CompletionWidget, key, modifier))
91
89
autoHideCompletionWindow = false;
104
102
// Handle parameter completion
105
103
if (ParameterInformationWindowManager.IsWindowVisible) {
106
ParameterInformationWindowManager.CurrentCodeCompletionContext = Editor.CurrentCodeCompletionContext;
107
ParameterInformationWindowManager.PostProcessKeyEvent (key, modifier);
104
ParameterInformationWindowManager.PostProcessKeyEvent (CompletionWidget, key, modifier);
110
107
if ((modifier & ignoreMods) != 0)
126
123
// Handle code completion
128
if (keyChar != '\0' && completionWidget != null && currentCompletionContext == null) {
129
currentCompletionContext = completionWidget.CreateCodeCompletionContext (Editor.CursorPosition);
125
if (keyChar != '\0' && CompletionWidget != null && currentCompletionContext == null) {
126
currentCompletionContext = CompletionWidget.CurrentCodeCompletionContext;
131
128
int triggerWordLength = currentCompletionContext.TriggerWordLength;
132
129
ICompletionDataList completionList = HandleCodeCompletion (currentCompletionContext, keyChar,
133
130
ref triggerWordLength);
135
if (triggerWordLength > 0 && (triggerWordLength < Editor.CursorPosition
136
|| (triggerWordLength == 1 && Editor.CursorPosition == 1)))
132
if (triggerWordLength > 0 && (triggerWordLength < Editor.Caret.Offset
133
|| (triggerWordLength == 1 && Editor.Caret.Offset == 1)))
138
135
currentCompletionContext
139
= completionWidget.CreateCodeCompletionContext (Editor.CursorPosition - triggerWordLength);
136
= CompletionWidget.CreateCodeCompletionContext (Editor.Caret.Offset - triggerWordLength);
140
137
currentCompletionContext.TriggerWordLength = triggerWordLength;
143
140
if (completionList != null) {
144
if (!CompletionWindowManager.ShowWindow (keyChar, completionList, completionWidget,
141
if (!CompletionWindowManager.ShowWindow (keyChar, completionList, CompletionWidget,
145
142
currentCompletionContext, OnCompletionWindowClosed))
146
143
currentCompletionContext = null;
152
if (enableParameterInsight && completionWidget != null) {
153
CodeCompletionContext ctx = completionWidget.CreateCodeCompletionContext (Editor.CursorPosition);
149
if (enableParameterInsight && CompletionWidget != null) {
150
CodeCompletionContext ctx = CompletionWidget.CurrentCodeCompletionContext;
154
151
IParameterDataProvider paramProvider = HandleParameterCompletion (ctx, keyChar);
155
152
if (paramProvider != null)
156
ParameterInformationWindowManager.ShowWindow (ctx, paramProvider);
153
ParameterInformationWindowManager.ShowWindow (CompletionWidget, ctx, paramProvider);
159
156
autoHideCompletionWindow = true;
164
161
protected void ShowCompletion (ICompletionDataList completionList, int triggerWordLength, char keyChar)
166
if (completionWidget != null && currentCompletionContext == null) {
167
currentCompletionContext = completionWidget.CreateCodeCompletionContext (Editor.CursorPosition);
168
if (triggerWordLength > 0 && triggerWordLength < Editor.CursorPosition) {
163
if (CompletionWidget != null && currentCompletionContext == null) {
164
currentCompletionContext = CompletionWidget.CurrentCodeCompletionContext;
165
if (triggerWordLength > 0 && triggerWordLength < Editor.Caret.Offset) {
169
166
currentCompletionContext =
170
completionWidget.CreateCodeCompletionContext (Editor.CursorPosition - triggerWordLength);
167
CompletionWidget.CreateCodeCompletionContext (Editor.Caret.Offset - triggerWordLength);
171
168
currentCompletionContext.TriggerWordLength = triggerWordLength;
173
170
if (completionList != null)
174
CompletionWindowManager.ShowWindow (keyChar, completionList, completionWidget,
171
CompletionWindowManager.ShowWindow (keyChar, completionList, CompletionWidget,
175
172
currentCompletionContext, OnCompletionWindowClosed);
177
174
currentCompletionContext = null;
184
181
currentCompletionContext = null;
187
void OnCompletionContextChanged (object o, EventArgs a)
184
protected void OnCompletionContextChanged (object o, EventArgs a)
189
186
if (autoHideCompletionWindow) {
190
187
CompletionWindowManager.HideWindow ();
191
ParameterInformationWindowManager.HideWindow ();
188
ParameterInformationWindowManager.HideWindow (CompletionWidget);
215
212
ICompletionDataList completionList = null;
217
214
if (!GetCompletionCommandOffset (out cpos, out wlen)) {
218
cpos = Editor.CursorPosition;
215
cpos = Editor.Caret.Offset;
221
currentCompletionContext = completionWidget.CreateCodeCompletionContext (cpos);
218
currentCompletionContext = CompletionWidget.CreateCodeCompletionContext (cpos);
222
219
currentCompletionContext.TriggerWordLength = wlen;
223
220
completionList = CodeCompletionCommand (currentCompletionContext);
225
222
if (completionList != null)
226
CompletionWindowManager.ShowWindow ((char)0, completionList, completionWidget,
223
CompletionWindowManager.ShowWindow ((char)0, completionList, CompletionWidget,
227
224
currentCompletionContext, OnCompletionWindowClosed);
229
226
currentCompletionContext = null;
235
232
ICompletionDataList completionList = null;
237
234
if (!GetCompletionCommandOffset (out cpos, out wlen)) {
238
cpos = Editor.CursorPosition;
235
cpos = Editor.Caret.Offset;
242
currentCompletionContext = completionWidget.CreateCodeCompletionContext (cpos);
239
currentCompletionContext = CompletionWidget.CreateCodeCompletionContext (cpos);
243
240
currentCompletionContext.TriggerWordLength = wlen;
244
completionList = Document.TextEditor.SelectionStartPosition != Document.TextEditor.SelectionEndPosition ? ShowCodeSurroundingsCommand (currentCompletionContext) : ShowCodeTemplatesCommand (currentCompletionContext);
241
completionList = Document.Editor.IsSomethingSelected ? ShowCodeSurroundingsCommand (currentCompletionContext) : ShowCodeTemplatesCommand (currentCompletionContext);
246
243
if (completionList != null)
247
CompletionWindowManager.ShowWindow ((char)0, completionList, completionWidget, currentCompletionContext, OnCompletionWindowClosed);
244
CompletionWindowManager.ShowWindow ((char)0, completionList, CompletionWidget, currentCompletionContext, OnCompletionWindowClosed);
249
246
currentCompletionContext = null;
253
250
internal void OnUpdateShowCodeTemplatesWindow (CommandInfo info)
255
252
info.Bypass = !CanRunCompletionCommand ();
256
info.Text = Document.TextEditor.SelectionStartPosition != Document.TextEditor.SelectionEndPosition ? GettextCatalog.GetString ("_Surround With...") : GettextCatalog.GetString ("I_nsert Template...");
253
info.Text = Document.Editor.IsSomethingSelected ? GettextCatalog.GetString ("_Surround With...") : GettextCatalog.GetString ("I_nsert Template...");
263
260
IParameterDataProvider cp = null;
265
262
if (!GetParameterCompletionCommandOffset (out cpos))
266
cpos = Editor.CursorPosition;
267
CodeCompletionContext ctx = completionWidget.CreateCodeCompletionContext (cpos);
263
cpos = Editor.Caret.Offset;
264
CodeCompletionContext ctx = CompletionWidget.CreateCodeCompletionContext (cpos);
268
265
cp = ParameterCompletionCommand (ctx);
270
266
if (cp != null) {
271
ParameterInformationWindowManager.ShowWindow (ctx, cp);
272
ParameterInformationWindowManager.PostProcessKeyEvent (Gdk.Key.F, Gdk.ModifierType.None);
267
ParameterInformationWindowManager.ShowWindow (CompletionWidget, ctx, cp);
268
ParameterInformationWindowManager.PostProcessKeyEvent (CompletionWidget, Gdk.Key.F, Gdk.ModifierType.None);
276
272
public virtual bool CanRunCompletionCommand ()
278
return (completionWidget != null && currentCompletionContext == null);
274
return (CompletionWidget != null && currentCompletionContext == null);
281
277
public virtual bool CanRunParameterCompletionCommand ()
283
return (completionWidget != null && !ParameterInformationWindowManager.IsWindowVisible);
279
return (CompletionWidget != null && !ParameterInformationWindowManager.IsWindowVisible);
305
301
public virtual bool GetCompletionCommandOffset (out int cpos, out int wlen)
308
int pos = Editor.CursorPosition - 1;
304
int pos = Editor.Caret.Offset - 1;
309
305
while (pos >= 0) {
310
306
char c = Editor.GetCharAt (pos);
311
307
if (!char.IsLetterOrDigit (c) && c != '_')
371
367
// the char at the cursor position. If it returns a provider, just return it.
373
369
int pos = completionContext.TriggerOffset;
374
string txt = Editor.GetText (pos - 1, pos);
370
string txt = Editor.GetTextBetween (pos - 1, pos);
375
371
if (txt.Length > 0) {
376
372
ICompletionDataList completionList = HandleCodeCompletion (completionContext, txt[0]);
377
373
if (completionList != null)
397
393
// the char at the cursor position. If it returns a provider, just return it.
399
395
int pos = completionContext.TriggerOffset;
400
string txt = Editor.GetText (pos - 1, pos);
401
if (txt.Length > 0) {
402
IParameterDataProvider cp = HandleParameterCompletion (completionContext, txt[0]);
398
IParameterDataProvider cp = HandleParameterCompletion (completionContext, Editor.Document.GetCharAt (pos - 1));
414
409
enableParameterInsight = (bool)PropertyService.Get ("EnableParameterInsight", true);
416
411
PropertyService.PropertyChanged += OnPropertyUpdated;
417
completionWidget = Document.GetContent <ICompletionWidget> ();
418
if (completionWidget != null)
419
completionWidget.CompletionContextChanged += OnCompletionContextChanged;
412
CompletionWidget = Document.GetContent <ICompletionWidget> ();
413
if (CompletionWidget != null)
414
CompletionWidget.CompletionContextChanged += OnCompletionContextChanged;
422
417
bool disposed = false;
427
422
PropertyService.PropertyChanged -= OnPropertyUpdated;
428
if (completionWidget != null)
429
completionWidget.CompletionContextChanged -= OnCompletionContextChanged;
423
if (CompletionWidget != null)
424
CompletionWidget.CompletionContextChanged -= OnCompletionContextChanged;