Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
microsoft
GitHub Repository: microsoft/vscode
Path: blob/main/src/vs/sessions/contrib/chat/browser/openInVSCodeWidget.ts
13401 views
1
/*---------------------------------------------------------------------------------------------
2
* Copyright (c) Microsoft Corporation. All rights reserved.
3
* Licensed under the MIT License. See License.txt in the project root for license information.
4
*--------------------------------------------------------------------------------------------*/
5
6
import './media/openInVSCode.css';
7
import { $, append, EventHelper, EventLike } from '../../../../base/browser/dom.js';
8
import { getDefaultHoverDelegate } from '../../../../base/browser/ui/hover/hoverDelegateFactory.js';
9
import { BaseActionViewItem, IBaseActionViewItemOptions } from '../../../../base/browser/ui/actionbar/actionViewItems.js';
10
import { IAction } from '../../../../base/common/actions.js';
11
import { Disposable } from '../../../../base/common/lifecycle.js';
12
import { localize } from '../../../../nls.js';
13
import { IActionViewItemService } from '../../../../platform/actions/browser/actionViewItemService.js';
14
import { IHoverService } from '../../../../platform/hover/browser/hover.js';
15
import { IInstantiationService } from '../../../../platform/instantiation/common/instantiation.js';
16
import { IProductService } from '../../../../platform/product/common/productService.js';
17
import { IWorkbenchContribution, registerWorkbenchContribution2, WorkbenchPhase } from '../../../../workbench/common/contributions.js';
18
import { Menus } from '../../../browser/menus.js';
19
20
const OpenInVSCodeActionId = 'chat.openSessionWorktreeInVSCode';
21
22
/**
23
* Renders the "Open in VS Code" titlebar entry as an icon-only button that
24
* expands to reveal a label on hover / keyboard focus.
25
*/
26
class OpenInVSCodeTitleBarWidget extends BaseActionViewItem {
27
28
constructor(
29
action: IAction,
30
options: IBaseActionViewItemOptions | undefined,
31
@IProductService private readonly productService: IProductService,
32
@IHoverService private readonly hoverService: IHoverService,
33
) {
34
super(undefined, action, options);
35
}
36
37
override render(container: HTMLElement): void {
38
super.render(container);
39
40
container.classList.add('open-in-vscode-titlebar-widget');
41
container.setAttribute('role', 'button');
42
43
// Set quality attribute for distro icon selection. Only set when quality is
44
// known so that the CSS fallback icon is used in dev builds.
45
const quality = this.productService.quality;
46
if (quality) {
47
container.setAttribute('data-product-quality', quality);
48
}
49
50
const label = this.action.label || localize('openInVSCodeLabel', "Open in VS Code");
51
container.setAttribute('aria-label', label);
52
this._register(this.hoverService.setupManagedHover(getDefaultHoverDelegate('element'), container, label));
53
54
const icon = append(container, $('span.open-in-vscode-titlebar-widget-icon'));
55
icon.setAttribute('aria-hidden', 'true');
56
57
const labelEl = append(container, $('span.open-in-vscode-titlebar-widget-label'));
58
labelEl.textContent = label;
59
}
60
61
override onClick(event: EventLike): void {
62
EventHelper.stop(event, true);
63
this.action.run();
64
}
65
}
66
67
/**
68
* Workbench contribution that registers the custom action view item for
69
* the "Open in VS Code" action in the sessions titlebar toolbar, replacing
70
* the default icon-only codicon with a rich expandable widget.
71
*/
72
class OpenInVSCodeWidgetContribution extends Disposable implements IWorkbenchContribution {
73
74
static readonly ID = 'workbench.contrib.openInVSCode.widget';
75
76
constructor(
77
@IActionViewItemService actionViewItemService: IActionViewItemService,
78
@IInstantiationService instantiationService: IInstantiationService,
79
) {
80
super();
81
this._register(actionViewItemService.register(Menus.TitleBarSessionMenu, OpenInVSCodeActionId, (action, options) => {
82
return instantiationService.createInstance(OpenInVSCodeTitleBarWidget, action, options);
83
}, undefined));
84
}
85
}
86
87
registerWorkbenchContribution2(OpenInVSCodeWidgetContribution.ID, OpenInVSCodeWidgetContribution, WorkbenchPhase.BlockRestore);
88
89