Path: blob/main/src/vs/sessions/contrib/chat/browser/openInVSCodeWidget.ts
13401 views
/*---------------------------------------------------------------------------------------------1* Copyright (c) Microsoft Corporation. All rights reserved.2* Licensed under the MIT License. See License.txt in the project root for license information.3*--------------------------------------------------------------------------------------------*/45import './media/openInVSCode.css';6import { $, append, EventHelper, EventLike } from '../../../../base/browser/dom.js';7import { getDefaultHoverDelegate } from '../../../../base/browser/ui/hover/hoverDelegateFactory.js';8import { BaseActionViewItem, IBaseActionViewItemOptions } from '../../../../base/browser/ui/actionbar/actionViewItems.js';9import { IAction } from '../../../../base/common/actions.js';10import { Disposable } from '../../../../base/common/lifecycle.js';11import { localize } from '../../../../nls.js';12import { IActionViewItemService } from '../../../../platform/actions/browser/actionViewItemService.js';13import { IHoverService } from '../../../../platform/hover/browser/hover.js';14import { IInstantiationService } from '../../../../platform/instantiation/common/instantiation.js';15import { IProductService } from '../../../../platform/product/common/productService.js';16import { IWorkbenchContribution, registerWorkbenchContribution2, WorkbenchPhase } from '../../../../workbench/common/contributions.js';17import { Menus } from '../../../browser/menus.js';1819const OpenInVSCodeActionId = 'chat.openSessionWorktreeInVSCode';2021/**22* Renders the "Open in VS Code" titlebar entry as an icon-only button that23* expands to reveal a label on hover / keyboard focus.24*/25class OpenInVSCodeTitleBarWidget extends BaseActionViewItem {2627constructor(28action: IAction,29options: IBaseActionViewItemOptions | undefined,30@IProductService private readonly productService: IProductService,31@IHoverService private readonly hoverService: IHoverService,32) {33super(undefined, action, options);34}3536override render(container: HTMLElement): void {37super.render(container);3839container.classList.add('open-in-vscode-titlebar-widget');40container.setAttribute('role', 'button');4142// Set quality attribute for distro icon selection. Only set when quality is43// known so that the CSS fallback icon is used in dev builds.44const quality = this.productService.quality;45if (quality) {46container.setAttribute('data-product-quality', quality);47}4849const label = this.action.label || localize('openInVSCodeLabel', "Open in VS Code");50container.setAttribute('aria-label', label);51this._register(this.hoverService.setupManagedHover(getDefaultHoverDelegate('element'), container, label));5253const icon = append(container, $('span.open-in-vscode-titlebar-widget-icon'));54icon.setAttribute('aria-hidden', 'true');5556const labelEl = append(container, $('span.open-in-vscode-titlebar-widget-label'));57labelEl.textContent = label;58}5960override onClick(event: EventLike): void {61EventHelper.stop(event, true);62this.action.run();63}64}6566/**67* Workbench contribution that registers the custom action view item for68* the "Open in VS Code" action in the sessions titlebar toolbar, replacing69* the default icon-only codicon with a rich expandable widget.70*/71class OpenInVSCodeWidgetContribution extends Disposable implements IWorkbenchContribution {7273static readonly ID = 'workbench.contrib.openInVSCode.widget';7475constructor(76@IActionViewItemService actionViewItemService: IActionViewItemService,77@IInstantiationService instantiationService: IInstantiationService,78) {79super();80this._register(actionViewItemService.register(Menus.TitleBarSessionMenu, OpenInVSCodeActionId, (action, options) => {81return instantiationService.createInstance(OpenInVSCodeTitleBarWidget, action, options);82}, undefined));83}84}8586registerWorkbenchContribution2(OpenInVSCodeWidgetContribution.ID, OpenInVSCodeWidgetContribution, WorkbenchPhase.BlockRestore);878889