Path: blob/main/src/vs/base/browser/ui/selectBox/selectBox.ts
3296 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 interface ISelectBoxStyles extends IListStyles {56readonly selectBackground: string | undefined;57readonly selectListBackground: string | undefined;58readonly selectForeground: string | undefined;59readonly decoratorRightForeground: string | undefined;60readonly selectBorder: string | undefined;61readonly selectListBorder: string | undefined;62readonly focusBorder: string | undefined;63}6465export const unthemedSelectBoxStyles: ISelectBoxStyles = {66...unthemedListStyles,67selectBackground: '#3C3C3C',68selectForeground: '#F0F0F0',69selectBorder: '#3C3C3C',70decoratorRightForeground: undefined,71selectListBackground: undefined,72selectListBorder: undefined,73focusBorder: undefined,74};7576export interface ISelectData {77selected: string;78index: number;79}8081export class SelectBox extends Widget implements ISelectBoxDelegate {82private selectBoxDelegate: ISelectBoxDelegate;8384constructor(options: ISelectOptionItem[], selected: number, contextViewProvider: IContextViewProvider, styles: ISelectBoxStyles, selectBoxOptions?: ISelectBoxOptions) {85super();8687// Default to native SelectBox for OSX unless overridden88if (isMacintosh && !selectBoxOptions?.useCustomDrawn) {89this.selectBoxDelegate = new SelectBoxNative(options, selected, styles, selectBoxOptions);90} else {91this.selectBoxDelegate = new SelectBoxList(options, selected, contextViewProvider, styles, selectBoxOptions);92}9394this._register(this.selectBoxDelegate);95}9697// Public SelectBox Methods - routed through delegate interface9899get onDidSelect(): Event<ISelectData> {100return this.selectBoxDelegate.onDidSelect;101}102103setOptions(options: ISelectOptionItem[], selected?: number): void {104this.selectBoxDelegate.setOptions(options, selected);105}106107select(index: number): void {108this.selectBoxDelegate.select(index);109}110111setAriaLabel(label: string): void {112this.selectBoxDelegate.setAriaLabel(label);113}114115focus(): void {116this.selectBoxDelegate.focus();117}118119blur(): void {120this.selectBoxDelegate.blur();121}122123setFocusable(focusable: boolean): void {124this.selectBoxDelegate.setFocusable(focusable);125}126127setEnabled(enabled: boolean): void {128this.selectBoxDelegate.setEnabled(enabled);129}130131render(container: HTMLElement): void {132this.selectBoxDelegate.render(container);133}134}135136137