diff --git a/src/vs/workbench/contrib/inlineChat/browser/inlineChat.contribution.ts b/src/vs/workbench/contrib/inlineChat/browser/inlineChat.contribution.ts index 96f58a5b6f8..046890e899f 100644 --- a/src/vs/workbench/contrib/inlineChat/browser/inlineChat.contribution.ts +++ b/src/vs/workbench/contrib/inlineChat/browser/inlineChat.contribution.ts @@ -7,20 +7,15 @@ import { registerAction2 } from 'vs/platform/actions/common/actions'; import { EditorContributionInstantiation, registerEditorContribution } from 'vs/editor/browser/editorExtensions'; import { InlineChatController } from 'vs/workbench/contrib/inlineChat/browser/inlineChatController'; import * as InlineChatActions from 'vs/workbench/contrib/inlineChat/browser/inlineChatActions'; -import { CTX_INLINE_CHAT_FOCUSED, CTX_INLINE_CHAT_RESPONSE_FOCUSED, IInlineChatService, INLINE_CHAT_ID, INTERACTIVE_EDITOR_ACCESSIBILITY_HELP_ID } from 'vs/workbench/contrib/inlineChat/common/inlineChat'; +import { IInlineChatService, INLINE_CHAT_ID, INTERACTIVE_EDITOR_ACCESSIBILITY_HELP_ID } from 'vs/workbench/contrib/inlineChat/common/inlineChat'; import { InstantiationType, registerSingleton } from 'vs/platform/instantiation/common/extensions'; import { InlineChatServiceImpl } from 'vs/workbench/contrib/inlineChat/common/inlineChatServiceImpl'; import { IInlineChatSessionService, InlineChatSessionService } from 'vs/workbench/contrib/inlineChat/browser/inlineChatSession'; import { Registry } from 'vs/platform/registry/common/platform'; import { LifecyclePhase } from 'vs/workbench/services/lifecycle/common/lifecycle'; import { InlineChatNotebookContribution } from 'vs/workbench/contrib/inlineChat/browser/inlineChatNotebook'; -import { AccessibilityVerbositySettingId } from 'vs/workbench/contrib/accessibility/browser/accessibilityConfiguration'; -import { AccessibleViewType, IAccessibleViewService } from 'vs/workbench/contrib/accessibility/browser/accessibleView'; -import { Disposable } from 'vs/base/common/lifecycle'; -import { ICodeEditorService } from 'vs/editor/browser/services/codeEditorService'; -import { Extensions, IWorkbenchContributionsRegistry, Extensions as WorkbenchExtensions } from 'vs/workbench/common/contributions'; -import { ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey'; -import { AccessibleViewAction } from 'vs/workbench/contrib/accessibility/browser/accessibleViewActions'; +import { IWorkbenchContributionsRegistry, Extensions as WorkbenchExtensions } from 'vs/workbench/common/contributions'; +import { InlineChatAccessibleViewContribution } from './inlineChatAccessibleView'; registerSingleton(IInlineChatService, InlineChatServiceImpl, InstantiationType.Delayed); registerSingleton(IInlineChatSessionService, InlineChatSessionService, InstantiationType.Delayed); @@ -54,44 +49,6 @@ registerAction2(InlineChatActions.ApplyPreviewEdits); registerAction2(InlineChatActions.CopyRecordings); - -Registry.as(Extensions.Workbench) - .registerWorkbenchContribution(InlineChatNotebookContribution, LifecyclePhase.Restored); - - -class InlineChatAccessibleViewContribution extends Disposable { - static ID: 'inlineChatAccessibleViewContribution'; - constructor() { - super(); - this._register(AccessibleViewAction.addImplementation(100, 'inlineChat', accessor => { - const accessibleViewService = accessor.get(IAccessibleViewService); - const codeEditorService = accessor.get(ICodeEditorService); - - const editor = (codeEditorService.getActiveCodeEditor() || codeEditorService.getFocusedCodeEditor()); - if (!editor) { - return false; - } - const controller = InlineChatController.get(editor); - if (!controller) { - return false; - } - const responseContent = controller?.getMessage(); - if (!responseContent) { - return false; - } - accessibleViewService.show({ - verbositySettingKey: AccessibilityVerbositySettingId.InlineChat, - provideContent(): string { return responseContent; }, - onClose() { - controller.focus(); - }, - - options: { type: AccessibleViewType.View } - }); - return true; - }, ContextKeyExpr.or(CTX_INLINE_CHAT_FOCUSED, CTX_INLINE_CHAT_RESPONSE_FOCUSED))); - } -} - const workbenchContributionsRegistry = Registry.as(WorkbenchExtensions.Workbench); +workbenchContributionsRegistry.registerWorkbenchContribution(InlineChatNotebookContribution, LifecyclePhase.Restored); workbenchContributionsRegistry.registerWorkbenchContribution(InlineChatAccessibleViewContribution, LifecyclePhase.Eventually); diff --git a/src/vs/workbench/contrib/inlineChat/browser/inlineChatAccessibleView.ts b/src/vs/workbench/contrib/inlineChat/browser/inlineChatAccessibleView.ts new file mode 100644 index 00000000000..162d8329ebb --- /dev/null +++ b/src/vs/workbench/contrib/inlineChat/browser/inlineChatAccessibleView.ts @@ -0,0 +1,47 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { InlineChatController } from 'vs/workbench/contrib/inlineChat/browser/inlineChatController'; +import { CTX_INLINE_CHAT_FOCUSED, CTX_INLINE_CHAT_RESPONSE_FOCUSED } from 'vs/workbench/contrib/inlineChat/common/inlineChat'; +import { AccessibilityVerbositySettingId } from 'vs/workbench/contrib/accessibility/browser/accessibilityConfiguration'; +import { AccessibleViewType, IAccessibleViewService } from 'vs/workbench/contrib/accessibility/browser/accessibleView'; +import { Disposable } from 'vs/base/common/lifecycle'; +import { ICodeEditorService } from 'vs/editor/browser/services/codeEditorService'; +import { ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey'; +import { AccessibleViewAction } from 'vs/workbench/contrib/accessibility/browser/accessibleViewActions'; + +export class InlineChatAccessibleViewContribution extends Disposable { + static ID: 'inlineChatAccessibleViewContribution'; + constructor() { + super(); + this._register(AccessibleViewAction.addImplementation(100, 'inlineChat', accessor => { + const accessibleViewService = accessor.get(IAccessibleViewService); + const codeEditorService = accessor.get(ICodeEditorService); + + const editor = (codeEditorService.getActiveCodeEditor() || codeEditorService.getFocusedCodeEditor()); + if (!editor) { + return false; + } + const controller = InlineChatController.get(editor); + if (!controller) { + return false; + } + const responseContent = controller?.getMessage(); + if (!responseContent) { + return false; + } + accessibleViewService.show({ + verbositySettingKey: AccessibilityVerbositySettingId.InlineChat, + provideContent(): string { return responseContent; }, + onClose() { + controller.focus(); + }, + + options: { type: AccessibleViewType.View } + }); + return true; + }, ContextKeyExpr.or(CTX_INLINE_CHAT_FOCUSED, CTX_INLINE_CHAT_RESPONSE_FOCUSED))); + } +} diff --git a/src/vs/workbench/contrib/inlineChat/browser/inlineChatActions.ts b/src/vs/workbench/contrib/inlineChat/browser/inlineChatActions.ts index 717d6cf8f59..03802665d4b 100644 --- a/src/vs/workbench/contrib/inlineChat/browser/inlineChatActions.ts +++ b/src/vs/workbench/contrib/inlineChat/browser/inlineChatActions.ts @@ -21,15 +21,12 @@ import { IQuickInputService, IQuickPickItem } from 'vs/platform/quickinput/commo import { IEditorService, SIDE_GROUP } from 'vs/workbench/services/editor/common/editorService'; import { IUntitledTextResourceEditorInput } from 'vs/workbench/common/editor'; import { ICodeEditorService } from 'vs/editor/browser/services/codeEditorService'; -import { Range } from 'vs/editor/common/core/range'; -import { Selection } from 'vs/editor/common/core/selection'; import { fromNow } from 'vs/base/common/date'; import { IInlineChatSessionService, Recording } from 'vs/workbench/contrib/inlineChat/browser/inlineChatSession'; import { runAccessibilityHelpAction } from 'vs/workbench/contrib/chat/browser/actions/chatAccessibilityHelp'; import { CONTEXT_ACCESSIBILITY_MODE_ENABLED } from 'vs/platform/accessibility/common/accessibility'; import { Disposable } from 'vs/base/common/lifecycle'; import { CommandsRegistry } from 'vs/platform/commands/common/commands'; -import { Position } from 'vs/editor/common/core/position'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { AccessibilityHelpAction } from 'vs/workbench/contrib/accessibility/browser/accessibleViewActions'; @@ -52,23 +49,11 @@ export class StartSessionAction extends EditorAction2 { }); } - private _isInteractivEditorOptions(options: any): options is InlineChatRunOptions { - const { initialSelection, initialRange, message, autoSend, position } = options; - if ( - typeof message !== 'undefined' && typeof message !== 'string' - || typeof autoSend !== 'undefined' && typeof autoSend !== 'boolean' - || typeof initialRange !== 'undefined' && !Range.isIRange(initialRange) - || typeof initialSelection !== 'undefined' && !Selection.isISelection(initialSelection) - || typeof position !== 'undefined' && !Position.isIPosition(position)) { - return false; - } - return true; - } override runEditorCommand(_accessor: ServicesAccessor, editor: ICodeEditor, ..._args: any[]) { let options: InlineChatRunOptions | undefined; const arg = _args[0]; - if (arg && this._isInteractivEditorOptions(arg)) { + if (arg && InlineChatRunOptions.isInteractiveEditorOptions(arg)) { options = arg; } InlineChatController.get(editor)?.run(options); diff --git a/src/vs/workbench/contrib/inlineChat/browser/inlineChatController.ts b/src/vs/workbench/contrib/inlineChat/browser/inlineChatController.ts index 30c8d290a47..a8c3f04aa1d 100644 --- a/src/vs/workbench/contrib/inlineChat/browser/inlineChatController.ts +++ b/src/vs/workbench/contrib/inlineChat/browser/inlineChatController.ts @@ -38,7 +38,7 @@ import { Lazy } from 'vs/base/common/lazy'; import { Progress } from 'vs/platform/progress/common/progress'; import { generateUuid } from 'vs/base/common/uuid'; import { TextEdit } from 'vs/editor/common/languages'; -import { ISelection } from 'vs/editor/common/core/selection'; +import { ISelection, Selection } from 'vs/editor/common/core/selection'; import { onUnexpectedError } from 'vs/base/common/errors'; export const enum State { @@ -64,7 +64,7 @@ const enum Message { RERUN_INPUT = 1 << 6, } -export interface InlineChatRunOptions { +export abstract class InlineChatRunOptions { initialSelection?: ISelection; initialRange?: IRange; message?: string; @@ -72,6 +72,19 @@ export interface InlineChatRunOptions { existingSession?: Session; isUnstashed?: boolean; position?: IPosition; + + static isInteractiveEditorOptions(options: any): options is InlineChatRunOptions { + const { initialSelection, initialRange, message, autoSend, position } = options; + if ( + typeof message !== 'undefined' && typeof message !== 'string' + || typeof autoSend !== 'undefined' && typeof autoSend !== 'boolean' + || typeof initialRange !== 'undefined' && !Range.isIRange(initialRange) + || typeof initialSelection !== 'undefined' && !Selection.isISelection(initialSelection) + || typeof position !== 'undefined' && !Position.isIPosition(position)) { + return false; + } + return true; + } } export class InlineChatController implements IEditorContribution { diff --git a/src/vs/workbench/contrib/inlineChat/browser/inlineChatWidget.ts b/src/vs/workbench/contrib/inlineChat/browser/inlineChatWidget.ts index 370a58cbc05..f925df2421d 100644 --- a/src/vs/workbench/contrib/inlineChat/browser/inlineChatWidget.ts +++ b/src/vs/workbench/contrib/inlineChat/browser/inlineChatWidget.ts @@ -177,10 +177,10 @@ export class InlineChatWidget { private readonly _previewCreateEditor: IdleValue; private readonly _previewCreateModel = this._store.add(new MutableDisposable()); - private readonly _onDidChangeHeight = new MicrotaskEmitter(); + private readonly _onDidChangeHeight = this._store.add(new MicrotaskEmitter()); readonly onDidChangeHeight: Event = Event.filter(this._onDidChangeHeight.event, _ => !this._isLayouting); - private readonly _onDidChangeInput = new Emitter(); + private readonly _onDidChangeInput = this._store.add(new Emitter()); readonly onDidChangeInput: Event = this._onDidChangeInput.event; private _lastDim: Dimension | undefined;