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
3296 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 interface ISelectBoxStyles extends IListStyles {
57
readonly selectBackground: string | undefined;
58
readonly selectListBackground: string | undefined;
59
readonly selectForeground: string | undefined;
60
readonly decoratorRightForeground: string | undefined;
61
readonly selectBorder: string | undefined;
62
readonly selectListBorder: string | undefined;
63
readonly focusBorder: string | undefined;
64
}
65
66
export const unthemedSelectBoxStyles: ISelectBoxStyles = {
67
...unthemedListStyles,
68
selectBackground: '#3C3C3C',
69
selectForeground: '#F0F0F0',
70
selectBorder: '#3C3C3C',
71
decoratorRightForeground: undefined,
72
selectListBackground: undefined,
73
selectListBorder: undefined,
74
focusBorder: undefined,
75
};
76
77
export interface ISelectData {
78
selected: string;
79
index: number;
80
}
81
82
export class SelectBox extends Widget implements ISelectBoxDelegate {
83
private selectBoxDelegate: ISelectBoxDelegate;
84
85
constructor(options: ISelectOptionItem[], selected: number, contextViewProvider: IContextViewProvider, styles: ISelectBoxStyles, selectBoxOptions?: ISelectBoxOptions) {
86
super();
87
88
// Default to native SelectBox for OSX unless overridden
89
if (isMacintosh && !selectBoxOptions?.useCustomDrawn) {
90
this.selectBoxDelegate = new SelectBoxNative(options, selected, styles, selectBoxOptions);
91
} else {
92
this.selectBoxDelegate = new SelectBoxList(options, selected, contextViewProvider, styles, selectBoxOptions);
93
}
94
95
this._register(this.selectBoxDelegate);
96
}
97
98
// Public SelectBox Methods - routed through delegate interface
99
100
get onDidSelect(): Event<ISelectData> {
101
return this.selectBoxDelegate.onDidSelect;
102
}
103
104
setOptions(options: ISelectOptionItem[], selected?: number): void {
105
this.selectBoxDelegate.setOptions(options, selected);
106
}
107
108
select(index: number): void {
109
this.selectBoxDelegate.select(index);
110
}
111
112
setAriaLabel(label: string): void {
113
this.selectBoxDelegate.setAriaLabel(label);
114
}
115
116
focus(): void {
117
this.selectBoxDelegate.focus();
118
}
119
120
blur(): void {
121
this.selectBoxDelegate.blur();
122
}
123
124
setFocusable(focusable: boolean): void {
125
this.selectBoxDelegate.setFocusable(focusable);
126
}
127
128
setEnabled(enabled: boolean): void {
129
this.selectBoxDelegate.setEnabled(enabled);
130
}
131
132
render(container: HTMLElement): void {
133
this.selectBoxDelegate.render(container);
134
}
135
}
136
137