monaco-editor-core 0.55.0-dev-20251009 → 0.55.0-dev-20251010
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm/nls.messages.de.js +1 -1
- package/esm/nls.messages.es.js +1 -1
- package/esm/nls.messages.fr.js +1 -1
- package/esm/nls.messages.it.js +1 -1
- package/esm/nls.messages.ja.js +1 -1
- package/esm/nls.messages.ko.js +1 -1
- package/esm/nls.messages.ru.js +1 -1
- package/esm/nls.messages.zh-cn.js +1 -1
- package/esm/nls.messages.zh-tw.js +1 -1
- package/esm/vs/base/browser/history.js.map +1 -1
- package/esm/vs/base/browser/ui/list/listWidget.js.map +1 -1
- package/esm/vs/base/browser/ui/tree/tree.js.map +1 -1
- package/esm/vs/base/common/history.js.map +1 -1
- package/esm/vs/base/common/worker/webWorker.js.map +1 -1
- package/esm/vs/editor/browser/editorBrowser.js.map +1 -1
- package/esm/vs/editor/browser/services/hoverService/hoverWidget.js +6 -11
- package/esm/vs/editor/browser/services/hoverService/hoverWidget.js.map +1 -1
- package/esm/vs/editor/browser/services/inlineCompletionsService.js.map +1 -1
- package/esm/vs/editor/browser/widget/markdownRenderer/browser/{markdownRenderer.js → editorMarkdownCodeBlockRenderer.js} +20 -59
- package/esm/vs/editor/browser/widget/markdownRenderer/browser/editorMarkdownCodeBlockRenderer.js.map +1 -0
- package/esm/vs/editor/common/config/editorConfiguration.js.map +1 -1
- package/esm/vs/editor/common/config/editorZoom.js.map +1 -1
- package/esm/vs/editor/common/diff/documentDiffProvider.js.map +1 -1
- package/esm/vs/editor/common/editorCommon.js.map +1 -1
- package/esm/vs/editor/common/languages/language.js.map +1 -1
- package/esm/vs/editor/common/languages/languageConfigurationRegistry.js.map +1 -1
- package/esm/vs/editor/common/languages.js.map +1 -1
- package/esm/vs/editor/common/textModelBracketPairs.js.map +1 -1
- package/esm/vs/editor/contrib/hover/browser/glyphHoverWidget.js +2 -2
- package/esm/vs/editor/contrib/hover/browser/glyphHoverWidget.js.map +1 -1
- package/esm/vs/editor/contrib/hover/browser/markdownHoverParticipant.js +2 -2
- package/esm/vs/editor/contrib/hover/browser/markdownHoverParticipant.js.map +1 -1
- package/esm/vs/editor/contrib/inlayHints/browser/inlayHintsHover.js +1 -1
- package/esm/vs/editor/contrib/inlayHints/browser/inlayHintsHover.js.map +1 -1
- package/esm/vs/editor/contrib/inlineCompletions/browser/hintsWidget/hoverParticipant.js +2 -2
- package/esm/vs/editor/contrib/inlineCompletions/browser/hintsWidget/hoverParticipant.js.map +1 -1
- package/esm/vs/editor/contrib/message/browser/messageController.js +1 -1
- package/esm/vs/editor/contrib/message/browser/messageController.js.map +1 -1
- package/esm/vs/editor/contrib/parameterHints/browser/parameterHintsWidget.js +2 -2
- package/esm/vs/editor/contrib/parameterHints/browser/parameterHintsWidget.js.map +1 -1
- package/esm/vs/editor/contrib/stickyScroll/browser/stickyScrollController.js.map +1 -1
- package/esm/vs/editor/contrib/stickyScroll/browser/stickyScrollProvider.js.map +1 -1
- package/esm/vs/editor/contrib/suggest/browser/suggestWidgetDetails.js +2 -2
- package/esm/vs/editor/contrib/suggest/browser/suggestWidgetDetails.js.map +1 -1
- package/esm/vs/editor/contrib/unicodeHighlighter/browser/bannerController.js +1 -1
- package/esm/vs/editor/contrib/unicodeHighlighter/browser/bannerController.js.map +1 -1
- package/esm/vs/editor/contrib/unicodeHighlighter/browser/unicodeHighlighter.js +1 -1
- package/esm/vs/editor/contrib/unicodeHighlighter/browser/unicodeHighlighter.js.map +1 -1
- package/esm/vs/editor/editor.api.d.ts +5 -4
- package/esm/vs/editor/standalone/browser/standaloneCodeEditor.js +10 -5
- package/esm/vs/editor/standalone/browser/standaloneCodeEditor.js.map +1 -1
- package/esm/vs/platform/actions/browser/actionViewItemService.js.map +1 -1
- package/esm/vs/platform/actions/browser/menuEntryActionViewItem.js +16 -13
- package/esm/vs/platform/actions/browser/menuEntryActionViewItem.js.map +1 -1
- package/esm/vs/platform/actions/common/actions.js +1 -0
- package/esm/vs/platform/actions/common/actions.js.map +1 -1
- package/esm/vs/platform/configuration/common/configuration.js.map +1 -1
- package/esm/vs/platform/contextkey/common/contextkey.js.map +1 -1
- package/esm/vs/platform/keybinding/common/keybinding.js.map +1 -1
- package/esm/vs/platform/log/common/log.js.map +1 -1
- package/esm/vs/platform/markdown/browser/markdownRenderer.js +72 -0
- package/esm/vs/platform/markdown/browser/markdownRenderer.js.map +1 -0
- package/esm/vs/platform/quickinput/browser/quickInput.js +20 -10
- package/esm/vs/platform/quickinput/browser/quickInput.js.map +1 -1
- package/esm/vs/platform/quickinput/browser/quickInputController.js +1 -0
- package/esm/vs/platform/quickinput/browser/quickInputController.js.map +1 -1
- package/esm/vs/platform/quickinput/browser/quickInputList.js.map +1 -1
- package/esm/vs/platform/quickinput/common/quickInput.js.map +1 -1
- package/esm/vs/platform/workspace/common/workspaceTrust.js.map +1 -1
- package/monaco.d.ts +5 -4
- package/package.json +2 -2
- package/version.txt +1 -1
- package/esm/vs/editor/browser/widget/markdownRenderer/browser/markdownRenderer.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["vs/editor/contrib/parameterHints/browser/parameterHintsWidget.ts"],"names":[],"mappings":"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","file":"parameterHintsWidget.js","sourceRoot":"file:///mnt/vss/_work/1/s/dependencies/vscode/out-editor-src","sourcesContent":["/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport * as dom from '../../../../base/browser/dom.js';\nimport * as aria from '../../../../base/browser/ui/aria/aria.js';\nimport { DomScrollableElement } from '../../../../base/browser/ui/scrollbar/scrollableElement.js';\nimport { Codicon } from '../../../../base/common/codicons.js';\nimport { Event } from '../../../../base/common/event.js';\nimport { IMarkdownString } from '../../../../base/common/htmlContent.js';\nimport { Disposable, DisposableStore } from '../../../../base/common/lifecycle.js';\nimport { escapeRegExpCharacters } from '../../../../base/common/strings.js';\nimport { assertReturnsDefined } from '../../../../base/common/types.js';\nimport './parameterHints.css';\nimport { ContentWidgetPositionPreference, ICodeEditor, IContentWidget, IContentWidgetPosition } from '../../../browser/editorBrowser.js';\nimport { EditorOption } from '../../../common/config/editorOptions.js';\nimport { EDITOR_FONT_DEFAULTS } from '../../../common/config/fontInfo.js';\nimport * as languages from '../../../common/languages.js';\nimport { IMarkdownRendererService } from '../../../browser/widget/markdownRenderer/browser/markdownRenderer.js';\nimport { IRenderedMarkdown } from '../../../../base/browser/markdownRenderer.js';\nimport { ParameterHintsModel } from './parameterHintsModel.js';\nimport { Context } from './provideSignatureHelp.js';\nimport * as nls from '../../../../nls.js';\nimport { IContextKey, IContextKeyService } from '../../../../platform/contextkey/common/contextkey.js';\nimport { listHighlightForeground, registerColor } from '../../../../platform/theme/common/colorRegistry.js';\nimport { registerIcon } from '../../../../platform/theme/common/iconRegistry.js';\nimport { ThemeIcon } from '../../../../base/common/themables.js';\n\nconst $ = dom.$;\n\nconst parameterHintsNextIcon = registerIcon('parameter-hints-next', Codicon.chevronDown, nls.localize('parameterHintsNextIcon', 'Icon for show next parameter hint.'));\nconst parameterHintsPreviousIcon = registerIcon('parameter-hints-previous', Codicon.chevronUp, nls.localize('parameterHintsPreviousIcon', 'Icon for show previous parameter hint.'));\n\nexport class ParameterHintsWidget extends Disposable implements IContentWidget {\n\n\tprivate static readonly ID = 'editor.widget.parameterHintsWidget';\n\n\tprivate readonly renderDisposeables = this._register(new DisposableStore());\n\tprivate readonly keyVisible: IContextKey<boolean>;\n\tprivate readonly keyMultipleSignatures: IContextKey<boolean>;\n\n\tprivate domNodes?: {\n\t\treadonly element: HTMLElement;\n\t\treadonly signature: HTMLElement;\n\t\treadonly docs: HTMLElement;\n\t\treadonly overloads: HTMLElement;\n\t\treadonly scrollbar: DomScrollableElement;\n\t};\n\n\tprivate visible: boolean = false;\n\tprivate announcedLabel: string | null = null;\n\n\t// Editor.IContentWidget.allowEditorOverflow\n\tallowEditorOverflow = true;\n\n\tconstructor(\n\t\tprivate readonly editor: ICodeEditor,\n\t\tprivate readonly model: ParameterHintsModel,\n\t\t@IContextKeyService contextKeyService: IContextKeyService,\n\t\t@IMarkdownRendererService private readonly markdownRendererService: IMarkdownRendererService,\n\t) {\n\t\tsuper();\n\n\t\tthis.keyVisible = Context.Visible.bindTo(contextKeyService);\n\t\tthis.keyMultipleSignatures = Context.MultipleSignatures.bindTo(contextKeyService);\n\t}\n\n\tprivate createParameterHintDOMNodes() {\n\t\tconst element = $('.editor-widget.parameter-hints-widget');\n\t\tconst wrapper = dom.append(element, $('.phwrapper'));\n\t\twrapper.tabIndex = -1;\n\n\t\tconst controls = dom.append(wrapper, $('.controls'));\n\t\tconst previous = dom.append(controls, $('.button' + ThemeIcon.asCSSSelector(parameterHintsPreviousIcon)));\n\t\tconst overloads = dom.append(controls, $('.overloads'));\n\t\tconst next = dom.append(controls, $('.button' + ThemeIcon.asCSSSelector(parameterHintsNextIcon)));\n\n\t\tthis._register(dom.addDisposableListener(previous, 'click', e => {\n\t\t\tdom.EventHelper.stop(e);\n\t\t\tthis.previous();\n\t\t}));\n\n\t\tthis._register(dom.addDisposableListener(next, 'click', e => {\n\t\t\tdom.EventHelper.stop(e);\n\t\t\tthis.next();\n\t\t}));\n\n\t\tconst body = $('.body');\n\t\tconst scrollbar = new DomScrollableElement(body, {\n\t\t\talwaysConsumeMouseWheel: true,\n\t\t});\n\t\tthis._register(scrollbar);\n\t\twrapper.appendChild(scrollbar.getDomNode());\n\n\t\tconst signature = dom.append(body, $('.signature'));\n\t\tconst docs = dom.append(body, $('.docs'));\n\n\t\telement.style.userSelect = 'text';\n\n\t\tthis.domNodes = {\n\t\t\telement,\n\t\t\tsignature,\n\t\t\toverloads,\n\t\t\tdocs,\n\t\t\tscrollbar,\n\t\t};\n\n\t\tthis.editor.addContentWidget(this);\n\t\tthis.hide();\n\n\t\tthis._register(this.editor.onDidChangeCursorSelection(e => {\n\t\t\tif (this.visible) {\n\t\t\t\tthis.editor.layoutContentWidget(this);\n\t\t\t}\n\t\t}));\n\n\t\tconst updateFont = () => {\n\t\t\tif (!this.domNodes) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst fontInfo = this.editor.getOption(EditorOption.fontInfo);\n\t\t\tconst element = this.domNodes.element;\n\t\t\telement.style.fontSize = `${fontInfo.fontSize}px`;\n\t\t\telement.style.lineHeight = `${fontInfo.lineHeight / fontInfo.fontSize}`;\n\t\t\telement.style.setProperty('--vscode-parameterHintsWidget-editorFontFamily', fontInfo.fontFamily);\n\t\t\telement.style.setProperty('--vscode-parameterHintsWidget-editorFontFamilyDefault', EDITOR_FONT_DEFAULTS.fontFamily);\n\t\t};\n\n\t\tupdateFont();\n\n\t\tthis._register(Event.chain(\n\t\t\tthis.editor.onDidChangeConfiguration.bind(this.editor),\n\t\t\t$ => $.filter(e => e.hasChanged(EditorOption.fontInfo))\n\t\t)(updateFont));\n\n\t\tthis._register(this.editor.onDidLayoutChange(e => this.updateMaxHeight()));\n\t\tthis.updateMaxHeight();\n\t}\n\n\tpublic show(): void {\n\t\tif (this.visible) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (!this.domNodes) {\n\t\t\tthis.createParameterHintDOMNodes();\n\t\t}\n\n\t\tthis.keyVisible.set(true);\n\t\tthis.visible = true;\n\t\tsetTimeout(() => {\n\t\t\tthis.domNodes?.element.classList.add('visible');\n\t\t}, 100);\n\t\tthis.editor.layoutContentWidget(this);\n\t}\n\n\tpublic hide(): void {\n\t\tthis.renderDisposeables.clear();\n\n\t\tif (!this.visible) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.keyVisible.reset();\n\t\tthis.visible = false;\n\t\tthis.announcedLabel = null;\n\t\tthis.domNodes?.element.classList.remove('visible');\n\t\tthis.editor.layoutContentWidget(this);\n\t}\n\n\tgetPosition(): IContentWidgetPosition | null {\n\t\tif (this.visible) {\n\t\t\treturn {\n\t\t\t\tposition: this.editor.getPosition(),\n\t\t\t\tpreference: [ContentWidgetPositionPreference.ABOVE, ContentWidgetPositionPreference.BELOW]\n\t\t\t};\n\t\t}\n\t\treturn null;\n\t}\n\n\tpublic render(hints: languages.SignatureHelp): void {\n\t\tthis.renderDisposeables.clear();\n\n\t\tif (!this.domNodes) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst multiple = hints.signatures.length > 1;\n\t\tthis.domNodes.element.classList.toggle('multiple', multiple);\n\t\tthis.keyMultipleSignatures.set(multiple);\n\n\t\tthis.domNodes.signature.innerText = '';\n\t\tthis.domNodes.docs.innerText = '';\n\n\t\tconst signature = hints.signatures[hints.activeSignature];\n\t\tif (!signature) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst code = dom.append(this.domNodes.signature, $('.code'));\n\t\tconst hasParameters = signature.parameters.length > 0;\n\t\tconst activeParameterIndex = signature.activeParameter ?? hints.activeParameter;\n\n\t\tif (!hasParameters) {\n\t\t\tconst label = dom.append(code, $('span'));\n\t\t\tlabel.textContent = signature.label;\n\t\t} else {\n\t\t\tthis.renderParameters(code, signature, activeParameterIndex);\n\t\t}\n\n\t\tconst activeParameter: languages.ParameterInformation | undefined = signature.parameters[activeParameterIndex];\n\t\tif (activeParameter?.documentation) {\n\t\t\tconst documentation = $('span.documentation');\n\t\t\tif (typeof activeParameter.documentation === 'string') {\n\t\t\t\tdocumentation.textContent = activeParameter.documentation;\n\t\t\t} else {\n\t\t\t\tconst renderedContents = this.renderMarkdownDocs(activeParameter.documentation);\n\t\t\t\tdocumentation.appendChild(renderedContents.element);\n\t\t\t}\n\t\t\tdom.append(this.domNodes.docs, $('p', {}, documentation));\n\t\t}\n\n\t\tif (signature.documentation === undefined) {\n\t\t\t/** no op */\n\t\t} else if (typeof signature.documentation === 'string') {\n\t\t\tdom.append(this.domNodes.docs, $('p', {}, signature.documentation));\n\t\t} else {\n\t\t\tconst renderedContents = this.renderMarkdownDocs(signature.documentation);\n\t\t\tdom.append(this.domNodes.docs, renderedContents.element);\n\t\t}\n\n\t\tconst hasDocs = this.hasDocs(signature, activeParameter);\n\n\t\tthis.domNodes.signature.classList.toggle('has-docs', hasDocs);\n\t\tthis.domNodes.docs.classList.toggle('empty', !hasDocs);\n\n\t\tthis.domNodes.overloads.textContent =\n\t\t\tString(hints.activeSignature + 1).padStart(hints.signatures.length.toString().length, '0') + '/' + hints.signatures.length;\n\n\t\tif (activeParameter) {\n\t\t\tlet labelToAnnounce = '';\n\t\t\tconst param = signature.parameters[activeParameterIndex];\n\t\t\tif (Array.isArray(param.label)) {\n\t\t\t\tlabelToAnnounce = signature.label.substring(param.label[0], param.label[1]);\n\t\t\t} else {\n\t\t\t\tlabelToAnnounce = param.label;\n\t\t\t}\n\t\t\tif (param.documentation) {\n\t\t\t\tlabelToAnnounce += typeof param.documentation === 'string' ? `, ${param.documentation}` : `, ${param.documentation.value}`;\n\t\t\t}\n\t\t\tif (signature.documentation) {\n\t\t\t\tlabelToAnnounce += typeof signature.documentation === 'string' ? `, ${signature.documentation}` : `, ${signature.documentation.value}`;\n\t\t\t}\n\n\t\t\t// Select method gets called on every user type while parameter hints are visible.\n\t\t\t// We do not want to spam the user with same announcements, so we only announce if the current parameter changed.\n\n\t\t\tif (this.announcedLabel !== labelToAnnounce) {\n\t\t\t\taria.alert(nls.localize('hint', \"{0}, hint\", labelToAnnounce));\n\t\t\t\tthis.announcedLabel = labelToAnnounce;\n\t\t\t}\n\t\t}\n\n\t\tthis.editor.layoutContentWidget(this);\n\t\tthis.domNodes.scrollbar.scanDomNode();\n\t}\n\n\tprivate renderMarkdownDocs(markdown: IMarkdownString): IRenderedMarkdown {\n\t\tconst renderedContents = this.renderDisposeables.add(this.markdownRendererService.render(markdown, {\n\t\t\teditor: this.editor,\n\t\t\tasyncRenderCallback: () => {\n\t\t\t\tthis.domNodes?.scrollbar.scanDomNode();\n\t\t\t}\n\t\t}));\n\t\trenderedContents.element.classList.add('markdown-docs');\n\t\treturn renderedContents;\n\t}\n\n\tprivate hasDocs(signature: languages.SignatureInformation, activeParameter: languages.ParameterInformation | undefined): boolean {\n\t\tif (activeParameter && typeof activeParameter.documentation === 'string' && assertReturnsDefined(activeParameter.documentation).length > 0) {\n\t\t\treturn true;\n\t\t}\n\t\tif (activeParameter && typeof activeParameter.documentation === 'object' && assertReturnsDefined(activeParameter.documentation).value.length > 0) {\n\t\t\treturn true;\n\t\t}\n\t\tif (signature.documentation && typeof signature.documentation === 'string' && assertReturnsDefined(signature.documentation).length > 0) {\n\t\t\treturn true;\n\t\t}\n\t\tif (signature.documentation && typeof signature.documentation === 'object' && assertReturnsDefined(signature.documentation.value).length > 0) {\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n\n\tprivate renderParameters(parent: HTMLElement, signature: languages.SignatureInformation, activeParameterIndex: number): void {\n\t\tconst [start, end] = this.getParameterLabelOffsets(signature, activeParameterIndex);\n\n\t\tconst beforeSpan = document.createElement('span');\n\t\tbeforeSpan.textContent = signature.label.substring(0, start);\n\n\t\tconst paramSpan = document.createElement('span');\n\t\tparamSpan.textContent = signature.label.substring(start, end);\n\t\tparamSpan.className = 'parameter active';\n\n\t\tconst afterSpan = document.createElement('span');\n\t\tafterSpan.textContent = signature.label.substring(end);\n\n\t\tdom.append(parent, beforeSpan, paramSpan, afterSpan);\n\t}\n\n\tprivate getParameterLabelOffsets(signature: languages.SignatureInformation, paramIdx: number): [number, number] {\n\t\tconst param = signature.parameters[paramIdx];\n\t\tif (!param) {\n\t\t\treturn [0, 0];\n\t\t} else if (Array.isArray(param.label)) {\n\t\t\treturn param.label;\n\t\t} else if (!param.label.length) {\n\t\t\treturn [0, 0];\n\t\t} else {\n\t\t\tconst regex = new RegExp(`(\\\\W|^)${escapeRegExpCharacters(param.label)}(?=\\\\W|$)`, 'g');\n\t\t\tregex.test(signature.label);\n\t\t\tconst idx = regex.lastIndex - param.label.length;\n\t\t\treturn idx >= 0\n\t\t\t\t? [idx, regex.lastIndex]\n\t\t\t\t: [0, 0];\n\t\t}\n\t}\n\n\tnext(): void {\n\t\tthis.editor.focus();\n\t\tthis.model.next();\n\t}\n\n\tprevious(): void {\n\t\tthis.editor.focus();\n\t\tthis.model.previous();\n\t}\n\n\tgetDomNode(): HTMLElement {\n\t\tif (!this.domNodes) {\n\t\t\tthis.createParameterHintDOMNodes();\n\t\t}\n\t\treturn this.domNodes!.element;\n\t}\n\n\tgetId(): string {\n\t\treturn ParameterHintsWidget.ID;\n\t}\n\n\tprivate updateMaxHeight(): void {\n\t\tif (!this.domNodes) {\n\t\t\treturn;\n\t\t}\n\t\tconst height = Math.max(this.editor.getLayoutInfo().height / 4, 250);\n\t\tconst maxHeight = `${height}px`;\n\t\tthis.domNodes.element.style.maxHeight = maxHeight;\n\t\tconst wrapper = this.domNodes.element.getElementsByClassName('phwrapper') as HTMLCollectionOf<HTMLElement>;\n\t\tif (wrapper.length) {\n\t\t\twrapper[0].style.maxHeight = maxHeight;\n\t\t}\n\t}\n}\n\nregisterColor('editorHoverWidget.highlightForeground', listHighlightForeground, nls.localize('editorHoverWidgetHighlightForeground', 'Foreground color of the active item in the parameter hint.'));\n"]}
|
|
1
|
+
{"version":3,"sources":["vs/editor/contrib/parameterHints/browser/parameterHintsWidget.ts"],"names":[],"mappings":"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","file":"parameterHintsWidget.js","sourceRoot":"file:///mnt/vss/_work/1/s/dependencies/vscode/out-editor-src","sourcesContent":["/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport * as dom from '../../../../base/browser/dom.js';\nimport * as aria from '../../../../base/browser/ui/aria/aria.js';\nimport { DomScrollableElement } from '../../../../base/browser/ui/scrollbar/scrollableElement.js';\nimport { Codicon } from '../../../../base/common/codicons.js';\nimport { Event } from '../../../../base/common/event.js';\nimport { IMarkdownString } from '../../../../base/common/htmlContent.js';\nimport { Disposable, DisposableStore } from '../../../../base/common/lifecycle.js';\nimport { escapeRegExpCharacters } from '../../../../base/common/strings.js';\nimport { assertReturnsDefined } from '../../../../base/common/types.js';\nimport './parameterHints.css';\nimport { ContentWidgetPositionPreference, ICodeEditor, IContentWidget, IContentWidgetPosition } from '../../../browser/editorBrowser.js';\nimport { EditorOption } from '../../../common/config/editorOptions.js';\nimport { EDITOR_FONT_DEFAULTS } from '../../../common/config/fontInfo.js';\nimport * as languages from '../../../common/languages.js';\nimport { IMarkdownRendererService } from '../../../../platform/markdown/browser/markdownRenderer.js';\nimport { IRenderedMarkdown } from '../../../../base/browser/markdownRenderer.js';\nimport { ParameterHintsModel } from './parameterHintsModel.js';\nimport { Context } from './provideSignatureHelp.js';\nimport * as nls from '../../../../nls.js';\nimport { IContextKey, IContextKeyService } from '../../../../platform/contextkey/common/contextkey.js';\nimport { listHighlightForeground, registerColor } from '../../../../platform/theme/common/colorRegistry.js';\nimport { registerIcon } from '../../../../platform/theme/common/iconRegistry.js';\nimport { ThemeIcon } from '../../../../base/common/themables.js';\n\nconst $ = dom.$;\n\nconst parameterHintsNextIcon = registerIcon('parameter-hints-next', Codicon.chevronDown, nls.localize('parameterHintsNextIcon', 'Icon for show next parameter hint.'));\nconst parameterHintsPreviousIcon = registerIcon('parameter-hints-previous', Codicon.chevronUp, nls.localize('parameterHintsPreviousIcon', 'Icon for show previous parameter hint.'));\n\nexport class ParameterHintsWidget extends Disposable implements IContentWidget {\n\n\tprivate static readonly ID = 'editor.widget.parameterHintsWidget';\n\n\tprivate readonly renderDisposeables = this._register(new DisposableStore());\n\tprivate readonly keyVisible: IContextKey<boolean>;\n\tprivate readonly keyMultipleSignatures: IContextKey<boolean>;\n\n\tprivate domNodes?: {\n\t\treadonly element: HTMLElement;\n\t\treadonly signature: HTMLElement;\n\t\treadonly docs: HTMLElement;\n\t\treadonly overloads: HTMLElement;\n\t\treadonly scrollbar: DomScrollableElement;\n\t};\n\n\tprivate visible: boolean = false;\n\tprivate announcedLabel: string | null = null;\n\n\t// Editor.IContentWidget.allowEditorOverflow\n\tallowEditorOverflow = true;\n\n\tconstructor(\n\t\tprivate readonly editor: ICodeEditor,\n\t\tprivate readonly model: ParameterHintsModel,\n\t\t@IContextKeyService contextKeyService: IContextKeyService,\n\t\t@IMarkdownRendererService private readonly markdownRendererService: IMarkdownRendererService,\n\t) {\n\t\tsuper();\n\n\t\tthis.keyVisible = Context.Visible.bindTo(contextKeyService);\n\t\tthis.keyMultipleSignatures = Context.MultipleSignatures.bindTo(contextKeyService);\n\t}\n\n\tprivate createParameterHintDOMNodes() {\n\t\tconst element = $('.editor-widget.parameter-hints-widget');\n\t\tconst wrapper = dom.append(element, $('.phwrapper'));\n\t\twrapper.tabIndex = -1;\n\n\t\tconst controls = dom.append(wrapper, $('.controls'));\n\t\tconst previous = dom.append(controls, $('.button' + ThemeIcon.asCSSSelector(parameterHintsPreviousIcon)));\n\t\tconst overloads = dom.append(controls, $('.overloads'));\n\t\tconst next = dom.append(controls, $('.button' + ThemeIcon.asCSSSelector(parameterHintsNextIcon)));\n\n\t\tthis._register(dom.addDisposableListener(previous, 'click', e => {\n\t\t\tdom.EventHelper.stop(e);\n\t\t\tthis.previous();\n\t\t}));\n\n\t\tthis._register(dom.addDisposableListener(next, 'click', e => {\n\t\t\tdom.EventHelper.stop(e);\n\t\t\tthis.next();\n\t\t}));\n\n\t\tconst body = $('.body');\n\t\tconst scrollbar = new DomScrollableElement(body, {\n\t\t\talwaysConsumeMouseWheel: true,\n\t\t});\n\t\tthis._register(scrollbar);\n\t\twrapper.appendChild(scrollbar.getDomNode());\n\n\t\tconst signature = dom.append(body, $('.signature'));\n\t\tconst docs = dom.append(body, $('.docs'));\n\n\t\telement.style.userSelect = 'text';\n\n\t\tthis.domNodes = {\n\t\t\telement,\n\t\t\tsignature,\n\t\t\toverloads,\n\t\t\tdocs,\n\t\t\tscrollbar,\n\t\t};\n\n\t\tthis.editor.addContentWidget(this);\n\t\tthis.hide();\n\n\t\tthis._register(this.editor.onDidChangeCursorSelection(e => {\n\t\t\tif (this.visible) {\n\t\t\t\tthis.editor.layoutContentWidget(this);\n\t\t\t}\n\t\t}));\n\n\t\tconst updateFont = () => {\n\t\t\tif (!this.domNodes) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst fontInfo = this.editor.getOption(EditorOption.fontInfo);\n\t\t\tconst element = this.domNodes.element;\n\t\t\telement.style.fontSize = `${fontInfo.fontSize}px`;\n\t\t\telement.style.lineHeight = `${fontInfo.lineHeight / fontInfo.fontSize}`;\n\t\t\telement.style.setProperty('--vscode-parameterHintsWidget-editorFontFamily', fontInfo.fontFamily);\n\t\t\telement.style.setProperty('--vscode-parameterHintsWidget-editorFontFamilyDefault', EDITOR_FONT_DEFAULTS.fontFamily);\n\t\t};\n\n\t\tupdateFont();\n\n\t\tthis._register(Event.chain(\n\t\t\tthis.editor.onDidChangeConfiguration.bind(this.editor),\n\t\t\t$ => $.filter(e => e.hasChanged(EditorOption.fontInfo))\n\t\t)(updateFont));\n\n\t\tthis._register(this.editor.onDidLayoutChange(e => this.updateMaxHeight()));\n\t\tthis.updateMaxHeight();\n\t}\n\n\tpublic show(): void {\n\t\tif (this.visible) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (!this.domNodes) {\n\t\t\tthis.createParameterHintDOMNodes();\n\t\t}\n\n\t\tthis.keyVisible.set(true);\n\t\tthis.visible = true;\n\t\tsetTimeout(() => {\n\t\t\tthis.domNodes?.element.classList.add('visible');\n\t\t}, 100);\n\t\tthis.editor.layoutContentWidget(this);\n\t}\n\n\tpublic hide(): void {\n\t\tthis.renderDisposeables.clear();\n\n\t\tif (!this.visible) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.keyVisible.reset();\n\t\tthis.visible = false;\n\t\tthis.announcedLabel = null;\n\t\tthis.domNodes?.element.classList.remove('visible');\n\t\tthis.editor.layoutContentWidget(this);\n\t}\n\n\tgetPosition(): IContentWidgetPosition | null {\n\t\tif (this.visible) {\n\t\t\treturn {\n\t\t\t\tposition: this.editor.getPosition(),\n\t\t\t\tpreference: [ContentWidgetPositionPreference.ABOVE, ContentWidgetPositionPreference.BELOW]\n\t\t\t};\n\t\t}\n\t\treturn null;\n\t}\n\n\tpublic render(hints: languages.SignatureHelp): void {\n\t\tthis.renderDisposeables.clear();\n\n\t\tif (!this.domNodes) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst multiple = hints.signatures.length > 1;\n\t\tthis.domNodes.element.classList.toggle('multiple', multiple);\n\t\tthis.keyMultipleSignatures.set(multiple);\n\n\t\tthis.domNodes.signature.innerText = '';\n\t\tthis.domNodes.docs.innerText = '';\n\n\t\tconst signature = hints.signatures[hints.activeSignature];\n\t\tif (!signature) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst code = dom.append(this.domNodes.signature, $('.code'));\n\t\tconst hasParameters = signature.parameters.length > 0;\n\t\tconst activeParameterIndex = signature.activeParameter ?? hints.activeParameter;\n\n\t\tif (!hasParameters) {\n\t\t\tconst label = dom.append(code, $('span'));\n\t\t\tlabel.textContent = signature.label;\n\t\t} else {\n\t\t\tthis.renderParameters(code, signature, activeParameterIndex);\n\t\t}\n\n\t\tconst activeParameter: languages.ParameterInformation | undefined = signature.parameters[activeParameterIndex];\n\t\tif (activeParameter?.documentation) {\n\t\t\tconst documentation = $('span.documentation');\n\t\t\tif (typeof activeParameter.documentation === 'string') {\n\t\t\t\tdocumentation.textContent = activeParameter.documentation;\n\t\t\t} else {\n\t\t\t\tconst renderedContents = this.renderMarkdownDocs(activeParameter.documentation);\n\t\t\t\tdocumentation.appendChild(renderedContents.element);\n\t\t\t}\n\t\t\tdom.append(this.domNodes.docs, $('p', {}, documentation));\n\t\t}\n\n\t\tif (signature.documentation === undefined) {\n\t\t\t/** no op */\n\t\t} else if (typeof signature.documentation === 'string') {\n\t\t\tdom.append(this.domNodes.docs, $('p', {}, signature.documentation));\n\t\t} else {\n\t\t\tconst renderedContents = this.renderMarkdownDocs(signature.documentation);\n\t\t\tdom.append(this.domNodes.docs, renderedContents.element);\n\t\t}\n\n\t\tconst hasDocs = this.hasDocs(signature, activeParameter);\n\n\t\tthis.domNodes.signature.classList.toggle('has-docs', hasDocs);\n\t\tthis.domNodes.docs.classList.toggle('empty', !hasDocs);\n\n\t\tthis.domNodes.overloads.textContent =\n\t\t\tString(hints.activeSignature + 1).padStart(hints.signatures.length.toString().length, '0') + '/' + hints.signatures.length;\n\n\t\tif (activeParameter) {\n\t\t\tlet labelToAnnounce = '';\n\t\t\tconst param = signature.parameters[activeParameterIndex];\n\t\t\tif (Array.isArray(param.label)) {\n\t\t\t\tlabelToAnnounce = signature.label.substring(param.label[0], param.label[1]);\n\t\t\t} else {\n\t\t\t\tlabelToAnnounce = param.label;\n\t\t\t}\n\t\t\tif (param.documentation) {\n\t\t\t\tlabelToAnnounce += typeof param.documentation === 'string' ? `, ${param.documentation}` : `, ${param.documentation.value}`;\n\t\t\t}\n\t\t\tif (signature.documentation) {\n\t\t\t\tlabelToAnnounce += typeof signature.documentation === 'string' ? `, ${signature.documentation}` : `, ${signature.documentation.value}`;\n\t\t\t}\n\n\t\t\t// Select method gets called on every user type while parameter hints are visible.\n\t\t\t// We do not want to spam the user with same announcements, so we only announce if the current parameter changed.\n\n\t\t\tif (this.announcedLabel !== labelToAnnounce) {\n\t\t\t\taria.alert(nls.localize('hint', \"{0}, hint\", labelToAnnounce));\n\t\t\t\tthis.announcedLabel = labelToAnnounce;\n\t\t\t}\n\t\t}\n\n\t\tthis.editor.layoutContentWidget(this);\n\t\tthis.domNodes.scrollbar.scanDomNode();\n\t}\n\n\tprivate renderMarkdownDocs(markdown: IMarkdownString): IRenderedMarkdown {\n\t\tconst renderedContents = this.renderDisposeables.add(this.markdownRendererService.render(markdown, {\n\t\t\tcontext: this.editor,\n\t\t\tasyncRenderCallback: () => {\n\t\t\t\tthis.domNodes?.scrollbar.scanDomNode();\n\t\t\t}\n\t\t}));\n\t\trenderedContents.element.classList.add('markdown-docs');\n\t\treturn renderedContents;\n\t}\n\n\tprivate hasDocs(signature: languages.SignatureInformation, activeParameter: languages.ParameterInformation | undefined): boolean {\n\t\tif (activeParameter && typeof activeParameter.documentation === 'string' && assertReturnsDefined(activeParameter.documentation).length > 0) {\n\t\t\treturn true;\n\t\t}\n\t\tif (activeParameter && typeof activeParameter.documentation === 'object' && assertReturnsDefined(activeParameter.documentation).value.length > 0) {\n\t\t\treturn true;\n\t\t}\n\t\tif (signature.documentation && typeof signature.documentation === 'string' && assertReturnsDefined(signature.documentation).length > 0) {\n\t\t\treturn true;\n\t\t}\n\t\tif (signature.documentation && typeof signature.documentation === 'object' && assertReturnsDefined(signature.documentation.value).length > 0) {\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n\n\tprivate renderParameters(parent: HTMLElement, signature: languages.SignatureInformation, activeParameterIndex: number): void {\n\t\tconst [start, end] = this.getParameterLabelOffsets(signature, activeParameterIndex);\n\n\t\tconst beforeSpan = document.createElement('span');\n\t\tbeforeSpan.textContent = signature.label.substring(0, start);\n\n\t\tconst paramSpan = document.createElement('span');\n\t\tparamSpan.textContent = signature.label.substring(start, end);\n\t\tparamSpan.className = 'parameter active';\n\n\t\tconst afterSpan = document.createElement('span');\n\t\tafterSpan.textContent = signature.label.substring(end);\n\n\t\tdom.append(parent, beforeSpan, paramSpan, afterSpan);\n\t}\n\n\tprivate getParameterLabelOffsets(signature: languages.SignatureInformation, paramIdx: number): [number, number] {\n\t\tconst param = signature.parameters[paramIdx];\n\t\tif (!param) {\n\t\t\treturn [0, 0];\n\t\t} else if (Array.isArray(param.label)) {\n\t\t\treturn param.label;\n\t\t} else if (!param.label.length) {\n\t\t\treturn [0, 0];\n\t\t} else {\n\t\t\tconst regex = new RegExp(`(\\\\W|^)${escapeRegExpCharacters(param.label)}(?=\\\\W|$)`, 'g');\n\t\t\tregex.test(signature.label);\n\t\t\tconst idx = regex.lastIndex - param.label.length;\n\t\t\treturn idx >= 0\n\t\t\t\t? [idx, regex.lastIndex]\n\t\t\t\t: [0, 0];\n\t\t}\n\t}\n\n\tnext(): void {\n\t\tthis.editor.focus();\n\t\tthis.model.next();\n\t}\n\n\tprevious(): void {\n\t\tthis.editor.focus();\n\t\tthis.model.previous();\n\t}\n\n\tgetDomNode(): HTMLElement {\n\t\tif (!this.domNodes) {\n\t\t\tthis.createParameterHintDOMNodes();\n\t\t}\n\t\treturn this.domNodes!.element;\n\t}\n\n\tgetId(): string {\n\t\treturn ParameterHintsWidget.ID;\n\t}\n\n\tprivate updateMaxHeight(): void {\n\t\tif (!this.domNodes) {\n\t\t\treturn;\n\t\t}\n\t\tconst height = Math.max(this.editor.getLayoutInfo().height / 4, 250);\n\t\tconst maxHeight = `${height}px`;\n\t\tthis.domNodes.element.style.maxHeight = maxHeight;\n\t\tconst wrapper = this.domNodes.element.getElementsByClassName('phwrapper') as HTMLCollectionOf<HTMLElement>;\n\t\tif (wrapper.length) {\n\t\t\twrapper[0].style.maxHeight = maxHeight;\n\t\t}\n\t}\n}\n\nregisterColor('editorHoverWidget.highlightForeground', listHighlightForeground, nls.localize('editorHoverWidgetHighlightForeground', 'Foreground color of the active item in the parameter hint.'));\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["file:///mnt/vss/_work/1/s/dependencies/vscode/out-editor-src/vs/editor/contrib/stickyScroll/browser/stickyScrollController.ts","vs/editor/contrib/stickyScroll/browser/stickyScrollController.ts"],"names":[],"mappings":"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","file":"stickyScrollController.js","sourceRoot":"file:///mnt/vss/_work/1/s/dependencies/vscode/out-editor-src","sourcesContent":["/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport { Disposable, DisposableStore, toDisposable } from '../../../../base/common/lifecycle.js';\nimport { IActiveCodeEditor, ICodeEditor, MouseTargetType } from '../../../browser/editorBrowser.js';\nimport { IEditorContribution, ScrollType } from '../../../common/editorCommon.js';\nimport { ILanguageFeaturesService } from '../../../common/services/languageFeatures.js';\nimport { EditorOption, RenderLineNumbersType, ConfigurationChangedEvent } from '../../../common/config/editorOptions.js';\nimport { StickyScrollWidget, StickyScrollWidgetState } from './stickyScrollWidget.js';\nimport { IStickyLineCandidateProvider, StickyLineCandidateProvider } from './stickyScrollProvider.js';\nimport { IModelTokensChangedEvent } from '../../../common/textModelEvents.js';\nimport { IInstantiationService } from '../../../../platform/instantiation/common/instantiation.js';\nimport { IContextMenuService } from '../../../../platform/contextview/browser/contextView.js';\nimport { MenuId } from '../../../../platform/actions/common/actions.js';\nimport { IContextKey, IContextKeyService } from '../../../../platform/contextkey/common/contextkey.js';\nimport { EditorContextKeys } from '../../../common/editorContextKeys.js';\nimport { ClickLinkGesture, ClickLinkMouseEvent } from '../../gotoSymbol/browser/link/clickLinkGesture.js';\nimport { IRange, Range } from '../../../common/core/range.js';\nimport { getDefinitionsAtPosition } from '../../gotoSymbol/browser/goToSymbol.js';\nimport { goToDefinitionWithLocation } from '../../inlayHints/browser/inlayHintsLocations.js';\nimport { IPosition, Position } from '../../../common/core/position.js';\nimport { CancellationTokenSource } from '../../../../base/common/cancellation.js';\nimport { ILanguageConfigurationService } from '../../../common/languages/languageConfigurationRegistry.js';\nimport { ILanguageFeatureDebounceService } from '../../../common/services/languageFeatureDebounce.js';\nimport * as dom from '../../../../base/browser/dom.js';\nimport { StickyRange } from './stickyScrollElement.js';\nimport { IMouseEvent, StandardMouseEvent } from '../../../../base/browser/mouseEvent.js';\nimport { FoldingController } from '../../folding/browser/folding.js';\nimport { FoldingModel, toggleCollapseState } from '../../folding/browser/foldingModel.js';\nimport { Emitter, Event } from '../../../../base/common/event.js';\nimport { mainWindow } from '../../../../base/browser/window.js';\n\nexport interface IStickyScrollController {\n\treadonly stickyScrollWidgetHeight: number;\n\tisFocused(): boolean;\n\tfocus(): void;\n\tfocusNext(): void;\n\tfocusPrevious(): void;\n\tgoToFocused(): void;\n\tdispose(): void;\n\tselectEditor(): void;\n\tonDidChangeStickyScrollHeight: Event<{ height: number }>;\n}\n\nexport class StickyScrollController extends Disposable implements IEditorContribution, IStickyScrollController {\n\n\tstatic readonly ID = 'store.contrib.stickyScrollController';\n\n\tprivate readonly _stickyScrollWidget: StickyScrollWidget;\n\tprivate readonly _stickyLineCandidateProvider: IStickyLineCandidateProvider;\n\tprivate readonly _sessionStore: DisposableStore = new DisposableStore();\n\n\tprivate _widgetState: StickyScrollWidgetState;\n\tprivate _foldingModel: FoldingModel | undefined;\n\tprivate _maxStickyLines: number = Number.MAX_SAFE_INTEGER;\n\n\tprivate _stickyRangeProjectedOnEditor: IRange | undefined;\n\tprivate _candidateDefinitionsLength: number = -1;\n\n\tprivate _stickyScrollFocusedContextKey: IContextKey<boolean>;\n\tprivate _stickyScrollVisibleContextKey: IContextKey<boolean>;\n\n\tprivate _focusDisposableStore: DisposableStore | undefined;\n\tprivate _focusedStickyElementIndex: number = -1;\n\tprivate _enabled = false;\n\tprivate _focused = false;\n\tprivate _positionRevealed = false;\n\tprivate _onMouseDown = false;\n\tprivate _endLineNumbers: number[] = [];\n\tprivate _showEndForLine: number | undefined;\n\tprivate _minRebuildFromLine: number | undefined;\n\tprivate _mouseTarget: EventTarget | null = null;\n\n\tprivate readonly _onDidChangeStickyScrollHeight = this._register(new Emitter<{ height: number }>());\n\tpublic readonly onDidChangeStickyScrollHeight = this._onDidChangeStickyScrollHeight.event;\n\n\tconstructor(\n\t\tprivate readonly _editor: ICodeEditor,\n\t\t@IContextMenuService private readonly _contextMenuService: IContextMenuService,\n\t\t@ILanguageFeaturesService private readonly _languageFeaturesService: ILanguageFeaturesService,\n\t\t@IInstantiationService private readonly _instaService: IInstantiationService,\n\t\t@ILanguageConfigurationService _languageConfigurationService: ILanguageConfigurationService,\n\t\t@ILanguageFeatureDebounceService _languageFeatureDebounceService: ILanguageFeatureDebounceService,\n\t\t@IContextKeyService private readonly _contextKeyService: IContextKeyService\n\t) {\n\t\tsuper();\n\t\tthis._stickyScrollWidget = new StickyScrollWidget(this._editor);\n\t\tthis._stickyLineCandidateProvider = new StickyLineCandidateProvider(this._editor, _languageFeaturesService, _languageConfigurationService);\n\t\tthis._register(this._stickyScrollWidget);\n\t\tthis._register(this._stickyLineCandidateProvider);\n\n\t\tthis._widgetState = StickyScrollWidgetState.Empty;\n\t\tconst stickyScrollDomNode = this._stickyScrollWidget.getDomNode();\n\t\tthis._register(this._editor.onDidChangeLineHeight((e) => {\n\t\t\te.changes.forEach((change) => {\n\t\t\t\tconst lineNumber = change.lineNumber;\n\t\t\t\tif (this._widgetState.startLineNumbers.includes(lineNumber)) {\n\t\t\t\t\tthis._renderStickyScroll(lineNumber);\n\t\t\t\t}\n\t\t\t});\n\t\t}));\n\t\tthis._register(this._editor.onDidChangeFont((e) => {\n\t\t\te.changes.forEach((change) => {\n\t\t\t\tconst lineNumber = change.lineNumber;\n\t\t\t\tif (this._widgetState.startLineNumbers.includes(lineNumber)) {\n\t\t\t\t\tthis._renderStickyScroll(lineNumber);\n\t\t\t\t}\n\t\t\t});\n\t\t}));\n\t\tthis._register(this._editor.onDidChangeConfiguration(e => {\n\t\t\tthis._readConfigurationChange(e);\n\t\t}));\n\t\tthis._register(dom.addDisposableListener(stickyScrollDomNode, dom.EventType.CONTEXT_MENU, async (event: MouseEvent) => {\n\t\t\tthis._onContextMenu(dom.getWindow(stickyScrollDomNode), event);\n\t\t}));\n\t\tthis._stickyScrollFocusedContextKey = EditorContextKeys.stickyScrollFocused.bindTo(this._contextKeyService);\n\t\tthis._stickyScrollVisibleContextKey = EditorContextKeys.stickyScrollVisible.bindTo(this._contextKeyService);\n\t\tconst focusTracker = this._register(dom.trackFocus(stickyScrollDomNode));\n\t\tthis._register(focusTracker.onDidBlur(_ => {\n\t\t\t// Suppose that the blurring is caused by scrolling, then keep the focus on the sticky scroll\n\t\t\t// This is determined by the fact that the height of the widget has become zero and there has been no position revealing\n\t\t\tif (this._positionRevealed === false && stickyScrollDomNode.clientHeight === 0) {\n\t\t\t\tthis._focusedStickyElementIndex = -1;\n\t\t\t\tthis.focus();\n\n\t\t\t}\n\t\t\t// In all other casees, dispose the focus on the sticky scroll\n\t\t\telse {\n\t\t\t\tthis._disposeFocusStickyScrollStore();\n\t\t\t}\n\t\t}));\n\t\tthis._register(focusTracker.onDidFocus(_ => {\n\t\t\tthis.focus();\n\t\t}));\n\t\tthis._registerMouseListeners();\n\t\t// Suppose that mouse down on the sticky scroll, then do not focus on the sticky scroll because this will be followed by the revealing of a position\n\t\tthis._register(dom.addDisposableListener(stickyScrollDomNode, dom.EventType.MOUSE_DOWN, (e) => {\n\t\t\tthis._onMouseDown = true;\n\t\t}));\n\t\tthis._register(this._stickyScrollWidget.onDidChangeStickyScrollHeight((e) => {\n\t\t\tthis._onDidChangeStickyScrollHeight.fire(e);\n\t\t}));\n\t\tthis._onDidResize();\n\t\tthis._readConfiguration();\n\t}\n\n\tget stickyScrollWidgetHeight(): number {\n\t\treturn this._stickyScrollWidget.height;\n\t}\n\n\tpublic static get(editor: ICodeEditor): IStickyScrollController | null {\n\t\treturn editor.getContribution<StickyScrollController>(StickyScrollController.ID);\n\t}\n\n\tprivate _disposeFocusStickyScrollStore() {\n\t\tthis._stickyScrollFocusedContextKey.set(false);\n\t\tthis._focusDisposableStore?.dispose();\n\t\tthis._focused = false;\n\t\tthis._positionRevealed = false;\n\t\tthis._onMouseDown = false;\n\t}\n\n\tpublic isFocused(): boolean {\n\t\treturn this._focused;\n\t}\n\n\tpublic focus(): void {\n\t\t// If the mouse is down, do not focus on the sticky scroll\n\t\tif (this._onMouseDown) {\n\t\t\tthis._onMouseDown = false;\n\t\t\tthis._editor.focus();\n\t\t\treturn;\n\t\t}\n\t\tconst focusState = this._stickyScrollFocusedContextKey.get();\n\t\tif (focusState === true) {\n\t\t\treturn;\n\t\t}\n\t\tthis._focused = true;\n\t\tthis._focusDisposableStore = new DisposableStore();\n\t\tthis._stickyScrollFocusedContextKey.set(true);\n\t\tthis._focusedStickyElementIndex = this._stickyScrollWidget.lineNumbers.length - 1;\n\t\tthis._stickyScrollWidget.focusLineWithIndex(this._focusedStickyElementIndex);\n\t}\n\n\tpublic focusNext(): void {\n\t\tif (this._focusedStickyElementIndex < this._stickyScrollWidget.lineNumberCount - 1) {\n\t\t\tthis._focusNav(true);\n\t\t}\n\t}\n\n\tpublic focusPrevious(): void {\n\t\tif (this._focusedStickyElementIndex > 0) {\n\t\t\tthis._focusNav(false);\n\t\t}\n\t}\n\n\tpublic selectEditor(): void {\n\t\tthis._editor.focus();\n\t}\n\n\t// True is next, false is previous\n\tprivate _focusNav(direction: boolean): void {\n\t\tthis._focusedStickyElementIndex = direction ? this._focusedStickyElementIndex + 1 : this._focusedStickyElementIndex - 1;\n\t\tthis._stickyScrollWidget.focusLineWithIndex(this._focusedStickyElementIndex);\n\t}\n\n\tpublic goToFocused(): void {\n\t\tconst lineNumbers = this._stickyScrollWidget.lineNumbers;\n\t\tthis._disposeFocusStickyScrollStore();\n\t\tthis._revealPosition({ lineNumber: lineNumbers[this._focusedStickyElementIndex], column: 1 });\n\t}\n\n\tprivate _revealPosition(position: IPosition): void {\n\t\tthis._reveaInEditor(position, () => this._editor.revealPosition(position));\n\t}\n\n\tprivate _revealLineInCenterIfOutsideViewport(position: IPosition): void {\n\t\tthis._reveaInEditor(position, () => this._editor.revealLineInCenterIfOutsideViewport(position.lineNumber, ScrollType.Smooth));\n\t}\n\n\tprivate _reveaInEditor(position: IPosition, revealFunction: () => void): void {\n\t\tif (this._focused) {\n\t\t\tthis._disposeFocusStickyScrollStore();\n\t\t}\n\t\tthis._positionRevealed = true;\n\t\trevealFunction();\n\t\tthis._editor.setSelection(Range.fromPositions(position));\n\t\tthis._editor.focus();\n\t}\n\n\tprivate _registerMouseListeners(): void {\n\n\t\tconst sessionStore = this._register(new DisposableStore());\n\t\tconst gesture = this._register(new ClickLinkGesture(this._editor, {\n\t\t\textractLineNumberFromMouseEvent: (e) => {\n\t\t\t\tconst position = this._stickyScrollWidget.getEditorPositionFromNode(e.target.element);\n\t\t\t\treturn position ? position.lineNumber : 0;\n\t\t\t}\n\t\t}));\n\n\t\tconst getMouseEventTarget = (mouseEvent: ClickLinkMouseEvent): { range: Range; textElement: HTMLElement } | null => {\n\t\t\tif (!this._editor.hasModel()) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\tif (mouseEvent.target.type !== MouseTargetType.OVERLAY_WIDGET || mouseEvent.target.detail !== this._stickyScrollWidget.getId()) {\n\t\t\t\t// not hovering over our widget\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\tconst mouseTargetElement = mouseEvent.target.element;\n\t\t\tif (!mouseTargetElement || mouseTargetElement.innerText !== mouseTargetElement.innerHTML) {\n\t\t\t\t// not on a span element rendering text\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\tconst position = this._stickyScrollWidget.getEditorPositionFromNode(mouseTargetElement);\n\t\t\tif (!position) {\n\t\t\t\t// not hovering a sticky scroll line\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\treturn {\n\t\t\t\trange: new Range(position.lineNumber, position.column, position.lineNumber, position.column + mouseTargetElement.innerText.length),\n\t\t\t\ttextElement: mouseTargetElement\n\t\t\t};\n\t\t};\n\n\t\tconst stickyScrollWidgetDomNode = this._stickyScrollWidget.getDomNode();\n\t\tthis._register(dom.addStandardDisposableListener(stickyScrollWidgetDomNode, dom.EventType.CLICK, (mouseEvent: IMouseEvent) => {\n\t\t\tif (mouseEvent.ctrlKey || mouseEvent.altKey || mouseEvent.metaKey) {\n\t\t\t\t// modifier pressed\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (!mouseEvent.leftButton) {\n\t\t\t\t// not left click\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (mouseEvent.shiftKey) {\n\t\t\t\t// shift click\n\t\t\t\tconst lineIndex = this._stickyScrollWidget.getLineIndexFromChildDomNode(mouseEvent.target);\n\t\t\t\tif (lineIndex === null) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tconst position = new Position(this._endLineNumbers[lineIndex], 1);\n\t\t\t\tthis._revealLineInCenterIfOutsideViewport(position);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst isInFoldingIconDomNode = this._stickyScrollWidget.isInFoldingIconDomNode(mouseEvent.target);\n\t\t\tif (isInFoldingIconDomNode) {\n\t\t\t\t// clicked on folding icon\n\t\t\t\tconst lineNumber = this._stickyScrollWidget.getLineNumberFromChildDomNode(mouseEvent.target);\n\t\t\t\tthis._toggleFoldingRegionForLine(lineNumber);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst isInStickyLine = this._stickyScrollWidget.isInStickyLine(mouseEvent.target);\n\t\t\tif (!isInStickyLine) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t// normal click\n\t\t\tlet position = this._stickyScrollWidget.getEditorPositionFromNode(mouseEvent.target);\n\t\t\tif (!position) {\n\t\t\t\tconst lineNumber = this._stickyScrollWidget.getLineNumberFromChildDomNode(mouseEvent.target);\n\t\t\t\tif (lineNumber === null) {\n\t\t\t\t\t// not hovering a sticky scroll line\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tposition = new Position(lineNumber, 1);\n\t\t\t}\n\t\t\tthis._revealPosition(position);\n\t\t}));\n\t\tthis._register(dom.addDisposableListener(mainWindow, dom.EventType.MOUSE_MOVE, mouseEvent => {\n\t\t\tthis._mouseTarget = mouseEvent.target;\n\t\t\tthis._onMouseMoveOrKeyDown(mouseEvent);\n\t\t}));\n\t\tthis._register(dom.addDisposableListener(mainWindow, dom.EventType.KEY_DOWN, mouseEvent => {\n\t\t\tthis._onMouseMoveOrKeyDown(mouseEvent);\n\t\t}));\n\t\tthis._register(dom.addDisposableListener(mainWindow, dom.EventType.KEY_UP, () => {\n\t\t\tif (this._showEndForLine !== undefined) {\n\t\t\t\tthis._showEndForLine = undefined;\n\t\t\t\tthis._renderStickyScroll();\n\t\t\t}\n\t\t}));\n\n\t\tthis._register(gesture.onMouseMoveOrRelevantKeyDown(([mouseEvent, _keyboardEvent]) => {\n\t\t\tconst mouseTarget = getMouseEventTarget(mouseEvent);\n\t\t\tif (!mouseTarget || !mouseEvent.hasTriggerModifier || !this._editor.hasModel()) {\n\t\t\t\tsessionStore.clear();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst { range, textElement } = mouseTarget;\n\n\t\t\tif (!range.equalsRange(this._stickyRangeProjectedOnEditor)) {\n\t\t\t\tthis._stickyRangeProjectedOnEditor = range;\n\t\t\t\tsessionStore.clear();\n\t\t\t} else if (textElement.style.textDecoration === 'underline') {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst cancellationToken = new CancellationTokenSource();\n\t\t\tsessionStore.add(toDisposable(() => cancellationToken.dispose(true)));\n\n\t\t\tlet currentHTMLChild: HTMLElement;\n\n\t\t\tgetDefinitionsAtPosition(this._languageFeaturesService.definitionProvider, this._editor.getModel(), new Position(range.startLineNumber, range.startColumn + 1), false, cancellationToken.token).then((candidateDefinitions => {\n\t\t\t\tif (cancellationToken.token.isCancellationRequested) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (candidateDefinitions.length !== 0) {\n\t\t\t\t\tthis._candidateDefinitionsLength = candidateDefinitions.length;\n\t\t\t\t\tconst childHTML: HTMLElement = textElement;\n\t\t\t\t\tif (currentHTMLChild !== childHTML) {\n\t\t\t\t\t\tsessionStore.clear();\n\t\t\t\t\t\tcurrentHTMLChild = childHTML;\n\t\t\t\t\t\tcurrentHTMLChild.style.textDecoration = 'underline';\n\t\t\t\t\t\tsessionStore.add(toDisposable(() => {\n\t\t\t\t\t\t\tcurrentHTMLChild.style.textDecoration = 'none';\n\t\t\t\t\t\t}));\n\t\t\t\t\t} else if (!currentHTMLChild) {\n\t\t\t\t\t\tcurrentHTMLChild = childHTML;\n\t\t\t\t\t\tcurrentHTMLChild.style.textDecoration = 'underline';\n\t\t\t\t\t\tsessionStore.add(toDisposable(() => {\n\t\t\t\t\t\t\tcurrentHTMLChild.style.textDecoration = 'none';\n\t\t\t\t\t\t}));\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tsessionStore.clear();\n\t\t\t\t}\n\t\t\t}));\n\t\t}));\n\t\tthis._register(gesture.onCancel(() => {\n\t\t\tsessionStore.clear();\n\t\t}));\n\t\tthis._register(gesture.onExecute(async e => {\n\t\t\tif (e.target.type !== MouseTargetType.OVERLAY_WIDGET || e.target.detail !== this._stickyScrollWidget.getId()) {\n\t\t\t\t// not hovering over our widget\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst position = this._stickyScrollWidget.getEditorPositionFromNode(e.target.element);\n\t\t\tif (!position) {\n\t\t\t\t// not hovering a sticky scroll line\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (!this._editor.hasModel() || !this._stickyRangeProjectedOnEditor) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (this._candidateDefinitionsLength > 1) {\n\t\t\t\tif (this._focused) {\n\t\t\t\t\tthis._disposeFocusStickyScrollStore();\n\t\t\t\t}\n\t\t\t\tthis._revealPosition({ lineNumber: position.lineNumber, column: 1 });\n\t\t\t}\n\t\t\tthis._instaService.invokeFunction(goToDefinitionWithLocation, e, this._editor as IActiveCodeEditor, { uri: this._editor.getModel().uri, range: this._stickyRangeProjectedOnEditor });\n\t\t}));\n\t}\n\n\tprivate _onContextMenu(targetWindow: Window, e: MouseEvent) {\n\t\tconst event = new StandardMouseEvent(targetWindow, e);\n\n\t\tthis._contextMenuService.showContextMenu({\n\t\t\tmenuId: MenuId.StickyScrollContext,\n\t\t\tgetAnchor: () => event,\n\t\t});\n\t}\n\n\tprivate _onMouseMoveOrKeyDown(mouseEvent: KeyboardEvent | MouseEvent): void {\n\t\tif (!mouseEvent.shiftKey) {\n\t\t\treturn;\n\t\t}\n\t\tif (!this._mouseTarget || !dom.isHTMLElement(this._mouseTarget)) {\n\t\t\treturn;\n\t\t}\n\t\tconst currentEndForLineIndex = this._stickyScrollWidget.getLineIndexFromChildDomNode(this._mouseTarget);\n\t\tif (currentEndForLineIndex === null || this._showEndForLine === currentEndForLineIndex) {\n\t\t\treturn;\n\t\t}\n\t\tthis._showEndForLine = currentEndForLineIndex;\n\t\tthis._renderStickyScroll();\n\t}\n\n\tprivate _toggleFoldingRegionForLine(line: number | null) {\n\t\tif (!this._foldingModel || line === null) {\n\t\t\treturn;\n\t\t}\n\t\tconst stickyLine = this._stickyScrollWidget.getRenderedStickyLine(line);\n\t\tconst foldingIcon = stickyLine?.foldingIcon;\n\t\tif (!foldingIcon) {\n\t\t\treturn;\n\t\t}\n\t\ttoggleCollapseState(this._foldingModel, 1, [line]);\n\t\tfoldingIcon.isCollapsed = !foldingIcon.isCollapsed;\n\t\tconst scrollTop = (foldingIcon.isCollapsed ?\n\t\t\tthis._editor.getTopForLineNumber(foldingIcon.foldingEndLine)\n\t\t\t: this._editor.getTopForLineNumber(foldingIcon.foldingStartLine))\n\t\t\t- this._editor.getOption(EditorOption.lineHeight) * stickyLine.index + 1;\n\t\tthis._editor.setScrollTop(scrollTop);\n\t\tthis._renderStickyScroll(line);\n\t}\n\n\tprivate _readConfiguration() {\n\t\tconst options = this._editor.getOption(EditorOption.stickyScroll);\n\t\tif (options.enabled === false) {\n\t\t\tthis._editor.removeOverlayWidget(this._stickyScrollWidget);\n\t\t\tthis._resetState();\n\t\t\tthis._sessionStore.clear();\n\t\t\tthis._enabled = false;\n\t\t\treturn;\n\t\t} else if (options.enabled && !this._enabled) {\n\t\t\t// When sticky scroll was just enabled, add the listeners on the sticky scroll\n\t\t\tthis._editor.addOverlayWidget(this._stickyScrollWidget);\n\t\t\tthis._sessionStore.add(this._editor.onDidScrollChange((e) => {\n\t\t\t\tif (e.scrollTopChanged) {\n\t\t\t\t\tthis._showEndForLine = undefined;\n\t\t\t\t\tthis._renderStickyScroll();\n\t\t\t\t}\n\t\t\t}));\n\t\t\tthis._sessionStore.add(this._editor.onDidLayoutChange(() => this._onDidResize()));\n\t\t\tthis._sessionStore.add(this._editor.onDidChangeModelTokens((e) => this._onTokensChange(e)));\n\t\t\tthis._sessionStore.add(this._stickyLineCandidateProvider.onDidChangeStickyScroll(() => {\n\t\t\t\tthis._showEndForLine = undefined;\n\t\t\t\tthis._renderStickyScroll();\n\t\t\t}));\n\t\t\tthis._enabled = true;\n\t\t}\n\n\t\tconst lineNumberOption = this._editor.getOption(EditorOption.lineNumbers);\n\t\tif (lineNumberOption.renderType === RenderLineNumbersType.Relative) {\n\t\t\tthis._sessionStore.add(this._editor.onDidChangeCursorPosition(() => {\n\t\t\t\tthis._showEndForLine = undefined;\n\t\t\t\tthis._renderStickyScroll(0);\n\t\t\t}));\n\t\t}\n\t}\n\n\tprivate _readConfigurationChange(event: ConfigurationChangedEvent) {\n\t\tif (\n\t\t\tevent.hasChanged(EditorOption.stickyScroll)\n\t\t\t|| event.hasChanged(EditorOption.minimap)\n\t\t\t|| event.hasChanged(EditorOption.lineHeight)\n\t\t\t|| event.hasChanged(EditorOption.showFoldingControls)\n\t\t\t|| event.hasChanged(EditorOption.lineNumbers)\n\t\t) {\n\t\t\tthis._readConfiguration();\n\t\t}\n\n\t\tif (event.hasChanged(EditorOption.lineNumbers) || event.hasChanged(EditorOption.folding) || event.hasChanged(EditorOption.showFoldingControls)) {\n\t\t\tthis._renderStickyScroll(0);\n\t\t}\n\t}\n\n\tprivate _needsUpdate(event: IModelTokensChangedEvent) {\n\t\tconst stickyLineNumbers = this._stickyScrollWidget.getCurrentLines();\n\t\tfor (const stickyLineNumber of stickyLineNumbers) {\n\t\t\tfor (const range of event.ranges) {\n\t\t\t\tif (stickyLineNumber >= range.fromLineNumber && stickyLineNumber <= range.toLineNumber) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t}\n\n\tprivate _onTokensChange(event: IModelTokensChangedEvent) {\n\t\tif (this._needsUpdate(event)) {\n\t\t\t// Rebuilding the whole widget from line 0\n\t\t\tthis._renderStickyScroll(0);\n\t\t}\n\t}\n\n\tprivate _onDidResize() {\n\t\tconst layoutInfo = this._editor.getLayoutInfo();\n\t\t// Make sure sticky scroll doesn't take up more than 25% of the editor\n\t\tconst theoreticalLines = layoutInfo.height / this._editor.getOption(EditorOption.lineHeight);\n\t\tthis._maxStickyLines = Math.round(theoreticalLines * .25);\n\t\tthis._renderStickyScroll(0);\n\t}\n\n\tprivate async _renderStickyScroll(rebuildFromLine?: number): Promise<void> {\n\t\tconst model = this._editor.getModel();\n\t\tif (!model || model.isTooLargeForTokenization()) {\n\t\t\tthis._resetState();\n\t\t\treturn;\n\t\t}\n\t\tconst nextRebuildFromLine = this._updateAndGetMinRebuildFromLine(rebuildFromLine);\n\t\tconst stickyWidgetVersion = this._stickyLineCandidateProvider.getVersionId();\n\t\tconst shouldUpdateState = stickyWidgetVersion === undefined || stickyWidgetVersion === model.getVersionId();\n\t\tif (shouldUpdateState) {\n\t\t\tif (!this._focused) {\n\t\t\t\tawait this._updateState(nextRebuildFromLine);\n\t\t\t} else {\n\t\t\t\t// Suppose that previously the sticky scroll widget had height 0, then if there are visible lines, set the last line as focused\n\t\t\t\tif (this._focusedStickyElementIndex === -1) {\n\t\t\t\t\tawait this._updateState(nextRebuildFromLine);\n\t\t\t\t\tthis._focusedStickyElementIndex = this._stickyScrollWidget.lineNumberCount - 1;\n\t\t\t\t\tif (this._focusedStickyElementIndex !== -1) {\n\t\t\t\t\t\tthis._stickyScrollWidget.focusLineWithIndex(this._focusedStickyElementIndex);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tconst focusedStickyElementLineNumber = this._stickyScrollWidget.lineNumbers[this._focusedStickyElementIndex];\n\t\t\t\t\tawait this._updateState(nextRebuildFromLine);\n\t\t\t\t\t// Suppose that after setting the state, there are no sticky lines, set the focused index to -1\n\t\t\t\t\tif (this._stickyScrollWidget.lineNumberCount === 0) {\n\t\t\t\t\t\tthis._focusedStickyElementIndex = -1;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconst previousFocusedLineNumberExists = this._stickyScrollWidget.lineNumbers.includes(focusedStickyElementLineNumber);\n\n\t\t\t\t\t\t// If the line number is still there, do not change anything\n\t\t\t\t\t\t// If the line number is not there, set the new focused line to be the last line\n\t\t\t\t\t\tif (!previousFocusedLineNumberExists) {\n\t\t\t\t\t\t\tthis._focusedStickyElementIndex = this._stickyScrollWidget.lineNumberCount - 1;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tthis._stickyScrollWidget.focusLineWithIndex(this._focusedStickyElementIndex);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate _updateAndGetMinRebuildFromLine(rebuildFromLine: number | undefined): number | undefined {\n\t\tif (rebuildFromLine !== undefined) {\n\t\t\tconst minRebuildFromLineOrInfinity = this._minRebuildFromLine !== undefined ? this._minRebuildFromLine : Infinity;\n\t\t\tthis._minRebuildFromLine = Math.min(rebuildFromLine, minRebuildFromLineOrInfinity);\n\t\t}\n\t\treturn this._minRebuildFromLine;\n\t}\n\n\tprivate async _updateState(rebuildFromLine?: number): Promise<void> {\n\t\tthis._minRebuildFromLine = undefined;\n\t\tthis._foldingModel = await FoldingController.get(this._editor)?.getFoldingModel() ?? undefined;\n\t\tthis._widgetState = this.findScrollWidgetState();\n\t\tconst stickyWidgetHasLines = this._widgetState.startLineNumbers.length > 0;\n\t\tthis._stickyScrollVisibleContextKey.set(stickyWidgetHasLines);\n\t\tthis._stickyScrollWidget.setState(this._widgetState, this._foldingModel, rebuildFromLine);\n\t}\n\n\tprivate async _resetState(): Promise<void> {\n\t\tthis._minRebuildFromLine = undefined;\n\t\tthis._foldingModel = undefined;\n\t\tthis._widgetState = StickyScrollWidgetState.Empty;\n\t\tthis._stickyScrollVisibleContextKey.set(false);\n\t\tthis._stickyScrollWidget.setState(undefined, undefined);\n\t}\n\n\tfindScrollWidgetState(): StickyScrollWidgetState {\n\t\tconst maxNumberStickyLines = Math.min(this._maxStickyLines, this._editor.getOption(EditorOption.stickyScroll).maxLineCount);\n\t\tconst scrollTop: number = this._editor.getScrollTop();\n\t\tlet lastLineRelativePosition: number = 0;\n\t\tconst startLineNumbers: number[] = [];\n\t\tconst endLineNumbers: number[] = [];\n\t\tconst arrayVisibleRanges = this._editor.getVisibleRanges();\n\t\tif (arrayVisibleRanges.length !== 0) {\n\t\t\tconst fullVisibleRange = new StickyRange(arrayVisibleRanges[0].startLineNumber, arrayVisibleRanges[arrayVisibleRanges.length - 1].endLineNumber);\n\t\t\tconst candidateRanges = this._stickyLineCandidateProvider.getCandidateStickyLinesIntersecting(fullVisibleRange);\n\t\t\tfor (const range of candidateRanges) {\n\t\t\t\tconst start = range.startLineNumber;\n\t\t\t\tconst end = range.endLineNumber;\n\t\t\t\tconst topOfElement = range.top;\n\t\t\t\tconst bottomOfElement = topOfElement + range.height;\n\t\t\t\tconst topOfBeginningLine = this._editor.getTopForLineNumber(start) - scrollTop;\n\t\t\t\tconst bottomOfEndLine = this._editor.getBottomForLineNumber(end) - scrollTop;\n\t\t\t\tif (topOfElement > topOfBeginningLine && topOfElement <= bottomOfEndLine) {\n\t\t\t\t\tstartLineNumbers.push(start);\n\t\t\t\t\tendLineNumbers.push(end + 1);\n\t\t\t\t\tif (bottomOfElement > bottomOfEndLine) {\n\t\t\t\t\t\tlastLineRelativePosition = bottomOfEndLine - bottomOfElement;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (startLineNumbers.length === maxNumberStickyLines) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tthis._endLineNumbers = endLineNumbers;\n\t\treturn new StickyScrollWidgetState(startLineNumbers, endLineNumbers, lastLineRelativePosition, this._showEndForLine);\n\t}\n\n\toverride dispose(): void {\n\t\tsuper.dispose();\n\t\tthis._sessionStore.dispose();\n\t}\n}\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport { Disposable, DisposableStore, toDisposable } from '../../../../base/common/lifecycle.js';\nimport { IActiveCodeEditor, ICodeEditor, MouseTargetType } from '../../../browser/editorBrowser.js';\nimport { IEditorContribution, ScrollType } from '../../../common/editorCommon.js';\nimport { ILanguageFeaturesService } from '../../../common/services/languageFeatures.js';\nimport { EditorOption, RenderLineNumbersType, ConfigurationChangedEvent } from '../../../common/config/editorOptions.js';\nimport { StickyScrollWidget, StickyScrollWidgetState } from './stickyScrollWidget.js';\nimport { IStickyLineCandidateProvider, StickyLineCandidateProvider } from './stickyScrollProvider.js';\nimport { IModelTokensChangedEvent } from '../../../common/textModelEvents.js';\nimport { IInstantiationService } from '../../../../platform/instantiation/common/instantiation.js';\nimport { IContextMenuService } from '../../../../platform/contextview/browser/contextView.js';\nimport { MenuId } from '../../../../platform/actions/common/actions.js';\nimport { IContextKey, IContextKeyService } from '../../../../platform/contextkey/common/contextkey.js';\nimport { EditorContextKeys } from '../../../common/editorContextKeys.js';\nimport { ClickLinkGesture, ClickLinkMouseEvent } from '../../gotoSymbol/browser/link/clickLinkGesture.js';\nimport { IRange, Range } from '../../../common/core/range.js';\nimport { getDefinitionsAtPosition } from '../../gotoSymbol/browser/goToSymbol.js';\nimport { goToDefinitionWithLocation } from '../../inlayHints/browser/inlayHintsLocations.js';\nimport { IPosition, Position } from '../../../common/core/position.js';\nimport { CancellationTokenSource } from '../../../../base/common/cancellation.js';\nimport { ILanguageConfigurationService } from '../../../common/languages/languageConfigurationRegistry.js';\nimport { ILanguageFeatureDebounceService } from '../../../common/services/languageFeatureDebounce.js';\nimport * as dom from '../../../../base/browser/dom.js';\nimport { StickyRange } from './stickyScrollElement.js';\nimport { IMouseEvent, StandardMouseEvent } from '../../../../base/browser/mouseEvent.js';\nimport { FoldingController } from '../../folding/browser/folding.js';\nimport { FoldingModel, toggleCollapseState } from '../../folding/browser/foldingModel.js';\nimport { Emitter, Event } from '../../../../base/common/event.js';\nimport { mainWindow } from '../../../../base/browser/window.js';\n\nexport interface IStickyScrollController {\n\treadonly stickyScrollWidgetHeight: number;\n\tisFocused(): boolean;\n\tfocus(): void;\n\tfocusNext(): void;\n\tfocusPrevious(): void;\n\tgoToFocused(): void;\n\tdispose(): void;\n\tselectEditor(): void;\n\tonDidChangeStickyScrollHeight: Event<{ height: number }>;\n}\n\nexport class StickyScrollController extends Disposable implements IEditorContribution, IStickyScrollController {\n\n\tstatic readonly ID = 'store.contrib.stickyScrollController';\n\n\tprivate readonly _stickyScrollWidget: StickyScrollWidget;\n\tprivate readonly _stickyLineCandidateProvider: IStickyLineCandidateProvider;\n\tprivate readonly _sessionStore: DisposableStore = new DisposableStore();\n\n\tprivate _widgetState: StickyScrollWidgetState;\n\tprivate _foldingModel: FoldingModel | undefined;\n\tprivate _maxStickyLines: number = Number.MAX_SAFE_INTEGER;\n\n\tprivate _stickyRangeProjectedOnEditor: IRange | undefined;\n\tprivate _candidateDefinitionsLength: number = -1;\n\n\tprivate _stickyScrollFocusedContextKey: IContextKey<boolean>;\n\tprivate _stickyScrollVisibleContextKey: IContextKey<boolean>;\n\n\tprivate _focusDisposableStore: DisposableStore | undefined;\n\tprivate _focusedStickyElementIndex: number = -1;\n\tprivate _enabled = false;\n\tprivate _focused = false;\n\tprivate _positionRevealed = false;\n\tprivate _onMouseDown = false;\n\tprivate _endLineNumbers: number[] = [];\n\tprivate _showEndForLine: number | undefined;\n\tprivate _minRebuildFromLine: number | undefined;\n\tprivate _mouseTarget: EventTarget | null = null;\n\n\tprivate readonly _onDidChangeStickyScrollHeight = this._register(new Emitter<{ height: number }>());\n\tpublic readonly onDidChangeStickyScrollHeight = this._onDidChangeStickyScrollHeight.event;\n\n\tconstructor(\n\t\tprivate readonly _editor: ICodeEditor,\n\t\t@IContextMenuService private readonly _contextMenuService: IContextMenuService,\n\t\t@ILanguageFeaturesService private readonly _languageFeaturesService: ILanguageFeaturesService,\n\t\t@IInstantiationService private readonly _instaService: IInstantiationService,\n\t\t@ILanguageConfigurationService _languageConfigurationService: ILanguageConfigurationService,\n\t\t@ILanguageFeatureDebounceService _languageFeatureDebounceService: ILanguageFeatureDebounceService,\n\t\t@IContextKeyService private readonly _contextKeyService: IContextKeyService\n\t) {\n\t\tsuper();\n\t\tthis._stickyScrollWidget = new StickyScrollWidget(this._editor);\n\t\tthis._stickyLineCandidateProvider = new StickyLineCandidateProvider(this._editor, _languageFeaturesService, _languageConfigurationService);\n\t\tthis._register(this._stickyScrollWidget);\n\t\tthis._register(this._stickyLineCandidateProvider);\n\n\t\tthis._widgetState = StickyScrollWidgetState.Empty;\n\t\tconst stickyScrollDomNode = this._stickyScrollWidget.getDomNode();\n\t\tthis._register(this._editor.onDidChangeLineHeight((e) => {\n\t\t\te.changes.forEach((change) => {\n\t\t\t\tconst lineNumber = change.lineNumber;\n\t\t\t\tif (this._widgetState.startLineNumbers.includes(lineNumber)) {\n\t\t\t\t\tthis._renderStickyScroll(lineNumber);\n\t\t\t\t}\n\t\t\t});\n\t\t}));\n\t\tthis._register(this._editor.onDidChangeFont((e) => {\n\t\t\te.changes.forEach((change) => {\n\t\t\t\tconst lineNumber = change.lineNumber;\n\t\t\t\tif (this._widgetState.startLineNumbers.includes(lineNumber)) {\n\t\t\t\t\tthis._renderStickyScroll(lineNumber);\n\t\t\t\t}\n\t\t\t});\n\t\t}));\n\t\tthis._register(this._editor.onDidChangeConfiguration(e => {\n\t\t\tthis._readConfigurationChange(e);\n\t\t}));\n\t\tthis._register(dom.addDisposableListener(stickyScrollDomNode, dom.EventType.CONTEXT_MENU, async (event: MouseEvent) => {\n\t\t\tthis._onContextMenu(dom.getWindow(stickyScrollDomNode), event);\n\t\t}));\n\t\tthis._stickyScrollFocusedContextKey = EditorContextKeys.stickyScrollFocused.bindTo(this._contextKeyService);\n\t\tthis._stickyScrollVisibleContextKey = EditorContextKeys.stickyScrollVisible.bindTo(this._contextKeyService);\n\t\tconst focusTracker = this._register(dom.trackFocus(stickyScrollDomNode));\n\t\tthis._register(focusTracker.onDidBlur(_ => {\n\t\t\t// Suppose that the blurring is caused by scrolling, then keep the focus on the sticky scroll\n\t\t\t// This is determined by the fact that the height of the widget has become zero and there has been no position revealing\n\t\t\tif (this._positionRevealed === false && stickyScrollDomNode.clientHeight === 0) {\n\t\t\t\tthis._focusedStickyElementIndex = -1;\n\t\t\t\tthis.focus();\n\n\t\t\t}\n\t\t\t// In all other casees, dispose the focus on the sticky scroll\n\t\t\telse {\n\t\t\t\tthis._disposeFocusStickyScrollStore();\n\t\t\t}\n\t\t}));\n\t\tthis._register(focusTracker.onDidFocus(_ => {\n\t\t\tthis.focus();\n\t\t}));\n\t\tthis._registerMouseListeners();\n\t\t// Suppose that mouse down on the sticky scroll, then do not focus on the sticky scroll because this will be followed by the revealing of a position\n\t\tthis._register(dom.addDisposableListener(stickyScrollDomNode, dom.EventType.MOUSE_DOWN, (e) => {\n\t\t\tthis._onMouseDown = true;\n\t\t}));\n\t\tthis._register(this._stickyScrollWidget.onDidChangeStickyScrollHeight((e) => {\n\t\t\tthis._onDidChangeStickyScrollHeight.fire(e);\n\t\t}));\n\t\tthis._onDidResize();\n\t\tthis._readConfiguration();\n\t}\n\n\tget stickyScrollWidgetHeight(): number {\n\t\treturn this._stickyScrollWidget.height;\n\t}\n\n\tpublic static get(editor: ICodeEditor): IStickyScrollController | null {\n\t\treturn editor.getContribution<StickyScrollController>(StickyScrollController.ID);\n\t}\n\n\tprivate _disposeFocusStickyScrollStore() {\n\t\tthis._stickyScrollFocusedContextKey.set(false);\n\t\tthis._focusDisposableStore?.dispose();\n\t\tthis._focused = false;\n\t\tthis._positionRevealed = false;\n\t\tthis._onMouseDown = false;\n\t}\n\n\tpublic isFocused(): boolean {\n\t\treturn this._focused;\n\t}\n\n\tpublic focus(): void {\n\t\t// If the mouse is down, do not focus on the sticky scroll\n\t\tif (this._onMouseDown) {\n\t\t\tthis._onMouseDown = false;\n\t\t\tthis._editor.focus();\n\t\t\treturn;\n\t\t}\n\t\tconst focusState = this._stickyScrollFocusedContextKey.get();\n\t\tif (focusState === true) {\n\t\t\treturn;\n\t\t}\n\t\tthis._focused = true;\n\t\tthis._focusDisposableStore = new DisposableStore();\n\t\tthis._stickyScrollFocusedContextKey.set(true);\n\t\tthis._focusedStickyElementIndex = this._stickyScrollWidget.lineNumbers.length - 1;\n\t\tthis._stickyScrollWidget.focusLineWithIndex(this._focusedStickyElementIndex);\n\t}\n\n\tpublic focusNext(): void {\n\t\tif (this._focusedStickyElementIndex < this._stickyScrollWidget.lineNumberCount - 1) {\n\t\t\tthis._focusNav(true);\n\t\t}\n\t}\n\n\tpublic focusPrevious(): void {\n\t\tif (this._focusedStickyElementIndex > 0) {\n\t\t\tthis._focusNav(false);\n\t\t}\n\t}\n\n\tpublic selectEditor(): void {\n\t\tthis._editor.focus();\n\t}\n\n\t// True is next, false is previous\n\tprivate _focusNav(direction: boolean): void {\n\t\tthis._focusedStickyElementIndex = direction ? this._focusedStickyElementIndex + 1 : this._focusedStickyElementIndex - 1;\n\t\tthis._stickyScrollWidget.focusLineWithIndex(this._focusedStickyElementIndex);\n\t}\n\n\tpublic goToFocused(): void {\n\t\tconst lineNumbers = this._stickyScrollWidget.lineNumbers;\n\t\tthis._disposeFocusStickyScrollStore();\n\t\tthis._revealPosition({ lineNumber: lineNumbers[this._focusedStickyElementIndex], column: 1 });\n\t}\n\n\tprivate _revealPosition(position: IPosition): void {\n\t\tthis._reveaInEditor(position, () => this._editor.revealPosition(position));\n\t}\n\n\tprivate _revealLineInCenterIfOutsideViewport(position: IPosition): void {\n\t\tthis._reveaInEditor(position, () => this._editor.revealLineInCenterIfOutsideViewport(position.lineNumber, ScrollType.Smooth));\n\t}\n\n\tprivate _reveaInEditor(position: IPosition, revealFunction: () => void): void {\n\t\tif (this._focused) {\n\t\t\tthis._disposeFocusStickyScrollStore();\n\t\t}\n\t\tthis._positionRevealed = true;\n\t\trevealFunction();\n\t\tthis._editor.setSelection(Range.fromPositions(position));\n\t\tthis._editor.focus();\n\t}\n\n\tprivate _registerMouseListeners(): void {\n\n\t\tconst sessionStore = this._register(new DisposableStore());\n\t\tconst gesture = this._register(new ClickLinkGesture(this._editor, {\n\t\t\textractLineNumberFromMouseEvent: (e) => {\n\t\t\t\tconst position = this._stickyScrollWidget.getEditorPositionFromNode(e.target.element);\n\t\t\t\treturn position ? position.lineNumber : 0;\n\t\t\t}\n\t\t}));\n\n\t\tconst getMouseEventTarget = (mouseEvent: ClickLinkMouseEvent): { range: Range; textElement: HTMLElement } | null => {\n\t\t\tif (!this._editor.hasModel()) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\tif (mouseEvent.target.type !== MouseTargetType.OVERLAY_WIDGET || mouseEvent.target.detail !== this._stickyScrollWidget.getId()) {\n\t\t\t\t// not hovering over our widget\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\tconst mouseTargetElement = mouseEvent.target.element;\n\t\t\tif (!mouseTargetElement || mouseTargetElement.innerText !== mouseTargetElement.innerHTML) {\n\t\t\t\t// not on a span element rendering text\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\tconst position = this._stickyScrollWidget.getEditorPositionFromNode(mouseTargetElement);\n\t\t\tif (!position) {\n\t\t\t\t// not hovering a sticky scroll line\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\treturn {\n\t\t\t\trange: new Range(position.lineNumber, position.column, position.lineNumber, position.column + mouseTargetElement.innerText.length),\n\t\t\t\ttextElement: mouseTargetElement\n\t\t\t};\n\t\t};\n\n\t\tconst stickyScrollWidgetDomNode = this._stickyScrollWidget.getDomNode();\n\t\tthis._register(dom.addStandardDisposableListener(stickyScrollWidgetDomNode, dom.EventType.CLICK, (mouseEvent: IMouseEvent) => {\n\t\t\tif (mouseEvent.ctrlKey || mouseEvent.altKey || mouseEvent.metaKey) {\n\t\t\t\t// modifier pressed\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (!mouseEvent.leftButton) {\n\t\t\t\t// not left click\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (mouseEvent.shiftKey) {\n\t\t\t\t// shift click\n\t\t\t\tconst lineIndex = this._stickyScrollWidget.getLineIndexFromChildDomNode(mouseEvent.target);\n\t\t\t\tif (lineIndex === null) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tconst position = new Position(this._endLineNumbers[lineIndex], 1);\n\t\t\t\tthis._revealLineInCenterIfOutsideViewport(position);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst isInFoldingIconDomNode = this._stickyScrollWidget.isInFoldingIconDomNode(mouseEvent.target);\n\t\t\tif (isInFoldingIconDomNode) {\n\t\t\t\t// clicked on folding icon\n\t\t\t\tconst lineNumber = this._stickyScrollWidget.getLineNumberFromChildDomNode(mouseEvent.target);\n\t\t\t\tthis._toggleFoldingRegionForLine(lineNumber);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst isInStickyLine = this._stickyScrollWidget.isInStickyLine(mouseEvent.target);\n\t\t\tif (!isInStickyLine) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t// normal click\n\t\t\tlet position = this._stickyScrollWidget.getEditorPositionFromNode(mouseEvent.target);\n\t\t\tif (!position) {\n\t\t\t\tconst lineNumber = this._stickyScrollWidget.getLineNumberFromChildDomNode(mouseEvent.target);\n\t\t\t\tif (lineNumber === null) {\n\t\t\t\t\t// not hovering a sticky scroll line\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tposition = new Position(lineNumber, 1);\n\t\t\t}\n\t\t\tthis._revealPosition(position);\n\t\t}));\n\t\tthis._register(dom.addDisposableListener(mainWindow, dom.EventType.MOUSE_MOVE, mouseEvent => {\n\t\t\tthis._mouseTarget = mouseEvent.target;\n\t\t\tthis._onMouseMoveOrKeyDown(mouseEvent);\n\t\t}));\n\t\tthis._register(dom.addDisposableListener(mainWindow, dom.EventType.KEY_DOWN, mouseEvent => {\n\t\t\tthis._onMouseMoveOrKeyDown(mouseEvent);\n\t\t}));\n\t\tthis._register(dom.addDisposableListener(mainWindow, dom.EventType.KEY_UP, () => {\n\t\t\tif (this._showEndForLine !== undefined) {\n\t\t\t\tthis._showEndForLine = undefined;\n\t\t\t\tthis._renderStickyScroll();\n\t\t\t}\n\t\t}));\n\n\t\tthis._register(gesture.onMouseMoveOrRelevantKeyDown(([mouseEvent, _keyboardEvent]) => {\n\t\t\tconst mouseTarget = getMouseEventTarget(mouseEvent);\n\t\t\tif (!mouseTarget || !mouseEvent.hasTriggerModifier || !this._editor.hasModel()) {\n\t\t\t\tsessionStore.clear();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst { range, textElement } = mouseTarget;\n\n\t\t\tif (!range.equalsRange(this._stickyRangeProjectedOnEditor)) {\n\t\t\t\tthis._stickyRangeProjectedOnEditor = range;\n\t\t\t\tsessionStore.clear();\n\t\t\t} else if (textElement.style.textDecoration === 'underline') {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst cancellationToken = new CancellationTokenSource();\n\t\t\tsessionStore.add(toDisposable(() => cancellationToken.dispose(true)));\n\n\t\t\tlet currentHTMLChild: HTMLElement;\n\n\t\t\tgetDefinitionsAtPosition(this._languageFeaturesService.definitionProvider, this._editor.getModel(), new Position(range.startLineNumber, range.startColumn + 1), false, cancellationToken.token).then((candidateDefinitions => {\n\t\t\t\tif (cancellationToken.token.isCancellationRequested) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (candidateDefinitions.length !== 0) {\n\t\t\t\t\tthis._candidateDefinitionsLength = candidateDefinitions.length;\n\t\t\t\t\tconst childHTML: HTMLElement = textElement;\n\t\t\t\t\tif (currentHTMLChild !== childHTML) {\n\t\t\t\t\t\tsessionStore.clear();\n\t\t\t\t\t\tcurrentHTMLChild = childHTML;\n\t\t\t\t\t\tcurrentHTMLChild.style.textDecoration = 'underline';\n\t\t\t\t\t\tsessionStore.add(toDisposable(() => {\n\t\t\t\t\t\t\tcurrentHTMLChild.style.textDecoration = 'none';\n\t\t\t\t\t\t}));\n\t\t\t\t\t} else if (!currentHTMLChild) {\n\t\t\t\t\t\tcurrentHTMLChild = childHTML;\n\t\t\t\t\t\tcurrentHTMLChild.style.textDecoration = 'underline';\n\t\t\t\t\t\tsessionStore.add(toDisposable(() => {\n\t\t\t\t\t\t\tcurrentHTMLChild.style.textDecoration = 'none';\n\t\t\t\t\t\t}));\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tsessionStore.clear();\n\t\t\t\t}\n\t\t\t}));\n\t\t}));\n\t\tthis._register(gesture.onCancel(() => {\n\t\t\tsessionStore.clear();\n\t\t}));\n\t\tthis._register(gesture.onExecute(async e => {\n\t\t\tif (e.target.type !== MouseTargetType.OVERLAY_WIDGET || e.target.detail !== this._stickyScrollWidget.getId()) {\n\t\t\t\t// not hovering over our widget\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst position = this._stickyScrollWidget.getEditorPositionFromNode(e.target.element);\n\t\t\tif (!position) {\n\t\t\t\t// not hovering a sticky scroll line\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (!this._editor.hasModel() || !this._stickyRangeProjectedOnEditor) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (this._candidateDefinitionsLength > 1) {\n\t\t\t\tif (this._focused) {\n\t\t\t\t\tthis._disposeFocusStickyScrollStore();\n\t\t\t\t}\n\t\t\t\tthis._revealPosition({ lineNumber: position.lineNumber, column: 1 });\n\t\t\t}\n\t\t\tthis._instaService.invokeFunction(goToDefinitionWithLocation, e, this._editor as IActiveCodeEditor, { uri: this._editor.getModel().uri, range: this._stickyRangeProjectedOnEditor });\n\t\t}));\n\t}\n\n\tprivate _onContextMenu(targetWindow: Window, e: MouseEvent) {\n\t\tconst event = new StandardMouseEvent(targetWindow, e);\n\n\t\tthis._contextMenuService.showContextMenu({\n\t\t\tmenuId: MenuId.StickyScrollContext,\n\t\t\tgetAnchor: () => event,\n\t\t});\n\t}\n\n\tprivate _onMouseMoveOrKeyDown(mouseEvent: KeyboardEvent | MouseEvent): void {\n\t\tif (!mouseEvent.shiftKey) {\n\t\t\treturn;\n\t\t}\n\t\tif (!this._mouseTarget || !dom.isHTMLElement(this._mouseTarget)) {\n\t\t\treturn;\n\t\t}\n\t\tconst currentEndForLineIndex = this._stickyScrollWidget.getLineIndexFromChildDomNode(this._mouseTarget);\n\t\tif (currentEndForLineIndex === null || this._showEndForLine === currentEndForLineIndex) {\n\t\t\treturn;\n\t\t}\n\t\tthis._showEndForLine = currentEndForLineIndex;\n\t\tthis._renderStickyScroll();\n\t}\n\n\tprivate _toggleFoldingRegionForLine(line: number | null) {\n\t\tif (!this._foldingModel || line === null) {\n\t\t\treturn;\n\t\t}\n\t\tconst stickyLine = this._stickyScrollWidget.getRenderedStickyLine(line);\n\t\tconst foldingIcon = stickyLine?.foldingIcon;\n\t\tif (!foldingIcon) {\n\t\t\treturn;\n\t\t}\n\t\ttoggleCollapseState(this._foldingModel, 1, [line]);\n\t\tfoldingIcon.isCollapsed = !foldingIcon.isCollapsed;\n\t\tconst scrollTop = (foldingIcon.isCollapsed ?\n\t\t\tthis._editor.getTopForLineNumber(foldingIcon.foldingEndLine)\n\t\t\t: this._editor.getTopForLineNumber(foldingIcon.foldingStartLine))\n\t\t\t- this._editor.getOption(EditorOption.lineHeight) * stickyLine.index + 1;\n\t\tthis._editor.setScrollTop(scrollTop);\n\t\tthis._renderStickyScroll(line);\n\t}\n\n\tprivate _readConfiguration() {\n\t\tconst options = this._editor.getOption(EditorOption.stickyScroll);\n\t\tif (options.enabled === false) {\n\t\t\tthis._editor.removeOverlayWidget(this._stickyScrollWidget);\n\t\t\tthis._resetState();\n\t\t\tthis._sessionStore.clear();\n\t\t\tthis._enabled = false;\n\t\t\treturn;\n\t\t} else if (options.enabled && !this._enabled) {\n\t\t\t// When sticky scroll was just enabled, add the listeners on the sticky scroll\n\t\t\tthis._editor.addOverlayWidget(this._stickyScrollWidget);\n\t\t\tthis._sessionStore.add(this._editor.onDidScrollChange((e) => {\n\t\t\t\tif (e.scrollTopChanged) {\n\t\t\t\t\tthis._showEndForLine = undefined;\n\t\t\t\t\tthis._renderStickyScroll();\n\t\t\t\t}\n\t\t\t}));\n\t\t\tthis._sessionStore.add(this._editor.onDidLayoutChange(() => this._onDidResize()));\n\t\t\tthis._sessionStore.add(this._editor.onDidChangeModelTokens((e) => this._onTokensChange(e)));\n\t\t\tthis._sessionStore.add(this._stickyLineCandidateProvider.onDidChangeStickyScroll(() => {\n\t\t\t\tthis._showEndForLine = undefined;\n\t\t\t\tthis._renderStickyScroll();\n\t\t\t}));\n\t\t\tthis._enabled = true;\n\t\t}\n\n\t\tconst lineNumberOption = this._editor.getOption(EditorOption.lineNumbers);\n\t\tif (lineNumberOption.renderType === RenderLineNumbersType.Relative) {\n\t\t\tthis._sessionStore.add(this._editor.onDidChangeCursorPosition(() => {\n\t\t\t\tthis._showEndForLine = undefined;\n\t\t\t\tthis._renderStickyScroll(0);\n\t\t\t}));\n\t\t}\n\t}\n\n\tprivate _readConfigurationChange(event: ConfigurationChangedEvent) {\n\t\tif (\n\t\t\tevent.hasChanged(EditorOption.stickyScroll)\n\t\t\t|| event.hasChanged(EditorOption.minimap)\n\t\t\t|| event.hasChanged(EditorOption.lineHeight)\n\t\t\t|| event.hasChanged(EditorOption.showFoldingControls)\n\t\t\t|| event.hasChanged(EditorOption.lineNumbers)\n\t\t) {\n\t\t\tthis._readConfiguration();\n\t\t}\n\n\t\tif (event.hasChanged(EditorOption.lineNumbers) || event.hasChanged(EditorOption.folding) || event.hasChanged(EditorOption.showFoldingControls)) {\n\t\t\tthis._renderStickyScroll(0);\n\t\t}\n\t}\n\n\tprivate _needsUpdate(event: IModelTokensChangedEvent) {\n\t\tconst stickyLineNumbers = this._stickyScrollWidget.getCurrentLines();\n\t\tfor (const stickyLineNumber of stickyLineNumbers) {\n\t\t\tfor (const range of event.ranges) {\n\t\t\t\tif (stickyLineNumber >= range.fromLineNumber && stickyLineNumber <= range.toLineNumber) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t}\n\n\tprivate _onTokensChange(event: IModelTokensChangedEvent) {\n\t\tif (this._needsUpdate(event)) {\n\t\t\t// Rebuilding the whole widget from line 0\n\t\t\tthis._renderStickyScroll(0);\n\t\t}\n\t}\n\n\tprivate _onDidResize() {\n\t\tconst layoutInfo = this._editor.getLayoutInfo();\n\t\t// Make sure sticky scroll doesn't take up more than 25% of the editor\n\t\tconst theoreticalLines = layoutInfo.height / this._editor.getOption(EditorOption.lineHeight);\n\t\tthis._maxStickyLines = Math.round(theoreticalLines * .25);\n\t\tthis._renderStickyScroll(0);\n\t}\n\n\tprivate async _renderStickyScroll(rebuildFromLine?: number): Promise<void> {\n\t\tconst model = this._editor.getModel();\n\t\tif (!model || model.isTooLargeForTokenization()) {\n\t\t\tthis._resetState();\n\t\t\treturn;\n\t\t}\n\t\tconst nextRebuildFromLine = this._updateAndGetMinRebuildFromLine(rebuildFromLine);\n\t\tconst stickyWidgetVersion = this._stickyLineCandidateProvider.getVersionId();\n\t\tconst shouldUpdateState = stickyWidgetVersion === undefined || stickyWidgetVersion === model.getVersionId();\n\t\tif (shouldUpdateState) {\n\t\t\tif (!this._focused) {\n\t\t\t\tawait this._updateState(nextRebuildFromLine);\n\t\t\t} else {\n\t\t\t\t// Suppose that previously the sticky scroll widget had height 0, then if there are visible lines, set the last line as focused\n\t\t\t\tif (this._focusedStickyElementIndex === -1) {\n\t\t\t\t\tawait this._updateState(nextRebuildFromLine);\n\t\t\t\t\tthis._focusedStickyElementIndex = this._stickyScrollWidget.lineNumberCount - 1;\n\t\t\t\t\tif (this._focusedStickyElementIndex !== -1) {\n\t\t\t\t\t\tthis._stickyScrollWidget.focusLineWithIndex(this._focusedStickyElementIndex);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tconst focusedStickyElementLineNumber = this._stickyScrollWidget.lineNumbers[this._focusedStickyElementIndex];\n\t\t\t\t\tawait this._updateState(nextRebuildFromLine);\n\t\t\t\t\t// Suppose that after setting the state, there are no sticky lines, set the focused index to -1\n\t\t\t\t\tif (this._stickyScrollWidget.lineNumberCount === 0) {\n\t\t\t\t\t\tthis._focusedStickyElementIndex = -1;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconst previousFocusedLineNumberExists = this._stickyScrollWidget.lineNumbers.includes(focusedStickyElementLineNumber);\n\n\t\t\t\t\t\t// If the line number is still there, do not change anything\n\t\t\t\t\t\t// If the line number is not there, set the new focused line to be the last line\n\t\t\t\t\t\tif (!previousFocusedLineNumberExists) {\n\t\t\t\t\t\t\tthis._focusedStickyElementIndex = this._stickyScrollWidget.lineNumberCount - 1;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tthis._stickyScrollWidget.focusLineWithIndex(this._focusedStickyElementIndex);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate _updateAndGetMinRebuildFromLine(rebuildFromLine: number | undefined): number | undefined {\n\t\tif (rebuildFromLine !== undefined) {\n\t\t\tconst minRebuildFromLineOrInfinity = this._minRebuildFromLine !== undefined ? this._minRebuildFromLine : Infinity;\n\t\t\tthis._minRebuildFromLine = Math.min(rebuildFromLine, minRebuildFromLineOrInfinity);\n\t\t}\n\t\treturn this._minRebuildFromLine;\n\t}\n\n\tprivate async _updateState(rebuildFromLine?: number): Promise<void> {\n\t\tthis._minRebuildFromLine = undefined;\n\t\tthis._foldingModel = await FoldingController.get(this._editor)?.getFoldingModel() ?? undefined;\n\t\tthis._widgetState = this.findScrollWidgetState();\n\t\tconst stickyWidgetHasLines = this._widgetState.startLineNumbers.length > 0;\n\t\tthis._stickyScrollVisibleContextKey.set(stickyWidgetHasLines);\n\t\tthis._stickyScrollWidget.setState(this._widgetState, this._foldingModel, rebuildFromLine);\n\t}\n\n\tprivate async _resetState(): Promise<void> {\n\t\tthis._minRebuildFromLine = undefined;\n\t\tthis._foldingModel = undefined;\n\t\tthis._widgetState = StickyScrollWidgetState.Empty;\n\t\tthis._stickyScrollVisibleContextKey.set(false);\n\t\tthis._stickyScrollWidget.setState(undefined, undefined);\n\t}\n\n\tfindScrollWidgetState(): StickyScrollWidgetState {\n\t\tconst maxNumberStickyLines = Math.min(this._maxStickyLines, this._editor.getOption(EditorOption.stickyScroll).maxLineCount);\n\t\tconst scrollTop: number = this._editor.getScrollTop();\n\t\tlet lastLineRelativePosition: number = 0;\n\t\tconst startLineNumbers: number[] = [];\n\t\tconst endLineNumbers: number[] = [];\n\t\tconst arrayVisibleRanges = this._editor.getVisibleRanges();\n\t\tif (arrayVisibleRanges.length !== 0) {\n\t\t\tconst fullVisibleRange = new StickyRange(arrayVisibleRanges[0].startLineNumber, arrayVisibleRanges[arrayVisibleRanges.length - 1].endLineNumber);\n\t\t\tconst candidateRanges = this._stickyLineCandidateProvider.getCandidateStickyLinesIntersecting(fullVisibleRange);\n\t\t\tfor (const range of candidateRanges) {\n\t\t\t\tconst start = range.startLineNumber;\n\t\t\t\tconst end = range.endLineNumber;\n\t\t\t\tconst topOfElement = range.top;\n\t\t\t\tconst bottomOfElement = topOfElement + range.height;\n\t\t\t\tconst topOfBeginningLine = this._editor.getTopForLineNumber(start) - scrollTop;\n\t\t\t\tconst bottomOfEndLine = this._editor.getBottomForLineNumber(end) - scrollTop;\n\t\t\t\tif (topOfElement > topOfBeginningLine && topOfElement <= bottomOfEndLine) {\n\t\t\t\t\tstartLineNumbers.push(start);\n\t\t\t\t\tendLineNumbers.push(end + 1);\n\t\t\t\t\tif (bottomOfElement > bottomOfEndLine) {\n\t\t\t\t\t\tlastLineRelativePosition = bottomOfEndLine - bottomOfElement;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (startLineNumbers.length === maxNumberStickyLines) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tthis._endLineNumbers = endLineNumbers;\n\t\treturn new StickyScrollWidgetState(startLineNumbers, endLineNumbers, lastLineRelativePosition, this._showEndForLine);\n\t}\n\n\toverride dispose(): void {\n\t\tsuper.dispose();\n\t\tthis._sessionStore.dispose();\n\t}\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["file:///mnt/vss/_work/1/s/dependencies/vscode/out-editor-src/vs/editor/contrib/stickyScroll/browser/stickyScrollController.ts","vs/editor/contrib/stickyScroll/browser/stickyScrollController.ts"],"names":[],"mappings":"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","file":"stickyScrollController.js","sourceRoot":"file:///mnt/vss/_work/1/s/dependencies/vscode/out-editor-src","sourcesContent":["/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport { Disposable, DisposableStore, toDisposable } from '../../../../base/common/lifecycle.js';\nimport { IActiveCodeEditor, ICodeEditor, MouseTargetType } from '../../../browser/editorBrowser.js';\nimport { IEditorContribution, ScrollType } from '../../../common/editorCommon.js';\nimport { ILanguageFeaturesService } from '../../../common/services/languageFeatures.js';\nimport { EditorOption, RenderLineNumbersType, ConfigurationChangedEvent } from '../../../common/config/editorOptions.js';\nimport { StickyScrollWidget, StickyScrollWidgetState } from './stickyScrollWidget.js';\nimport { IStickyLineCandidateProvider, StickyLineCandidateProvider } from './stickyScrollProvider.js';\nimport { IModelTokensChangedEvent } from '../../../common/textModelEvents.js';\nimport { IInstantiationService } from '../../../../platform/instantiation/common/instantiation.js';\nimport { IContextMenuService } from '../../../../platform/contextview/browser/contextView.js';\nimport { MenuId } from '../../../../platform/actions/common/actions.js';\nimport { IContextKey, IContextKeyService } from '../../../../platform/contextkey/common/contextkey.js';\nimport { EditorContextKeys } from '../../../common/editorContextKeys.js';\nimport { ClickLinkGesture, ClickLinkMouseEvent } from '../../gotoSymbol/browser/link/clickLinkGesture.js';\nimport { IRange, Range } from '../../../common/core/range.js';\nimport { getDefinitionsAtPosition } from '../../gotoSymbol/browser/goToSymbol.js';\nimport { goToDefinitionWithLocation } from '../../inlayHints/browser/inlayHintsLocations.js';\nimport { IPosition, Position } from '../../../common/core/position.js';\nimport { CancellationTokenSource } from '../../../../base/common/cancellation.js';\nimport { ILanguageConfigurationService } from '../../../common/languages/languageConfigurationRegistry.js';\nimport { ILanguageFeatureDebounceService } from '../../../common/services/languageFeatureDebounce.js';\nimport * as dom from '../../../../base/browser/dom.js';\nimport { StickyRange } from './stickyScrollElement.js';\nimport { IMouseEvent, StandardMouseEvent } from '../../../../base/browser/mouseEvent.js';\nimport { FoldingController } from '../../folding/browser/folding.js';\nimport { FoldingModel, toggleCollapseState } from '../../folding/browser/foldingModel.js';\nimport { Emitter, Event } from '../../../../base/common/event.js';\nimport { mainWindow } from '../../../../base/browser/window.js';\n\nexport interface IStickyScrollController {\n\treadonly stickyScrollWidgetHeight: number;\n\tisFocused(): boolean;\n\tfocus(): void;\n\tfocusNext(): void;\n\tfocusPrevious(): void;\n\tgoToFocused(): void;\n\tdispose(): void;\n\tselectEditor(): void;\n\treadonly onDidChangeStickyScrollHeight: Event<{ height: number }>;\n}\n\nexport class StickyScrollController extends Disposable implements IEditorContribution, IStickyScrollController {\n\n\tstatic readonly ID = 'store.contrib.stickyScrollController';\n\n\tprivate readonly _stickyScrollWidget: StickyScrollWidget;\n\tprivate readonly _stickyLineCandidateProvider: IStickyLineCandidateProvider;\n\tprivate readonly _sessionStore: DisposableStore = new DisposableStore();\n\n\tprivate _widgetState: StickyScrollWidgetState;\n\tprivate _foldingModel: FoldingModel | undefined;\n\tprivate _maxStickyLines: number = Number.MAX_SAFE_INTEGER;\n\n\tprivate _stickyRangeProjectedOnEditor: IRange | undefined;\n\tprivate _candidateDefinitionsLength: number = -1;\n\n\tprivate _stickyScrollFocusedContextKey: IContextKey<boolean>;\n\tprivate _stickyScrollVisibleContextKey: IContextKey<boolean>;\n\n\tprivate _focusDisposableStore: DisposableStore | undefined;\n\tprivate _focusedStickyElementIndex: number = -1;\n\tprivate _enabled = false;\n\tprivate _focused = false;\n\tprivate _positionRevealed = false;\n\tprivate _onMouseDown = false;\n\tprivate _endLineNumbers: number[] = [];\n\tprivate _showEndForLine: number | undefined;\n\tprivate _minRebuildFromLine: number | undefined;\n\tprivate _mouseTarget: EventTarget | null = null;\n\n\tprivate readonly _onDidChangeStickyScrollHeight = this._register(new Emitter<{ height: number }>());\n\tpublic readonly onDidChangeStickyScrollHeight = this._onDidChangeStickyScrollHeight.event;\n\n\tconstructor(\n\t\tprivate readonly _editor: ICodeEditor,\n\t\t@IContextMenuService private readonly _contextMenuService: IContextMenuService,\n\t\t@ILanguageFeaturesService private readonly _languageFeaturesService: ILanguageFeaturesService,\n\t\t@IInstantiationService private readonly _instaService: IInstantiationService,\n\t\t@ILanguageConfigurationService _languageConfigurationService: ILanguageConfigurationService,\n\t\t@ILanguageFeatureDebounceService _languageFeatureDebounceService: ILanguageFeatureDebounceService,\n\t\t@IContextKeyService private readonly _contextKeyService: IContextKeyService\n\t) {\n\t\tsuper();\n\t\tthis._stickyScrollWidget = new StickyScrollWidget(this._editor);\n\t\tthis._stickyLineCandidateProvider = new StickyLineCandidateProvider(this._editor, _languageFeaturesService, _languageConfigurationService);\n\t\tthis._register(this._stickyScrollWidget);\n\t\tthis._register(this._stickyLineCandidateProvider);\n\n\t\tthis._widgetState = StickyScrollWidgetState.Empty;\n\t\tconst stickyScrollDomNode = this._stickyScrollWidget.getDomNode();\n\t\tthis._register(this._editor.onDidChangeLineHeight((e) => {\n\t\t\te.changes.forEach((change) => {\n\t\t\t\tconst lineNumber = change.lineNumber;\n\t\t\t\tif (this._widgetState.startLineNumbers.includes(lineNumber)) {\n\t\t\t\t\tthis._renderStickyScroll(lineNumber);\n\t\t\t\t}\n\t\t\t});\n\t\t}));\n\t\tthis._register(this._editor.onDidChangeFont((e) => {\n\t\t\te.changes.forEach((change) => {\n\t\t\t\tconst lineNumber = change.lineNumber;\n\t\t\t\tif (this._widgetState.startLineNumbers.includes(lineNumber)) {\n\t\t\t\t\tthis._renderStickyScroll(lineNumber);\n\t\t\t\t}\n\t\t\t});\n\t\t}));\n\t\tthis._register(this._editor.onDidChangeConfiguration(e => {\n\t\t\tthis._readConfigurationChange(e);\n\t\t}));\n\t\tthis._register(dom.addDisposableListener(stickyScrollDomNode, dom.EventType.CONTEXT_MENU, async (event: MouseEvent) => {\n\t\t\tthis._onContextMenu(dom.getWindow(stickyScrollDomNode), event);\n\t\t}));\n\t\tthis._stickyScrollFocusedContextKey = EditorContextKeys.stickyScrollFocused.bindTo(this._contextKeyService);\n\t\tthis._stickyScrollVisibleContextKey = EditorContextKeys.stickyScrollVisible.bindTo(this._contextKeyService);\n\t\tconst focusTracker = this._register(dom.trackFocus(stickyScrollDomNode));\n\t\tthis._register(focusTracker.onDidBlur(_ => {\n\t\t\t// Suppose that the blurring is caused by scrolling, then keep the focus on the sticky scroll\n\t\t\t// This is determined by the fact that the height of the widget has become zero and there has been no position revealing\n\t\t\tif (this._positionRevealed === false && stickyScrollDomNode.clientHeight === 0) {\n\t\t\t\tthis._focusedStickyElementIndex = -1;\n\t\t\t\tthis.focus();\n\n\t\t\t}\n\t\t\t// In all other casees, dispose the focus on the sticky scroll\n\t\t\telse {\n\t\t\t\tthis._disposeFocusStickyScrollStore();\n\t\t\t}\n\t\t}));\n\t\tthis._register(focusTracker.onDidFocus(_ => {\n\t\t\tthis.focus();\n\t\t}));\n\t\tthis._registerMouseListeners();\n\t\t// Suppose that mouse down on the sticky scroll, then do not focus on the sticky scroll because this will be followed by the revealing of a position\n\t\tthis._register(dom.addDisposableListener(stickyScrollDomNode, dom.EventType.MOUSE_DOWN, (e) => {\n\t\t\tthis._onMouseDown = true;\n\t\t}));\n\t\tthis._register(this._stickyScrollWidget.onDidChangeStickyScrollHeight((e) => {\n\t\t\tthis._onDidChangeStickyScrollHeight.fire(e);\n\t\t}));\n\t\tthis._onDidResize();\n\t\tthis._readConfiguration();\n\t}\n\n\tget stickyScrollWidgetHeight(): number {\n\t\treturn this._stickyScrollWidget.height;\n\t}\n\n\tpublic static get(editor: ICodeEditor): IStickyScrollController | null {\n\t\treturn editor.getContribution<StickyScrollController>(StickyScrollController.ID);\n\t}\n\n\tprivate _disposeFocusStickyScrollStore() {\n\t\tthis._stickyScrollFocusedContextKey.set(false);\n\t\tthis._focusDisposableStore?.dispose();\n\t\tthis._focused = false;\n\t\tthis._positionRevealed = false;\n\t\tthis._onMouseDown = false;\n\t}\n\n\tpublic isFocused(): boolean {\n\t\treturn this._focused;\n\t}\n\n\tpublic focus(): void {\n\t\t// If the mouse is down, do not focus on the sticky scroll\n\t\tif (this._onMouseDown) {\n\t\t\tthis._onMouseDown = false;\n\t\t\tthis._editor.focus();\n\t\t\treturn;\n\t\t}\n\t\tconst focusState = this._stickyScrollFocusedContextKey.get();\n\t\tif (focusState === true) {\n\t\t\treturn;\n\t\t}\n\t\tthis._focused = true;\n\t\tthis._focusDisposableStore = new DisposableStore();\n\t\tthis._stickyScrollFocusedContextKey.set(true);\n\t\tthis._focusedStickyElementIndex = this._stickyScrollWidget.lineNumbers.length - 1;\n\t\tthis._stickyScrollWidget.focusLineWithIndex(this._focusedStickyElementIndex);\n\t}\n\n\tpublic focusNext(): void {\n\t\tif (this._focusedStickyElementIndex < this._stickyScrollWidget.lineNumberCount - 1) {\n\t\t\tthis._focusNav(true);\n\t\t}\n\t}\n\n\tpublic focusPrevious(): void {\n\t\tif (this._focusedStickyElementIndex > 0) {\n\t\t\tthis._focusNav(false);\n\t\t}\n\t}\n\n\tpublic selectEditor(): void {\n\t\tthis._editor.focus();\n\t}\n\n\t// True is next, false is previous\n\tprivate _focusNav(direction: boolean): void {\n\t\tthis._focusedStickyElementIndex = direction ? this._focusedStickyElementIndex + 1 : this._focusedStickyElementIndex - 1;\n\t\tthis._stickyScrollWidget.focusLineWithIndex(this._focusedStickyElementIndex);\n\t}\n\n\tpublic goToFocused(): void {\n\t\tconst lineNumbers = this._stickyScrollWidget.lineNumbers;\n\t\tthis._disposeFocusStickyScrollStore();\n\t\tthis._revealPosition({ lineNumber: lineNumbers[this._focusedStickyElementIndex], column: 1 });\n\t}\n\n\tprivate _revealPosition(position: IPosition): void {\n\t\tthis._reveaInEditor(position, () => this._editor.revealPosition(position));\n\t}\n\n\tprivate _revealLineInCenterIfOutsideViewport(position: IPosition): void {\n\t\tthis._reveaInEditor(position, () => this._editor.revealLineInCenterIfOutsideViewport(position.lineNumber, ScrollType.Smooth));\n\t}\n\n\tprivate _reveaInEditor(position: IPosition, revealFunction: () => void): void {\n\t\tif (this._focused) {\n\t\t\tthis._disposeFocusStickyScrollStore();\n\t\t}\n\t\tthis._positionRevealed = true;\n\t\trevealFunction();\n\t\tthis._editor.setSelection(Range.fromPositions(position));\n\t\tthis._editor.focus();\n\t}\n\n\tprivate _registerMouseListeners(): void {\n\n\t\tconst sessionStore = this._register(new DisposableStore());\n\t\tconst gesture = this._register(new ClickLinkGesture(this._editor, {\n\t\t\textractLineNumberFromMouseEvent: (e) => {\n\t\t\t\tconst position = this._stickyScrollWidget.getEditorPositionFromNode(e.target.element);\n\t\t\t\treturn position ? position.lineNumber : 0;\n\t\t\t}\n\t\t}));\n\n\t\tconst getMouseEventTarget = (mouseEvent: ClickLinkMouseEvent): { range: Range; textElement: HTMLElement } | null => {\n\t\t\tif (!this._editor.hasModel()) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\tif (mouseEvent.target.type !== MouseTargetType.OVERLAY_WIDGET || mouseEvent.target.detail !== this._stickyScrollWidget.getId()) {\n\t\t\t\t// not hovering over our widget\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\tconst mouseTargetElement = mouseEvent.target.element;\n\t\t\tif (!mouseTargetElement || mouseTargetElement.innerText !== mouseTargetElement.innerHTML) {\n\t\t\t\t// not on a span element rendering text\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\tconst position = this._stickyScrollWidget.getEditorPositionFromNode(mouseTargetElement);\n\t\t\tif (!position) {\n\t\t\t\t// not hovering a sticky scroll line\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\treturn {\n\t\t\t\trange: new Range(position.lineNumber, position.column, position.lineNumber, position.column + mouseTargetElement.innerText.length),\n\t\t\t\ttextElement: mouseTargetElement\n\t\t\t};\n\t\t};\n\n\t\tconst stickyScrollWidgetDomNode = this._stickyScrollWidget.getDomNode();\n\t\tthis._register(dom.addStandardDisposableListener(stickyScrollWidgetDomNode, dom.EventType.CLICK, (mouseEvent: IMouseEvent) => {\n\t\t\tif (mouseEvent.ctrlKey || mouseEvent.altKey || mouseEvent.metaKey) {\n\t\t\t\t// modifier pressed\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (!mouseEvent.leftButton) {\n\t\t\t\t// not left click\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (mouseEvent.shiftKey) {\n\t\t\t\t// shift click\n\t\t\t\tconst lineIndex = this._stickyScrollWidget.getLineIndexFromChildDomNode(mouseEvent.target);\n\t\t\t\tif (lineIndex === null) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tconst position = new Position(this._endLineNumbers[lineIndex], 1);\n\t\t\t\tthis._revealLineInCenterIfOutsideViewport(position);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst isInFoldingIconDomNode = this._stickyScrollWidget.isInFoldingIconDomNode(mouseEvent.target);\n\t\t\tif (isInFoldingIconDomNode) {\n\t\t\t\t// clicked on folding icon\n\t\t\t\tconst lineNumber = this._stickyScrollWidget.getLineNumberFromChildDomNode(mouseEvent.target);\n\t\t\t\tthis._toggleFoldingRegionForLine(lineNumber);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst isInStickyLine = this._stickyScrollWidget.isInStickyLine(mouseEvent.target);\n\t\t\tif (!isInStickyLine) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t// normal click\n\t\t\tlet position = this._stickyScrollWidget.getEditorPositionFromNode(mouseEvent.target);\n\t\t\tif (!position) {\n\t\t\t\tconst lineNumber = this._stickyScrollWidget.getLineNumberFromChildDomNode(mouseEvent.target);\n\t\t\t\tif (lineNumber === null) {\n\t\t\t\t\t// not hovering a sticky scroll line\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tposition = new Position(lineNumber, 1);\n\t\t\t}\n\t\t\tthis._revealPosition(position);\n\t\t}));\n\t\tthis._register(dom.addDisposableListener(mainWindow, dom.EventType.MOUSE_MOVE, mouseEvent => {\n\t\t\tthis._mouseTarget = mouseEvent.target;\n\t\t\tthis._onMouseMoveOrKeyDown(mouseEvent);\n\t\t}));\n\t\tthis._register(dom.addDisposableListener(mainWindow, dom.EventType.KEY_DOWN, mouseEvent => {\n\t\t\tthis._onMouseMoveOrKeyDown(mouseEvent);\n\t\t}));\n\t\tthis._register(dom.addDisposableListener(mainWindow, dom.EventType.KEY_UP, () => {\n\t\t\tif (this._showEndForLine !== undefined) {\n\t\t\t\tthis._showEndForLine = undefined;\n\t\t\t\tthis._renderStickyScroll();\n\t\t\t}\n\t\t}));\n\n\t\tthis._register(gesture.onMouseMoveOrRelevantKeyDown(([mouseEvent, _keyboardEvent]) => {\n\t\t\tconst mouseTarget = getMouseEventTarget(mouseEvent);\n\t\t\tif (!mouseTarget || !mouseEvent.hasTriggerModifier || !this._editor.hasModel()) {\n\t\t\t\tsessionStore.clear();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst { range, textElement } = mouseTarget;\n\n\t\t\tif (!range.equalsRange(this._stickyRangeProjectedOnEditor)) {\n\t\t\t\tthis._stickyRangeProjectedOnEditor = range;\n\t\t\t\tsessionStore.clear();\n\t\t\t} else if (textElement.style.textDecoration === 'underline') {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst cancellationToken = new CancellationTokenSource();\n\t\t\tsessionStore.add(toDisposable(() => cancellationToken.dispose(true)));\n\n\t\t\tlet currentHTMLChild: HTMLElement;\n\n\t\t\tgetDefinitionsAtPosition(this._languageFeaturesService.definitionProvider, this._editor.getModel(), new Position(range.startLineNumber, range.startColumn + 1), false, cancellationToken.token).then((candidateDefinitions => {\n\t\t\t\tif (cancellationToken.token.isCancellationRequested) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (candidateDefinitions.length !== 0) {\n\t\t\t\t\tthis._candidateDefinitionsLength = candidateDefinitions.length;\n\t\t\t\t\tconst childHTML: HTMLElement = textElement;\n\t\t\t\t\tif (currentHTMLChild !== childHTML) {\n\t\t\t\t\t\tsessionStore.clear();\n\t\t\t\t\t\tcurrentHTMLChild = childHTML;\n\t\t\t\t\t\tcurrentHTMLChild.style.textDecoration = 'underline';\n\t\t\t\t\t\tsessionStore.add(toDisposable(() => {\n\t\t\t\t\t\t\tcurrentHTMLChild.style.textDecoration = 'none';\n\t\t\t\t\t\t}));\n\t\t\t\t\t} else if (!currentHTMLChild) {\n\t\t\t\t\t\tcurrentHTMLChild = childHTML;\n\t\t\t\t\t\tcurrentHTMLChild.style.textDecoration = 'underline';\n\t\t\t\t\t\tsessionStore.add(toDisposable(() => {\n\t\t\t\t\t\t\tcurrentHTMLChild.style.textDecoration = 'none';\n\t\t\t\t\t\t}));\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tsessionStore.clear();\n\t\t\t\t}\n\t\t\t}));\n\t\t}));\n\t\tthis._register(gesture.onCancel(() => {\n\t\t\tsessionStore.clear();\n\t\t}));\n\t\tthis._register(gesture.onExecute(async e => {\n\t\t\tif (e.target.type !== MouseTargetType.OVERLAY_WIDGET || e.target.detail !== this._stickyScrollWidget.getId()) {\n\t\t\t\t// not hovering over our widget\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst position = this._stickyScrollWidget.getEditorPositionFromNode(e.target.element);\n\t\t\tif (!position) {\n\t\t\t\t// not hovering a sticky scroll line\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (!this._editor.hasModel() || !this._stickyRangeProjectedOnEditor) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (this._candidateDefinitionsLength > 1) {\n\t\t\t\tif (this._focused) {\n\t\t\t\t\tthis._disposeFocusStickyScrollStore();\n\t\t\t\t}\n\t\t\t\tthis._revealPosition({ lineNumber: position.lineNumber, column: 1 });\n\t\t\t}\n\t\t\tthis._instaService.invokeFunction(goToDefinitionWithLocation, e, this._editor as IActiveCodeEditor, { uri: this._editor.getModel().uri, range: this._stickyRangeProjectedOnEditor });\n\t\t}));\n\t}\n\n\tprivate _onContextMenu(targetWindow: Window, e: MouseEvent) {\n\t\tconst event = new StandardMouseEvent(targetWindow, e);\n\n\t\tthis._contextMenuService.showContextMenu({\n\t\t\tmenuId: MenuId.StickyScrollContext,\n\t\t\tgetAnchor: () => event,\n\t\t});\n\t}\n\n\tprivate _onMouseMoveOrKeyDown(mouseEvent: KeyboardEvent | MouseEvent): void {\n\t\tif (!mouseEvent.shiftKey) {\n\t\t\treturn;\n\t\t}\n\t\tif (!this._mouseTarget || !dom.isHTMLElement(this._mouseTarget)) {\n\t\t\treturn;\n\t\t}\n\t\tconst currentEndForLineIndex = this._stickyScrollWidget.getLineIndexFromChildDomNode(this._mouseTarget);\n\t\tif (currentEndForLineIndex === null || this._showEndForLine === currentEndForLineIndex) {\n\t\t\treturn;\n\t\t}\n\t\tthis._showEndForLine = currentEndForLineIndex;\n\t\tthis._renderStickyScroll();\n\t}\n\n\tprivate _toggleFoldingRegionForLine(line: number | null) {\n\t\tif (!this._foldingModel || line === null) {\n\t\t\treturn;\n\t\t}\n\t\tconst stickyLine = this._stickyScrollWidget.getRenderedStickyLine(line);\n\t\tconst foldingIcon = stickyLine?.foldingIcon;\n\t\tif (!foldingIcon) {\n\t\t\treturn;\n\t\t}\n\t\ttoggleCollapseState(this._foldingModel, 1, [line]);\n\t\tfoldingIcon.isCollapsed = !foldingIcon.isCollapsed;\n\t\tconst scrollTop = (foldingIcon.isCollapsed ?\n\t\t\tthis._editor.getTopForLineNumber(foldingIcon.foldingEndLine)\n\t\t\t: this._editor.getTopForLineNumber(foldingIcon.foldingStartLine))\n\t\t\t- this._editor.getOption(EditorOption.lineHeight) * stickyLine.index + 1;\n\t\tthis._editor.setScrollTop(scrollTop);\n\t\tthis._renderStickyScroll(line);\n\t}\n\n\tprivate _readConfiguration() {\n\t\tconst options = this._editor.getOption(EditorOption.stickyScroll);\n\t\tif (options.enabled === false) {\n\t\t\tthis._editor.removeOverlayWidget(this._stickyScrollWidget);\n\t\t\tthis._resetState();\n\t\t\tthis._sessionStore.clear();\n\t\t\tthis._enabled = false;\n\t\t\treturn;\n\t\t} else if (options.enabled && !this._enabled) {\n\t\t\t// When sticky scroll was just enabled, add the listeners on the sticky scroll\n\t\t\tthis._editor.addOverlayWidget(this._stickyScrollWidget);\n\t\t\tthis._sessionStore.add(this._editor.onDidScrollChange((e) => {\n\t\t\t\tif (e.scrollTopChanged) {\n\t\t\t\t\tthis._showEndForLine = undefined;\n\t\t\t\t\tthis._renderStickyScroll();\n\t\t\t\t}\n\t\t\t}));\n\t\t\tthis._sessionStore.add(this._editor.onDidLayoutChange(() => this._onDidResize()));\n\t\t\tthis._sessionStore.add(this._editor.onDidChangeModelTokens((e) => this._onTokensChange(e)));\n\t\t\tthis._sessionStore.add(this._stickyLineCandidateProvider.onDidChangeStickyScroll(() => {\n\t\t\t\tthis._showEndForLine = undefined;\n\t\t\t\tthis._renderStickyScroll();\n\t\t\t}));\n\t\t\tthis._enabled = true;\n\t\t}\n\n\t\tconst lineNumberOption = this._editor.getOption(EditorOption.lineNumbers);\n\t\tif (lineNumberOption.renderType === RenderLineNumbersType.Relative) {\n\t\t\tthis._sessionStore.add(this._editor.onDidChangeCursorPosition(() => {\n\t\t\t\tthis._showEndForLine = undefined;\n\t\t\t\tthis._renderStickyScroll(0);\n\t\t\t}));\n\t\t}\n\t}\n\n\tprivate _readConfigurationChange(event: ConfigurationChangedEvent) {\n\t\tif (\n\t\t\tevent.hasChanged(EditorOption.stickyScroll)\n\t\t\t|| event.hasChanged(EditorOption.minimap)\n\t\t\t|| event.hasChanged(EditorOption.lineHeight)\n\t\t\t|| event.hasChanged(EditorOption.showFoldingControls)\n\t\t\t|| event.hasChanged(EditorOption.lineNumbers)\n\t\t) {\n\t\t\tthis._readConfiguration();\n\t\t}\n\n\t\tif (event.hasChanged(EditorOption.lineNumbers) || event.hasChanged(EditorOption.folding) || event.hasChanged(EditorOption.showFoldingControls)) {\n\t\t\tthis._renderStickyScroll(0);\n\t\t}\n\t}\n\n\tprivate _needsUpdate(event: IModelTokensChangedEvent) {\n\t\tconst stickyLineNumbers = this._stickyScrollWidget.getCurrentLines();\n\t\tfor (const stickyLineNumber of stickyLineNumbers) {\n\t\t\tfor (const range of event.ranges) {\n\t\t\t\tif (stickyLineNumber >= range.fromLineNumber && stickyLineNumber <= range.toLineNumber) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t}\n\n\tprivate _onTokensChange(event: IModelTokensChangedEvent) {\n\t\tif (this._needsUpdate(event)) {\n\t\t\t// Rebuilding the whole widget from line 0\n\t\t\tthis._renderStickyScroll(0);\n\t\t}\n\t}\n\n\tprivate _onDidResize() {\n\t\tconst layoutInfo = this._editor.getLayoutInfo();\n\t\t// Make sure sticky scroll doesn't take up more than 25% of the editor\n\t\tconst theoreticalLines = layoutInfo.height / this._editor.getOption(EditorOption.lineHeight);\n\t\tthis._maxStickyLines = Math.round(theoreticalLines * .25);\n\t\tthis._renderStickyScroll(0);\n\t}\n\n\tprivate async _renderStickyScroll(rebuildFromLine?: number): Promise<void> {\n\t\tconst model = this._editor.getModel();\n\t\tif (!model || model.isTooLargeForTokenization()) {\n\t\t\tthis._resetState();\n\t\t\treturn;\n\t\t}\n\t\tconst nextRebuildFromLine = this._updateAndGetMinRebuildFromLine(rebuildFromLine);\n\t\tconst stickyWidgetVersion = this._stickyLineCandidateProvider.getVersionId();\n\t\tconst shouldUpdateState = stickyWidgetVersion === undefined || stickyWidgetVersion === model.getVersionId();\n\t\tif (shouldUpdateState) {\n\t\t\tif (!this._focused) {\n\t\t\t\tawait this._updateState(nextRebuildFromLine);\n\t\t\t} else {\n\t\t\t\t// Suppose that previously the sticky scroll widget had height 0, then if there are visible lines, set the last line as focused\n\t\t\t\tif (this._focusedStickyElementIndex === -1) {\n\t\t\t\t\tawait this._updateState(nextRebuildFromLine);\n\t\t\t\t\tthis._focusedStickyElementIndex = this._stickyScrollWidget.lineNumberCount - 1;\n\t\t\t\t\tif (this._focusedStickyElementIndex !== -1) {\n\t\t\t\t\t\tthis._stickyScrollWidget.focusLineWithIndex(this._focusedStickyElementIndex);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tconst focusedStickyElementLineNumber = this._stickyScrollWidget.lineNumbers[this._focusedStickyElementIndex];\n\t\t\t\t\tawait this._updateState(nextRebuildFromLine);\n\t\t\t\t\t// Suppose that after setting the state, there are no sticky lines, set the focused index to -1\n\t\t\t\t\tif (this._stickyScrollWidget.lineNumberCount === 0) {\n\t\t\t\t\t\tthis._focusedStickyElementIndex = -1;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconst previousFocusedLineNumberExists = this._stickyScrollWidget.lineNumbers.includes(focusedStickyElementLineNumber);\n\n\t\t\t\t\t\t// If the line number is still there, do not change anything\n\t\t\t\t\t\t// If the line number is not there, set the new focused line to be the last line\n\t\t\t\t\t\tif (!previousFocusedLineNumberExists) {\n\t\t\t\t\t\t\tthis._focusedStickyElementIndex = this._stickyScrollWidget.lineNumberCount - 1;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tthis._stickyScrollWidget.focusLineWithIndex(this._focusedStickyElementIndex);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate _updateAndGetMinRebuildFromLine(rebuildFromLine: number | undefined): number | undefined {\n\t\tif (rebuildFromLine !== undefined) {\n\t\t\tconst minRebuildFromLineOrInfinity = this._minRebuildFromLine !== undefined ? this._minRebuildFromLine : Infinity;\n\t\t\tthis._minRebuildFromLine = Math.min(rebuildFromLine, minRebuildFromLineOrInfinity);\n\t\t}\n\t\treturn this._minRebuildFromLine;\n\t}\n\n\tprivate async _updateState(rebuildFromLine?: number): Promise<void> {\n\t\tthis._minRebuildFromLine = undefined;\n\t\tthis._foldingModel = await FoldingController.get(this._editor)?.getFoldingModel() ?? undefined;\n\t\tthis._widgetState = this.findScrollWidgetState();\n\t\tconst stickyWidgetHasLines = this._widgetState.startLineNumbers.length > 0;\n\t\tthis._stickyScrollVisibleContextKey.set(stickyWidgetHasLines);\n\t\tthis._stickyScrollWidget.setState(this._widgetState, this._foldingModel, rebuildFromLine);\n\t}\n\n\tprivate async _resetState(): Promise<void> {\n\t\tthis._minRebuildFromLine = undefined;\n\t\tthis._foldingModel = undefined;\n\t\tthis._widgetState = StickyScrollWidgetState.Empty;\n\t\tthis._stickyScrollVisibleContextKey.set(false);\n\t\tthis._stickyScrollWidget.setState(undefined, undefined);\n\t}\n\n\tfindScrollWidgetState(): StickyScrollWidgetState {\n\t\tconst maxNumberStickyLines = Math.min(this._maxStickyLines, this._editor.getOption(EditorOption.stickyScroll).maxLineCount);\n\t\tconst scrollTop: number = this._editor.getScrollTop();\n\t\tlet lastLineRelativePosition: number = 0;\n\t\tconst startLineNumbers: number[] = [];\n\t\tconst endLineNumbers: number[] = [];\n\t\tconst arrayVisibleRanges = this._editor.getVisibleRanges();\n\t\tif (arrayVisibleRanges.length !== 0) {\n\t\t\tconst fullVisibleRange = new StickyRange(arrayVisibleRanges[0].startLineNumber, arrayVisibleRanges[arrayVisibleRanges.length - 1].endLineNumber);\n\t\t\tconst candidateRanges = this._stickyLineCandidateProvider.getCandidateStickyLinesIntersecting(fullVisibleRange);\n\t\t\tfor (const range of candidateRanges) {\n\t\t\t\tconst start = range.startLineNumber;\n\t\t\t\tconst end = range.endLineNumber;\n\t\t\t\tconst topOfElement = range.top;\n\t\t\t\tconst bottomOfElement = topOfElement + range.height;\n\t\t\t\tconst topOfBeginningLine = this._editor.getTopForLineNumber(start) - scrollTop;\n\t\t\t\tconst bottomOfEndLine = this._editor.getBottomForLineNumber(end) - scrollTop;\n\t\t\t\tif (topOfElement > topOfBeginningLine && topOfElement <= bottomOfEndLine) {\n\t\t\t\t\tstartLineNumbers.push(start);\n\t\t\t\t\tendLineNumbers.push(end + 1);\n\t\t\t\t\tif (bottomOfElement > bottomOfEndLine) {\n\t\t\t\t\t\tlastLineRelativePosition = bottomOfEndLine - bottomOfElement;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (startLineNumbers.length === maxNumberStickyLines) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tthis._endLineNumbers = endLineNumbers;\n\t\treturn new StickyScrollWidgetState(startLineNumbers, endLineNumbers, lastLineRelativePosition, this._showEndForLine);\n\t}\n\n\toverride dispose(): void {\n\t\tsuper.dispose();\n\t\tthis._sessionStore.dispose();\n\t}\n}\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport { Disposable, DisposableStore, toDisposable } from '../../../../base/common/lifecycle.js';\nimport { IActiveCodeEditor, ICodeEditor, MouseTargetType } from '../../../browser/editorBrowser.js';\nimport { IEditorContribution, ScrollType } from '../../../common/editorCommon.js';\nimport { ILanguageFeaturesService } from '../../../common/services/languageFeatures.js';\nimport { EditorOption, RenderLineNumbersType, ConfigurationChangedEvent } from '../../../common/config/editorOptions.js';\nimport { StickyScrollWidget, StickyScrollWidgetState } from './stickyScrollWidget.js';\nimport { IStickyLineCandidateProvider, StickyLineCandidateProvider } from './stickyScrollProvider.js';\nimport { IModelTokensChangedEvent } from '../../../common/textModelEvents.js';\nimport { IInstantiationService } from '../../../../platform/instantiation/common/instantiation.js';\nimport { IContextMenuService } from '../../../../platform/contextview/browser/contextView.js';\nimport { MenuId } from '../../../../platform/actions/common/actions.js';\nimport { IContextKey, IContextKeyService } from '../../../../platform/contextkey/common/contextkey.js';\nimport { EditorContextKeys } from '../../../common/editorContextKeys.js';\nimport { ClickLinkGesture, ClickLinkMouseEvent } from '../../gotoSymbol/browser/link/clickLinkGesture.js';\nimport { IRange, Range } from '../../../common/core/range.js';\nimport { getDefinitionsAtPosition } from '../../gotoSymbol/browser/goToSymbol.js';\nimport { goToDefinitionWithLocation } from '../../inlayHints/browser/inlayHintsLocations.js';\nimport { IPosition, Position } from '../../../common/core/position.js';\nimport { CancellationTokenSource } from '../../../../base/common/cancellation.js';\nimport { ILanguageConfigurationService } from '../../../common/languages/languageConfigurationRegistry.js';\nimport { ILanguageFeatureDebounceService } from '../../../common/services/languageFeatureDebounce.js';\nimport * as dom from '../../../../base/browser/dom.js';\nimport { StickyRange } from './stickyScrollElement.js';\nimport { IMouseEvent, StandardMouseEvent } from '../../../../base/browser/mouseEvent.js';\nimport { FoldingController } from '../../folding/browser/folding.js';\nimport { FoldingModel, toggleCollapseState } from '../../folding/browser/foldingModel.js';\nimport { Emitter, Event } from '../../../../base/common/event.js';\nimport { mainWindow } from '../../../../base/browser/window.js';\n\nexport interface IStickyScrollController {\n\treadonly stickyScrollWidgetHeight: number;\n\tisFocused(): boolean;\n\tfocus(): void;\n\tfocusNext(): void;\n\tfocusPrevious(): void;\n\tgoToFocused(): void;\n\tdispose(): void;\n\tselectEditor(): void;\n\treadonly onDidChangeStickyScrollHeight: Event<{ height: number }>;\n}\n\nexport class StickyScrollController extends Disposable implements IEditorContribution, IStickyScrollController {\n\n\tstatic readonly ID = 'store.contrib.stickyScrollController';\n\n\tprivate readonly _stickyScrollWidget: StickyScrollWidget;\n\tprivate readonly _stickyLineCandidateProvider: IStickyLineCandidateProvider;\n\tprivate readonly _sessionStore: DisposableStore = new DisposableStore();\n\n\tprivate _widgetState: StickyScrollWidgetState;\n\tprivate _foldingModel: FoldingModel | undefined;\n\tprivate _maxStickyLines: number = Number.MAX_SAFE_INTEGER;\n\n\tprivate _stickyRangeProjectedOnEditor: IRange | undefined;\n\tprivate _candidateDefinitionsLength: number = -1;\n\n\tprivate _stickyScrollFocusedContextKey: IContextKey<boolean>;\n\tprivate _stickyScrollVisibleContextKey: IContextKey<boolean>;\n\n\tprivate _focusDisposableStore: DisposableStore | undefined;\n\tprivate _focusedStickyElementIndex: number = -1;\n\tprivate _enabled = false;\n\tprivate _focused = false;\n\tprivate _positionRevealed = false;\n\tprivate _onMouseDown = false;\n\tprivate _endLineNumbers: number[] = [];\n\tprivate _showEndForLine: number | undefined;\n\tprivate _minRebuildFromLine: number | undefined;\n\tprivate _mouseTarget: EventTarget | null = null;\n\n\tprivate readonly _onDidChangeStickyScrollHeight = this._register(new Emitter<{ height: number }>());\n\tpublic readonly onDidChangeStickyScrollHeight = this._onDidChangeStickyScrollHeight.event;\n\n\tconstructor(\n\t\tprivate readonly _editor: ICodeEditor,\n\t\t@IContextMenuService private readonly _contextMenuService: IContextMenuService,\n\t\t@ILanguageFeaturesService private readonly _languageFeaturesService: ILanguageFeaturesService,\n\t\t@IInstantiationService private readonly _instaService: IInstantiationService,\n\t\t@ILanguageConfigurationService _languageConfigurationService: ILanguageConfigurationService,\n\t\t@ILanguageFeatureDebounceService _languageFeatureDebounceService: ILanguageFeatureDebounceService,\n\t\t@IContextKeyService private readonly _contextKeyService: IContextKeyService\n\t) {\n\t\tsuper();\n\t\tthis._stickyScrollWidget = new StickyScrollWidget(this._editor);\n\t\tthis._stickyLineCandidateProvider = new StickyLineCandidateProvider(this._editor, _languageFeaturesService, _languageConfigurationService);\n\t\tthis._register(this._stickyScrollWidget);\n\t\tthis._register(this._stickyLineCandidateProvider);\n\n\t\tthis._widgetState = StickyScrollWidgetState.Empty;\n\t\tconst stickyScrollDomNode = this._stickyScrollWidget.getDomNode();\n\t\tthis._register(this._editor.onDidChangeLineHeight((e) => {\n\t\t\te.changes.forEach((change) => {\n\t\t\t\tconst lineNumber = change.lineNumber;\n\t\t\t\tif (this._widgetState.startLineNumbers.includes(lineNumber)) {\n\t\t\t\t\tthis._renderStickyScroll(lineNumber);\n\t\t\t\t}\n\t\t\t});\n\t\t}));\n\t\tthis._register(this._editor.onDidChangeFont((e) => {\n\t\t\te.changes.forEach((change) => {\n\t\t\t\tconst lineNumber = change.lineNumber;\n\t\t\t\tif (this._widgetState.startLineNumbers.includes(lineNumber)) {\n\t\t\t\t\tthis._renderStickyScroll(lineNumber);\n\t\t\t\t}\n\t\t\t});\n\t\t}));\n\t\tthis._register(this._editor.onDidChangeConfiguration(e => {\n\t\t\tthis._readConfigurationChange(e);\n\t\t}));\n\t\tthis._register(dom.addDisposableListener(stickyScrollDomNode, dom.EventType.CONTEXT_MENU, async (event: MouseEvent) => {\n\t\t\tthis._onContextMenu(dom.getWindow(stickyScrollDomNode), event);\n\t\t}));\n\t\tthis._stickyScrollFocusedContextKey = EditorContextKeys.stickyScrollFocused.bindTo(this._contextKeyService);\n\t\tthis._stickyScrollVisibleContextKey = EditorContextKeys.stickyScrollVisible.bindTo(this._contextKeyService);\n\t\tconst focusTracker = this._register(dom.trackFocus(stickyScrollDomNode));\n\t\tthis._register(focusTracker.onDidBlur(_ => {\n\t\t\t// Suppose that the blurring is caused by scrolling, then keep the focus on the sticky scroll\n\t\t\t// This is determined by the fact that the height of the widget has become zero and there has been no position revealing\n\t\t\tif (this._positionRevealed === false && stickyScrollDomNode.clientHeight === 0) {\n\t\t\t\tthis._focusedStickyElementIndex = -1;\n\t\t\t\tthis.focus();\n\n\t\t\t}\n\t\t\t// In all other casees, dispose the focus on the sticky scroll\n\t\t\telse {\n\t\t\t\tthis._disposeFocusStickyScrollStore();\n\t\t\t}\n\t\t}));\n\t\tthis._register(focusTracker.onDidFocus(_ => {\n\t\t\tthis.focus();\n\t\t}));\n\t\tthis._registerMouseListeners();\n\t\t// Suppose that mouse down on the sticky scroll, then do not focus on the sticky scroll because this will be followed by the revealing of a position\n\t\tthis._register(dom.addDisposableListener(stickyScrollDomNode, dom.EventType.MOUSE_DOWN, (e) => {\n\t\t\tthis._onMouseDown = true;\n\t\t}));\n\t\tthis._register(this._stickyScrollWidget.onDidChangeStickyScrollHeight((e) => {\n\t\t\tthis._onDidChangeStickyScrollHeight.fire(e);\n\t\t}));\n\t\tthis._onDidResize();\n\t\tthis._readConfiguration();\n\t}\n\n\tget stickyScrollWidgetHeight(): number {\n\t\treturn this._stickyScrollWidget.height;\n\t}\n\n\tpublic static get(editor: ICodeEditor): IStickyScrollController | null {\n\t\treturn editor.getContribution<StickyScrollController>(StickyScrollController.ID);\n\t}\n\n\tprivate _disposeFocusStickyScrollStore() {\n\t\tthis._stickyScrollFocusedContextKey.set(false);\n\t\tthis._focusDisposableStore?.dispose();\n\t\tthis._focused = false;\n\t\tthis._positionRevealed = false;\n\t\tthis._onMouseDown = false;\n\t}\n\n\tpublic isFocused(): boolean {\n\t\treturn this._focused;\n\t}\n\n\tpublic focus(): void {\n\t\t// If the mouse is down, do not focus on the sticky scroll\n\t\tif (this._onMouseDown) {\n\t\t\tthis._onMouseDown = false;\n\t\t\tthis._editor.focus();\n\t\t\treturn;\n\t\t}\n\t\tconst focusState = this._stickyScrollFocusedContextKey.get();\n\t\tif (focusState === true) {\n\t\t\treturn;\n\t\t}\n\t\tthis._focused = true;\n\t\tthis._focusDisposableStore = new DisposableStore();\n\t\tthis._stickyScrollFocusedContextKey.set(true);\n\t\tthis._focusedStickyElementIndex = this._stickyScrollWidget.lineNumbers.length - 1;\n\t\tthis._stickyScrollWidget.focusLineWithIndex(this._focusedStickyElementIndex);\n\t}\n\n\tpublic focusNext(): void {\n\t\tif (this._focusedStickyElementIndex < this._stickyScrollWidget.lineNumberCount - 1) {\n\t\t\tthis._focusNav(true);\n\t\t}\n\t}\n\n\tpublic focusPrevious(): void {\n\t\tif (this._focusedStickyElementIndex > 0) {\n\t\t\tthis._focusNav(false);\n\t\t}\n\t}\n\n\tpublic selectEditor(): void {\n\t\tthis._editor.focus();\n\t}\n\n\t// True is next, false is previous\n\tprivate _focusNav(direction: boolean): void {\n\t\tthis._focusedStickyElementIndex = direction ? this._focusedStickyElementIndex + 1 : this._focusedStickyElementIndex - 1;\n\t\tthis._stickyScrollWidget.focusLineWithIndex(this._focusedStickyElementIndex);\n\t}\n\n\tpublic goToFocused(): void {\n\t\tconst lineNumbers = this._stickyScrollWidget.lineNumbers;\n\t\tthis._disposeFocusStickyScrollStore();\n\t\tthis._revealPosition({ lineNumber: lineNumbers[this._focusedStickyElementIndex], column: 1 });\n\t}\n\n\tprivate _revealPosition(position: IPosition): void {\n\t\tthis._reveaInEditor(position, () => this._editor.revealPosition(position));\n\t}\n\n\tprivate _revealLineInCenterIfOutsideViewport(position: IPosition): void {\n\t\tthis._reveaInEditor(position, () => this._editor.revealLineInCenterIfOutsideViewport(position.lineNumber, ScrollType.Smooth));\n\t}\n\n\tprivate _reveaInEditor(position: IPosition, revealFunction: () => void): void {\n\t\tif (this._focused) {\n\t\t\tthis._disposeFocusStickyScrollStore();\n\t\t}\n\t\tthis._positionRevealed = true;\n\t\trevealFunction();\n\t\tthis._editor.setSelection(Range.fromPositions(position));\n\t\tthis._editor.focus();\n\t}\n\n\tprivate _registerMouseListeners(): void {\n\n\t\tconst sessionStore = this._register(new DisposableStore());\n\t\tconst gesture = this._register(new ClickLinkGesture(this._editor, {\n\t\t\textractLineNumberFromMouseEvent: (e) => {\n\t\t\t\tconst position = this._stickyScrollWidget.getEditorPositionFromNode(e.target.element);\n\t\t\t\treturn position ? position.lineNumber : 0;\n\t\t\t}\n\t\t}));\n\n\t\tconst getMouseEventTarget = (mouseEvent: ClickLinkMouseEvent): { range: Range; textElement: HTMLElement } | null => {\n\t\t\tif (!this._editor.hasModel()) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\tif (mouseEvent.target.type !== MouseTargetType.OVERLAY_WIDGET || mouseEvent.target.detail !== this._stickyScrollWidget.getId()) {\n\t\t\t\t// not hovering over our widget\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\tconst mouseTargetElement = mouseEvent.target.element;\n\t\t\tif (!mouseTargetElement || mouseTargetElement.innerText !== mouseTargetElement.innerHTML) {\n\t\t\t\t// not on a span element rendering text\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\tconst position = this._stickyScrollWidget.getEditorPositionFromNode(mouseTargetElement);\n\t\t\tif (!position) {\n\t\t\t\t// not hovering a sticky scroll line\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\treturn {\n\t\t\t\trange: new Range(position.lineNumber, position.column, position.lineNumber, position.column + mouseTargetElement.innerText.length),\n\t\t\t\ttextElement: mouseTargetElement\n\t\t\t};\n\t\t};\n\n\t\tconst stickyScrollWidgetDomNode = this._stickyScrollWidget.getDomNode();\n\t\tthis._register(dom.addStandardDisposableListener(stickyScrollWidgetDomNode, dom.EventType.CLICK, (mouseEvent: IMouseEvent) => {\n\t\t\tif (mouseEvent.ctrlKey || mouseEvent.altKey || mouseEvent.metaKey) {\n\t\t\t\t// modifier pressed\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (!mouseEvent.leftButton) {\n\t\t\t\t// not left click\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (mouseEvent.shiftKey) {\n\t\t\t\t// shift click\n\t\t\t\tconst lineIndex = this._stickyScrollWidget.getLineIndexFromChildDomNode(mouseEvent.target);\n\t\t\t\tif (lineIndex === null) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tconst position = new Position(this._endLineNumbers[lineIndex], 1);\n\t\t\t\tthis._revealLineInCenterIfOutsideViewport(position);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst isInFoldingIconDomNode = this._stickyScrollWidget.isInFoldingIconDomNode(mouseEvent.target);\n\t\t\tif (isInFoldingIconDomNode) {\n\t\t\t\t// clicked on folding icon\n\t\t\t\tconst lineNumber = this._stickyScrollWidget.getLineNumberFromChildDomNode(mouseEvent.target);\n\t\t\t\tthis._toggleFoldingRegionForLine(lineNumber);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst isInStickyLine = this._stickyScrollWidget.isInStickyLine(mouseEvent.target);\n\t\t\tif (!isInStickyLine) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t// normal click\n\t\t\tlet position = this._stickyScrollWidget.getEditorPositionFromNode(mouseEvent.target);\n\t\t\tif (!position) {\n\t\t\t\tconst lineNumber = this._stickyScrollWidget.getLineNumberFromChildDomNode(mouseEvent.target);\n\t\t\t\tif (lineNumber === null) {\n\t\t\t\t\t// not hovering a sticky scroll line\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tposition = new Position(lineNumber, 1);\n\t\t\t}\n\t\t\tthis._revealPosition(position);\n\t\t}));\n\t\tthis._register(dom.addDisposableListener(mainWindow, dom.EventType.MOUSE_MOVE, mouseEvent => {\n\t\t\tthis._mouseTarget = mouseEvent.target;\n\t\t\tthis._onMouseMoveOrKeyDown(mouseEvent);\n\t\t}));\n\t\tthis._register(dom.addDisposableListener(mainWindow, dom.EventType.KEY_DOWN, mouseEvent => {\n\t\t\tthis._onMouseMoveOrKeyDown(mouseEvent);\n\t\t}));\n\t\tthis._register(dom.addDisposableListener(mainWindow, dom.EventType.KEY_UP, () => {\n\t\t\tif (this._showEndForLine !== undefined) {\n\t\t\t\tthis._showEndForLine = undefined;\n\t\t\t\tthis._renderStickyScroll();\n\t\t\t}\n\t\t}));\n\n\t\tthis._register(gesture.onMouseMoveOrRelevantKeyDown(([mouseEvent, _keyboardEvent]) => {\n\t\t\tconst mouseTarget = getMouseEventTarget(mouseEvent);\n\t\t\tif (!mouseTarget || !mouseEvent.hasTriggerModifier || !this._editor.hasModel()) {\n\t\t\t\tsessionStore.clear();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst { range, textElement } = mouseTarget;\n\n\t\t\tif (!range.equalsRange(this._stickyRangeProjectedOnEditor)) {\n\t\t\t\tthis._stickyRangeProjectedOnEditor = range;\n\t\t\t\tsessionStore.clear();\n\t\t\t} else if (textElement.style.textDecoration === 'underline') {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst cancellationToken = new CancellationTokenSource();\n\t\t\tsessionStore.add(toDisposable(() => cancellationToken.dispose(true)));\n\n\t\t\tlet currentHTMLChild: HTMLElement;\n\n\t\t\tgetDefinitionsAtPosition(this._languageFeaturesService.definitionProvider, this._editor.getModel(), new Position(range.startLineNumber, range.startColumn + 1), false, cancellationToken.token).then((candidateDefinitions => {\n\t\t\t\tif (cancellationToken.token.isCancellationRequested) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (candidateDefinitions.length !== 0) {\n\t\t\t\t\tthis._candidateDefinitionsLength = candidateDefinitions.length;\n\t\t\t\t\tconst childHTML: HTMLElement = textElement;\n\t\t\t\t\tif (currentHTMLChild !== childHTML) {\n\t\t\t\t\t\tsessionStore.clear();\n\t\t\t\t\t\tcurrentHTMLChild = childHTML;\n\t\t\t\t\t\tcurrentHTMLChild.style.textDecoration = 'underline';\n\t\t\t\t\t\tsessionStore.add(toDisposable(() => {\n\t\t\t\t\t\t\tcurrentHTMLChild.style.textDecoration = 'none';\n\t\t\t\t\t\t}));\n\t\t\t\t\t} else if (!currentHTMLChild) {\n\t\t\t\t\t\tcurrentHTMLChild = childHTML;\n\t\t\t\t\t\tcurrentHTMLChild.style.textDecoration = 'underline';\n\t\t\t\t\t\tsessionStore.add(toDisposable(() => {\n\t\t\t\t\t\t\tcurrentHTMLChild.style.textDecoration = 'none';\n\t\t\t\t\t\t}));\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tsessionStore.clear();\n\t\t\t\t}\n\t\t\t}));\n\t\t}));\n\t\tthis._register(gesture.onCancel(() => {\n\t\t\tsessionStore.clear();\n\t\t}));\n\t\tthis._register(gesture.onExecute(async e => {\n\t\t\tif (e.target.type !== MouseTargetType.OVERLAY_WIDGET || e.target.detail !== this._stickyScrollWidget.getId()) {\n\t\t\t\t// not hovering over our widget\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst position = this._stickyScrollWidget.getEditorPositionFromNode(e.target.element);\n\t\t\tif (!position) {\n\t\t\t\t// not hovering a sticky scroll line\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (!this._editor.hasModel() || !this._stickyRangeProjectedOnEditor) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (this._candidateDefinitionsLength > 1) {\n\t\t\t\tif (this._focused) {\n\t\t\t\t\tthis._disposeFocusStickyScrollStore();\n\t\t\t\t}\n\t\t\t\tthis._revealPosition({ lineNumber: position.lineNumber, column: 1 });\n\t\t\t}\n\t\t\tthis._instaService.invokeFunction(goToDefinitionWithLocation, e, this._editor as IActiveCodeEditor, { uri: this._editor.getModel().uri, range: this._stickyRangeProjectedOnEditor });\n\t\t}));\n\t}\n\n\tprivate _onContextMenu(targetWindow: Window, e: MouseEvent) {\n\t\tconst event = new StandardMouseEvent(targetWindow, e);\n\n\t\tthis._contextMenuService.showContextMenu({\n\t\t\tmenuId: MenuId.StickyScrollContext,\n\t\t\tgetAnchor: () => event,\n\t\t});\n\t}\n\n\tprivate _onMouseMoveOrKeyDown(mouseEvent: KeyboardEvent | MouseEvent): void {\n\t\tif (!mouseEvent.shiftKey) {\n\t\t\treturn;\n\t\t}\n\t\tif (!this._mouseTarget || !dom.isHTMLElement(this._mouseTarget)) {\n\t\t\treturn;\n\t\t}\n\t\tconst currentEndForLineIndex = this._stickyScrollWidget.getLineIndexFromChildDomNode(this._mouseTarget);\n\t\tif (currentEndForLineIndex === null || this._showEndForLine === currentEndForLineIndex) {\n\t\t\treturn;\n\t\t}\n\t\tthis._showEndForLine = currentEndForLineIndex;\n\t\tthis._renderStickyScroll();\n\t}\n\n\tprivate _toggleFoldingRegionForLine(line: number | null) {\n\t\tif (!this._foldingModel || line === null) {\n\t\t\treturn;\n\t\t}\n\t\tconst stickyLine = this._stickyScrollWidget.getRenderedStickyLine(line);\n\t\tconst foldingIcon = stickyLine?.foldingIcon;\n\t\tif (!foldingIcon) {\n\t\t\treturn;\n\t\t}\n\t\ttoggleCollapseState(this._foldingModel, 1, [line]);\n\t\tfoldingIcon.isCollapsed = !foldingIcon.isCollapsed;\n\t\tconst scrollTop = (foldingIcon.isCollapsed ?\n\t\t\tthis._editor.getTopForLineNumber(foldingIcon.foldingEndLine)\n\t\t\t: this._editor.getTopForLineNumber(foldingIcon.foldingStartLine))\n\t\t\t- this._editor.getOption(EditorOption.lineHeight) * stickyLine.index + 1;\n\t\tthis._editor.setScrollTop(scrollTop);\n\t\tthis._renderStickyScroll(line);\n\t}\n\n\tprivate _readConfiguration() {\n\t\tconst options = this._editor.getOption(EditorOption.stickyScroll);\n\t\tif (options.enabled === false) {\n\t\t\tthis._editor.removeOverlayWidget(this._stickyScrollWidget);\n\t\t\tthis._resetState();\n\t\t\tthis._sessionStore.clear();\n\t\t\tthis._enabled = false;\n\t\t\treturn;\n\t\t} else if (options.enabled && !this._enabled) {\n\t\t\t// When sticky scroll was just enabled, add the listeners on the sticky scroll\n\t\t\tthis._editor.addOverlayWidget(this._stickyScrollWidget);\n\t\t\tthis._sessionStore.add(this._editor.onDidScrollChange((e) => {\n\t\t\t\tif (e.scrollTopChanged) {\n\t\t\t\t\tthis._showEndForLine = undefined;\n\t\t\t\t\tthis._renderStickyScroll();\n\t\t\t\t}\n\t\t\t}));\n\t\t\tthis._sessionStore.add(this._editor.onDidLayoutChange(() => this._onDidResize()));\n\t\t\tthis._sessionStore.add(this._editor.onDidChangeModelTokens((e) => this._onTokensChange(e)));\n\t\t\tthis._sessionStore.add(this._stickyLineCandidateProvider.onDidChangeStickyScroll(() => {\n\t\t\t\tthis._showEndForLine = undefined;\n\t\t\t\tthis._renderStickyScroll();\n\t\t\t}));\n\t\t\tthis._enabled = true;\n\t\t}\n\n\t\tconst lineNumberOption = this._editor.getOption(EditorOption.lineNumbers);\n\t\tif (lineNumberOption.renderType === RenderLineNumbersType.Relative) {\n\t\t\tthis._sessionStore.add(this._editor.onDidChangeCursorPosition(() => {\n\t\t\t\tthis._showEndForLine = undefined;\n\t\t\t\tthis._renderStickyScroll(0);\n\t\t\t}));\n\t\t}\n\t}\n\n\tprivate _readConfigurationChange(event: ConfigurationChangedEvent) {\n\t\tif (\n\t\t\tevent.hasChanged(EditorOption.stickyScroll)\n\t\t\t|| event.hasChanged(EditorOption.minimap)\n\t\t\t|| event.hasChanged(EditorOption.lineHeight)\n\t\t\t|| event.hasChanged(EditorOption.showFoldingControls)\n\t\t\t|| event.hasChanged(EditorOption.lineNumbers)\n\t\t) {\n\t\t\tthis._readConfiguration();\n\t\t}\n\n\t\tif (event.hasChanged(EditorOption.lineNumbers) || event.hasChanged(EditorOption.folding) || event.hasChanged(EditorOption.showFoldingControls)) {\n\t\t\tthis._renderStickyScroll(0);\n\t\t}\n\t}\n\n\tprivate _needsUpdate(event: IModelTokensChangedEvent) {\n\t\tconst stickyLineNumbers = this._stickyScrollWidget.getCurrentLines();\n\t\tfor (const stickyLineNumber of stickyLineNumbers) {\n\t\t\tfor (const range of event.ranges) {\n\t\t\t\tif (stickyLineNumber >= range.fromLineNumber && stickyLineNumber <= range.toLineNumber) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t}\n\n\tprivate _onTokensChange(event: IModelTokensChangedEvent) {\n\t\tif (this._needsUpdate(event)) {\n\t\t\t// Rebuilding the whole widget from line 0\n\t\t\tthis._renderStickyScroll(0);\n\t\t}\n\t}\n\n\tprivate _onDidResize() {\n\t\tconst layoutInfo = this._editor.getLayoutInfo();\n\t\t// Make sure sticky scroll doesn't take up more than 25% of the editor\n\t\tconst theoreticalLines = layoutInfo.height / this._editor.getOption(EditorOption.lineHeight);\n\t\tthis._maxStickyLines = Math.round(theoreticalLines * .25);\n\t\tthis._renderStickyScroll(0);\n\t}\n\n\tprivate async _renderStickyScroll(rebuildFromLine?: number): Promise<void> {\n\t\tconst model = this._editor.getModel();\n\t\tif (!model || model.isTooLargeForTokenization()) {\n\t\t\tthis._resetState();\n\t\t\treturn;\n\t\t}\n\t\tconst nextRebuildFromLine = this._updateAndGetMinRebuildFromLine(rebuildFromLine);\n\t\tconst stickyWidgetVersion = this._stickyLineCandidateProvider.getVersionId();\n\t\tconst shouldUpdateState = stickyWidgetVersion === undefined || stickyWidgetVersion === model.getVersionId();\n\t\tif (shouldUpdateState) {\n\t\t\tif (!this._focused) {\n\t\t\t\tawait this._updateState(nextRebuildFromLine);\n\t\t\t} else {\n\t\t\t\t// Suppose that previously the sticky scroll widget had height 0, then if there are visible lines, set the last line as focused\n\t\t\t\tif (this._focusedStickyElementIndex === -1) {\n\t\t\t\t\tawait this._updateState(nextRebuildFromLine);\n\t\t\t\t\tthis._focusedStickyElementIndex = this._stickyScrollWidget.lineNumberCount - 1;\n\t\t\t\t\tif (this._focusedStickyElementIndex !== -1) {\n\t\t\t\t\t\tthis._stickyScrollWidget.focusLineWithIndex(this._focusedStickyElementIndex);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tconst focusedStickyElementLineNumber = this._stickyScrollWidget.lineNumbers[this._focusedStickyElementIndex];\n\t\t\t\t\tawait this._updateState(nextRebuildFromLine);\n\t\t\t\t\t// Suppose that after setting the state, there are no sticky lines, set the focused index to -1\n\t\t\t\t\tif (this._stickyScrollWidget.lineNumberCount === 0) {\n\t\t\t\t\t\tthis._focusedStickyElementIndex = -1;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconst previousFocusedLineNumberExists = this._stickyScrollWidget.lineNumbers.includes(focusedStickyElementLineNumber);\n\n\t\t\t\t\t\t// If the line number is still there, do not change anything\n\t\t\t\t\t\t// If the line number is not there, set the new focused line to be the last line\n\t\t\t\t\t\tif (!previousFocusedLineNumberExists) {\n\t\t\t\t\t\t\tthis._focusedStickyElementIndex = this._stickyScrollWidget.lineNumberCount - 1;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tthis._stickyScrollWidget.focusLineWithIndex(this._focusedStickyElementIndex);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate _updateAndGetMinRebuildFromLine(rebuildFromLine: number | undefined): number | undefined {\n\t\tif (rebuildFromLine !== undefined) {\n\t\t\tconst minRebuildFromLineOrInfinity = this._minRebuildFromLine !== undefined ? this._minRebuildFromLine : Infinity;\n\t\t\tthis._minRebuildFromLine = Math.min(rebuildFromLine, minRebuildFromLineOrInfinity);\n\t\t}\n\t\treturn this._minRebuildFromLine;\n\t}\n\n\tprivate async _updateState(rebuildFromLine?: number): Promise<void> {\n\t\tthis._minRebuildFromLine = undefined;\n\t\tthis._foldingModel = await FoldingController.get(this._editor)?.getFoldingModel() ?? undefined;\n\t\tthis._widgetState = this.findScrollWidgetState();\n\t\tconst stickyWidgetHasLines = this._widgetState.startLineNumbers.length > 0;\n\t\tthis._stickyScrollVisibleContextKey.set(stickyWidgetHasLines);\n\t\tthis._stickyScrollWidget.setState(this._widgetState, this._foldingModel, rebuildFromLine);\n\t}\n\n\tprivate async _resetState(): Promise<void> {\n\t\tthis._minRebuildFromLine = undefined;\n\t\tthis._foldingModel = undefined;\n\t\tthis._widgetState = StickyScrollWidgetState.Empty;\n\t\tthis._stickyScrollVisibleContextKey.set(false);\n\t\tthis._stickyScrollWidget.setState(undefined, undefined);\n\t}\n\n\tfindScrollWidgetState(): StickyScrollWidgetState {\n\t\tconst maxNumberStickyLines = Math.min(this._maxStickyLines, this._editor.getOption(EditorOption.stickyScroll).maxLineCount);\n\t\tconst scrollTop: number = this._editor.getScrollTop();\n\t\tlet lastLineRelativePosition: number = 0;\n\t\tconst startLineNumbers: number[] = [];\n\t\tconst endLineNumbers: number[] = [];\n\t\tconst arrayVisibleRanges = this._editor.getVisibleRanges();\n\t\tif (arrayVisibleRanges.length !== 0) {\n\t\t\tconst fullVisibleRange = new StickyRange(arrayVisibleRanges[0].startLineNumber, arrayVisibleRanges[arrayVisibleRanges.length - 1].endLineNumber);\n\t\t\tconst candidateRanges = this._stickyLineCandidateProvider.getCandidateStickyLinesIntersecting(fullVisibleRange);\n\t\t\tfor (const range of candidateRanges) {\n\t\t\t\tconst start = range.startLineNumber;\n\t\t\t\tconst end = range.endLineNumber;\n\t\t\t\tconst topOfElement = range.top;\n\t\t\t\tconst bottomOfElement = topOfElement + range.height;\n\t\t\t\tconst topOfBeginningLine = this._editor.getTopForLineNumber(start) - scrollTop;\n\t\t\t\tconst bottomOfEndLine = this._editor.getBottomForLineNumber(end) - scrollTop;\n\t\t\t\tif (topOfElement > topOfBeginningLine && topOfElement <= bottomOfEndLine) {\n\t\t\t\t\tstartLineNumbers.push(start);\n\t\t\t\t\tendLineNumbers.push(end + 1);\n\t\t\t\t\tif (bottomOfElement > bottomOfEndLine) {\n\t\t\t\t\t\tlastLineRelativePosition = bottomOfEndLine - bottomOfElement;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (startLineNumbers.length === maxNumberStickyLines) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tthis._endLineNumbers = endLineNumbers;\n\t\treturn new StickyScrollWidgetState(startLineNumbers, endLineNumbers, lastLineRelativePosition, this._showEndForLine);\n\t}\n\n\toverride dispose(): void {\n\t\tsuper.dispose();\n\t\tthis._sessionStore.dispose();\n\t}\n}\n"]}
|