Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
microsoft
GitHub Repository: microsoft/vscode
Path: blob/main/src/vs/workbench/browser/parts/views/checkbox.ts
5281 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 * as DOM from '../../../../base/browser/dom.js';
7
import type { IManagedHover } from '../../../../base/browser/ui/hover/hover.js';
8
import { IHoverDelegate } from '../../../../base/browser/ui/hover/hoverDelegate.js';
9
import { Checkbox } from '../../../../base/browser/ui/toggle/toggle.js';
10
import { Emitter, Event } from '../../../../base/common/event.js';
11
import { Disposable } from '../../../../base/common/lifecycle.js';
12
import { localize } from '../../../../nls.js';
13
import type { IHoverService } from '../../../../platform/hover/browser/hover.js';
14
import { defaultCheckboxStyles } from '../../../../platform/theme/browser/defaultStyles.js';
15
import { ITreeItem, ITreeItemCheckboxState } from '../../../common/views.js';
16
17
export class CheckboxStateHandler extends Disposable {
18
private readonly _onDidChangeCheckboxState = this._register(new Emitter<ITreeItem[]>());
19
readonly onDidChangeCheckboxState: Event<ITreeItem[]> = this._onDidChangeCheckboxState.event;
20
21
public setCheckboxState(node: ITreeItem) {
22
this._onDidChangeCheckboxState.fire([node]);
23
}
24
}
25
26
export class TreeItemCheckbox extends Disposable {
27
private toggle: Checkbox | undefined;
28
private readonly checkboxContainer: HTMLDivElement;
29
private hover: IManagedHover | undefined;
30
31
public static readonly checkboxClass = 'custom-view-tree-node-item-checkbox';
32
33
constructor(
34
container: HTMLElement,
35
private readonly checkboxStateHandler: CheckboxStateHandler,
36
private readonly hoverDelegate: IHoverDelegate,
37
private readonly hoverService: IHoverService
38
) {
39
super();
40
this.checkboxContainer = <HTMLDivElement>container;
41
}
42
43
public render(node: ITreeItem) {
44
if (node.checkbox) {
45
if (!this.toggle) {
46
this.createCheckbox(node);
47
}
48
else {
49
this.toggle.checked = node.checkbox.isChecked;
50
}
51
}
52
}
53
54
private createCheckbox(node: ITreeItem) {
55
if (node.checkbox) {
56
this.toggle = new Checkbox('', node.checkbox.isChecked, { ...defaultCheckboxStyles, size: 15 });
57
this.setHover(node.checkbox);
58
this.setAccessibilityInformation(node.checkbox);
59
this.toggle.domNode.classList.add(TreeItemCheckbox.checkboxClass);
60
this.toggle.domNode.tabIndex = 1;
61
DOM.append(this.checkboxContainer, this.toggle.domNode);
62
this.registerListener(node);
63
}
64
}
65
66
private registerListener(node: ITreeItem) {
67
if (this.toggle) {
68
this._register({ dispose: () => this.removeCheckbox() });
69
this._register(this.toggle);
70
this._register(this.toggle.onChange(() => {
71
this.setCheckbox(node);
72
}));
73
}
74
}
75
76
private setHover(checkbox: ITreeItemCheckboxState) {
77
if (this.toggle) {
78
if (!this.hover) {
79
this.hover = this._register(this.hoverService.setupManagedHover(this.hoverDelegate, this.toggle.domNode, this.checkboxHoverContent(checkbox)));
80
} else {
81
this.hover.update(checkbox.tooltip);
82
}
83
}
84
}
85
86
private setCheckbox(node: ITreeItem) {
87
if (this.toggle && node.checkbox) {
88
node.checkbox.isChecked = this.toggle.checked;
89
this.setHover(node.checkbox);
90
91
this.setAccessibilityInformation(node.checkbox);
92
this.checkboxStateHandler.setCheckboxState(node);
93
}
94
}
95
96
private checkboxHoverContent(checkbox: ITreeItemCheckboxState): string {
97
return checkbox.tooltip ? checkbox.tooltip :
98
checkbox.isChecked ? localize('checked', 'Checked') : localize('unchecked', 'Unchecked');
99
}
100
101
private setAccessibilityInformation(checkbox: ITreeItemCheckboxState) {
102
if (this.toggle && checkbox.accessibilityInformation) {
103
this.toggle.setTitle(checkbox.accessibilityInformation.label);
104
if (checkbox.accessibilityInformation.role) {
105
this.toggle.domNode.role = checkbox.accessibilityInformation.role;
106
}
107
}
108
}
109
110
private removeCheckbox() {
111
const children = this.checkboxContainer.children;
112
for (const child of children) {
113
child.remove();
114
}
115
}
116
}
117
118