Example #1
0
    codePane.CodeAreaHeight - codePane.Cursor.Row >= VerticalPaddingHeight + configuration.MinCompletionItemsCount;     // offset + top border + MinCompletionItemsCount + bottom border

    async Task IKeyPressHandler.OnKeyUp(KeyPress key, CancellationToken cancellationToken)
    {
        if (!EnoughRoomToDisplay(codePane))
        {
            return;
        }

        bool wasAlreadyOpen = IsOpen;

        if (!IsOpen)
        {
            if (!char.IsControl(key.ConsoleKeyInfo.KeyChar) &&
                !completionListTriggeredOnKeyDown &&
                await promptCallbacks.ShouldOpenCompletionWindowAsync(codePane.Document.GetText(), codePane.Document.Caret, key, cancellationToken).ConfigureAwait(false))
            {
                Open();
            }
        }

        if (IsOpen)
        {
            var documentText  = codePane.Document.GetText();
            int documentCaret = codePane.Document.Caret;
            var spanToReplace = await promptCallbacks.GetSpanToReplaceByCompletionkAsync(documentText, documentCaret, cancellationToken).ConfigureAwait(false);

            if (wasAlreadyOpen &&
                lastSpanToReplaceOnKeyDown.TryGet(out var spanToReplaceOld))
            {
                if (spanToReplace.Start != spanToReplaceOld.Start && spanToReplace.End != spanToReplaceOld.End)
                {
                    Close();
                    return;
                }
            }

            if (allCompletions.Count == 0)
            {
                var completions = await promptCallbacks.GetCompletionItemsAsync(documentText, documentCaret, spanToReplace, cancellationToken).ConfigureAwait(false);

                if (completions.Any())
                {
                    allCompletions = completions;
                    if (completions.Any())
                    {
                        int height = Math.Min(codePane.CodeAreaHeight - VerticalPaddingHeight, configuration.MaxCompletionItemsCount);
                        FilteredView.UpdateItems(completions, documentText, documentCaret, spanToReplace, height);
                    }
                }
                else
                {
                    Close();
                }
            }
            else if (!key.Handled)
            {
                FilteredView.Match(documentText, documentCaret, spanToReplace);
            }
        }
    }