Path: blob/main/src/vs/base/browser/ui/selectBox/selectBox.ts
5237 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 { Event } from '../../../common/event.js';6import { IDisposable } from '../../../common/lifecycle.js';7import { isMacintosh } from '../../../common/platform.js';8import { MarkdownActionHandler } from '../../markdownRenderer.js';9import { IContextViewProvider } from '../contextview/contextview.js';10import { IListStyles, unthemedListStyles } from '../list/listWidget.js';11import { Widget } from '../widget.js';12import './selectBox.css';13import { SelectBoxList } from './selectBoxCustom.js';14import { SelectBoxNative } from './selectBoxNative.js';15161718// Public SelectBox interface - Calls routed to appropriate select implementation class1920export interface ISelectBoxDelegate extends IDisposable {2122// Public SelectBox Interface23readonly onDidSelect: Event<ISelectData>;24setOptions(options: ISelectOptionItem[], selected?: number): void;25select(index: number): void;26setAriaLabel(label: string): void;27focus(): void;28blur(): void;29setFocusable(focus: boolean): void;30setEnabled(enabled: boolean): void;3132// Delegated Widget interface33render(container: HTMLElement): void;34}3536export interface ISelectBoxOptions {37useCustomDrawn?: boolean;38ariaLabel?: string;39ariaDescription?: string;40minBottomMargin?: number;41optionsAsChildren?: boolean;42}4344// Utilize optionItem interface to capture all option parameters45export interface ISelectOptionItem {46text: string;47detail?: string;48decoratorRight?: string;49description?: string;50descriptionIsMarkdown?: boolean;51readonly descriptionMarkdownActionHandler?: MarkdownActionHandler;52isDisabled?: boolean;53}5455export const SeparatorSelectOption: Readonly<ISelectOptionItem> = Object.freeze({56text: '\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500',57isDisabled: true,58});5960export interface ISelectBoxStyles extends IListStyles {61readonly selectBackground: string | undefined;62readonly selectListBackground: string | undefined;63readonly selectForeground: string | undefined;64readonly decoratorRightForeground: string | undefined;65readonly selectBorder: string | undefined;66readonly selectListBorder: string | undefined;67readonly focusBorder: string | undefined;68}6970export const unthemedSelectBoxStyles: ISelectBoxStyles = {71...unthemedListStyles,72selectBackground: '#3C3C3C',73selectForeground: '#F0F0F0',74selectBorder: '#3C3C3C',75decoratorRightForeground: undefined,76selectListBackground: undefined,77selectListBorder: undefined,78focusBorder: undefined,79};8081export interface ISelectData {82selected: string;83index: number;84}8586export class SelectBox extends Widget implements ISelectBoxDelegate {87private selectBoxDelegate: ISelectBoxDelegate;8889constructor(options: ISelectOptionItem[], selected: number, contextViewProvider: IContextViewProvider, styles: ISelectBoxStyles, selectBoxOptions?: ISelectBoxOptions) {90super();9192// Default to native SelectBox for OSX unless overridden93if (isMacintosh && !selectBoxOptions?.useCustomDrawn) {94this.selectBoxDelegate = new SelectBoxNative(options, selected, styles, selectBoxOptions);95} else {96this.selectBoxDelegate = new SelectBoxList(options, selected, contextViewProvider, styles, selectBoxOptions);97}9899this._register(this.selectBoxDelegate);100}101102// Public SelectBox Methods - routed through delegate interface103104get onDidSelect(): Event<ISelectData> {105return this.selectBoxDelegate.onDidSelect;106}107108setOptions(options: ISelectOptionItem[], selected?: number): void {109this.selectBoxDelegate.setOptions(options, selected);110}111112select(index: number): void {113this.selectBoxDelegate.select(index);114}115116setAriaLabel(label: string): void {117this.selectBoxDelegate.setAriaLabel(label);118}119120focus(): void {121this.selectBoxDelegate.focus();122}123124blur(): void {125this.selectBoxDelegate.blur();126}127128setFocusable(focusable: boolean): void {129this.selectBoxDelegate.setFocusable(focusable);130}131132setEnabled(enabled: boolean): void {133this.selectBoxDelegate.setEnabled(enabled);134}135136render(container: HTMLElement): void {137this.selectBoxDelegate.render(container);138}139}140141142