public virtual ICompletionDataList ShowCodeSurroundingsCommand(CodeCompletionContext completionContext)
        {
            CompletionDataList list = new CompletionDataList();

            list.AutoSelect              = true;
            list.AutoCompleteEmptyMatch  = true;
            list.CompletionSelectionMode = CompletionSelectionMode.OwnTextField;
            var templateWidget      = DocumentContext.GetContent <ICodeTemplateContextProvider> ();
            CodeTemplateContext ctx = CodeTemplateContext.Standard;

            if (templateWidget != null)
            {
                ctx = templateWidget.GetCodeTemplateContext();
            }
            foreach (CodeTemplate template in CodeTemplateService.GetCodeTemplatesAsync(Editor).WaitAndGetResult(CancellationToken.None))
            {
                if ((template.CodeTemplateType & CodeTemplateType.SurroundsWith) == CodeTemplateType.SurroundsWith)
                {
                    if (ctx == template.CodeTemplateContext)
                    {
                        list.Add(new CodeTemplateCompletionData(this, template));
                    }
                }
            }
            return(list);
        }
        public override async Task <ICompletionDataList> HandleCodeCompletionAsync(CodeCompletionContext completionContext, CompletionTriggerInfo triggerInfo, CancellationToken token)
        {
            if (inactive)
            {
                return(await base.HandleCodeCompletionAsync(completionContext, triggerInfo, token));
            }

            if (!IdeApp.Preferences.EnableAutoCodeCompletion)
            {
                return(null);
            }
            if (triggerInfo.CompletionTriggerReason != CompletionTriggerReason.CharTyped)
            {
                return(null);
            }
            char completionChar    = triggerInfo.TriggerCharacter.Value;
            int  triggerWordLength = 0;

            if (char.IsLetterOrDigit(completionChar) || completionChar == '_')
            {
                if (completionContext.TriggerOffset > 1 && char.IsLetterOrDigit(Editor.GetCharAt(completionContext.TriggerOffset - 2)))
                {
                    return(null);
                }
                triggerWordLength = 1;
            }
            else
            {
                return(null);
            }

            var result = new CompletionDataList();

            result.TriggerWordLength                  = triggerWordLength;
            result.AutoSelect                         = false;
            result.AutoCompleteEmptyMatch             = false;
            result.AutoCompleteUniqueMatch            = false;
            result.AutoCompleteEmptyMatchOnCurlyBrace = false;

            foreach (var ct in await CodeTemplateService.GetCodeTemplatesAsync(Editor, token))
            {
                if (string.IsNullOrEmpty(ct.Shortcut) || ct.CodeTemplateContext != CodeTemplateContext.Standard)
                {
                    continue;
                }
                result.Add(new CodeTemplateCompletionData(this, ct));
            }

            foreach (var word in await GetAllWords(Editor.CreateSnapshot(), Editor.CaretOffset))
            {
                result.Add(new CompletionData(word));
            }

            return(result);
        }
        public bool DoInsertTemplate()
        {
            string word = CodeTemplate.GetTemplateShortcutBeforeCaret(Editor);

            foreach (CodeTemplate template in CodeTemplateService.GetCodeTemplatesAsync(Editor).WaitAndGetResult(CancellationToken.None))
            {
                if (template.Shortcut == word)
                {
                    return(true);
                }
            }
            return(false);
        }
        public bool DoInsertTemplate()
        {
            string shortcut = CodeTemplate.GetTemplateShortcutBeforeCaret(EditorExtension.Editor);

            foreach (CodeTemplate template in CodeTemplateService.GetCodeTemplatesAsync(EditorExtension.Editor).WaitAndGetResult(CancellationToken.None))
            {
                if (template.Shortcut == shortcut)
                {
                    InsertTemplate(template, view.WorkbenchWindow.Document.Editor, view.WorkbenchWindow.Document);
                    return(true);
                }
            }
            return(false);
        }
        public bool DoInsertTemplate(TextEditor editor, DocumentContext ctx)
        {
            string shortcut = CodeTemplate.GetTemplateShortcutBeforeCaret(editor);

            foreach (CodeTemplate template in CodeTemplateService.GetCodeTemplatesAsync(editor).WaitAndGetResult(CancellationToken.None))
            {
                if (template.Shortcut == shortcut)
                {
                    InsertTemplate(template, editor, ctx);
                    return(true);
                }
            }
            return(false);
        }
        public virtual ICompletionDataList ShowCodeTemplatesCommand(CodeCompletionContext completionContext)
        {
            CompletionDataList list = new CompletionDataList();

            list.AutoSelect              = true;
            list.AutoCompleteEmptyMatch  = true;
            list.CompletionSelectionMode = CompletionSelectionMode.OwnTextField;
            foreach (CodeTemplate template in CodeTemplateService.GetCodeTemplatesAsync(Editor).WaitAndGetResult(CancellationToken.None))
            {
                if (template.CodeTemplateType != CodeTemplateType.SurroundsWith)
                {
                    list.Add(new CodeTemplateCompletionData(this, template));
                }
            }
            return(list);
        }
        public bool IsTemplateKnown(ExtensibleTextEditor instance)
        {
            string shortcut = CodeTemplate.GetTemplateShortcutBeforeCaret(EditorExtension.Editor);
            bool   result   = false;

            foreach (CodeTemplate template in CodeTemplateService.GetCodeTemplatesAsync(EditorExtension.Editor).WaitAndGetResult(CancellationToken.None))
            {
                if (template.Shortcut == shortcut)
                {
                    result = true;
                }
                else if (template.Shortcut.StartsWith(shortcut))
                {
                    result = false;
                    break;
                }
            }
            return(result);
        }
        public bool DoInsertTemplate()
        {
            string shortcut = CodeTemplate.GetTemplateShortcutBeforeCaret(EditorExtension.Editor);

            foreach (CodeTemplate template in CodeTemplateService.GetCodeTemplatesAsync(EditorExtension.Editor).WaitAndGetResult(CancellationToken.None))
            {
                if (template.Shortcut == shortcut)
                {
                    var doc = view.WorkbenchWindow?.Document ?? IdeApp.Workbench.ActiveDocument;
                    if (doc != null)
                    {
                        InsertTemplate(template, doc.Editor, doc);
                    }
                    else
                    {
                        LoggingService.LogError("DoInsertTemplate(): Can't find valid document");
                    }
                    return(true);
                }
            }
            return(false);
        }