Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
microsoft
GitHub Repository: microsoft/vscode
Path: blob/main/src/vs/base/browser/ui/selectBox/selectBox.ts
5237 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 { Event } from '../../../common/event.js';
7
import { IDisposable } from '../../../common/lifecycle.js';
8
import { isMacintosh } from '../../../common/platform.js';
9
import { MarkdownActionHandler } from '../../markdownRenderer.js';
10
import { IContextViewProvider } from '../contextview/contextview.js';
11
import { IListStyles, unthemedListStyles } from '../list/listWidget.js';
12
import { Widget } from '../widget.js';
13
import './selectBox.css';
14
import { SelectBoxList } from './selectBoxCustom.js';
15
import { SelectBoxNative } from './selectBoxNative.js';
16
17
18
19
// Public SelectBox interface - Calls routed to appropriate select implementation class
20
21
export interface ISelectBoxDelegate extends IDisposable {
22
23
// Public SelectBox Interface
24
readonly onDidSelect: Event<ISelectData>;
25
setOptions(options: ISelectOptionItem[], selected?: number): void;
26
select(index: number): void;
27
setAriaLabel(label: string): void;
28
focus(): void;
29
blur(): void;
30
setFocusable(focus: boolean): void;
31
setEnabled(enabled: boolean): void;
32
33
// Delegated Widget interface
34
render(container: HTMLElement): void;
35
}
36
37
export interface ISelectBoxOptions {
38
useCustomDrawn?: boolean;
39
ariaLabel?: string;
40
ariaDescription?: string;
41
minBottomMargin?: number;
42
optionsAsChildren?: boolean;
43
}
44
45
// Utilize optionItem interface to capture all option parameters
46
export interface ISelectOptionItem {
47
text: string;
48
detail?: string;
49
decoratorRight?: string;
50
description?: string;
51
descriptionIsMarkdown?: boolean;
52
readonly descriptionMarkdownActionHandler?: MarkdownActionHandler;
53
isDisabled?: boolean;
54
}
55
56
export const SeparatorSelectOption: Readonly<ISelectOptionItem> = Object.freeze({
57
text: '\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500',
58
isDisabled: true,
59
});
60
61
export interface ISelectBoxStyles extends IListStyles {
62
readonly selectBackground: string | undefined;
63
readonly selectListBackground: string | undefined;
64
readonly selectForeground: string | undefined;
65
readonly decoratorRightForeground: string | undefined;
66
readonly selectBorder: string | undefined;
67
readonly selectListBorder: string | undefined;
68
readonly focusBorder: string | undefined;
69
}
70
71
export const unthemedSelectBoxStyles: ISelectBoxStyles = {
72
...unthemedListStyles,
73
selectBackground: '#3C3C3C',
74
selectForeground: '#F0F0F0',
75
selectBorder: '#3C3C3C',
76
decoratorRightForeground: undefined,
77
selectListBackground: undefined,
78
selectListBorder: undefined,
79
focusBorder: undefined,
80
};
81
82
export interface ISelectData {
83
selected: string;
84
index: number;
85
}
86
87
export class SelectBox extends Widget implements ISelectBoxDelegate {
88
private selectBoxDelegate: ISelectBoxDelegate;
89
90
constructor(options: ISelectOptionItem[], selected: number, contextViewProvider: IContextViewProvider, styles: ISelectBoxStyles, selectBoxOptions?: ISelectBoxOptions) {
91
super();
92
93
// Default to native SelectBox for OSX unless overridden
94
if (isMacintosh && !selectBoxOptions?.useCustomDrawn) {
95
this.selectBoxDelegate = new SelectBoxNative(options, selected, styles, selectBoxOptions);
96
} else {
97
this.selectBoxDelegate = new SelectBoxList(options, selected, contextViewProvider, styles, selectBoxOptions);
98
}
99
100
this._register(this.selectBoxDelegate);
101
}
102
103
// Public SelectBox Methods - routed through delegate interface
104
105
get onDidSelect(): Event<ISelectData> {
106
return this.selectBoxDelegate.onDidSelect;
107
}
108
109
setOptions(options: ISelectOptionItem[], selected?: number): void {
110
this.selectBoxDelegate.setOptions(options, selected);
111
}
112
113
select(index: number): void {
114
this.selectBoxDelegate.select(index);
115
}
116
117
setAriaLabel(label: string): void {
118
this.selectBoxDelegate.setAriaLabel(label);
119
}
120
121
focus(): void {
122
this.selectBoxDelegate.focus();
123
}
124
125
blur(): void {
126
this.selectBoxDelegate.blur();
127
}
128
129
setFocusable(focusable: boolean): void {
130
this.selectBoxDelegate.setFocusable(focusable);
131
}
132
133
setEnabled(enabled: boolean): void {
134
this.selectBoxDelegate.setEnabled(enabled);
135
}
136
137
render(container: HTMLElement): void {
138
this.selectBoxDelegate.render(container);
139
}
140
}
141
142