Path: blob/main/src/vs/base/browser/ui/scrollbar/horizontalScrollbar.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 { StandardWheelEvent } from '../../mouseEvent.js';6import { AbstractScrollbar, ISimplifiedPointerEvent, ScrollbarHost } from './abstractScrollbar.js';7import { ScrollableElementResolvedOptions } from './scrollableElementOptions.js';8import { ARROW_IMG_SIZE } from './scrollbarArrow.js';9import { ScrollbarState } from './scrollbarState.js';10import { Codicon } from '../../../common/codicons.js';11import { INewScrollPosition, Scrollable, ScrollbarVisibility, ScrollEvent } from '../../../common/scrollable.js';1213141516export class HorizontalScrollbar extends AbstractScrollbar {1718constructor(scrollable: Scrollable, options: ScrollableElementResolvedOptions, host: ScrollbarHost) {19const scrollDimensions = scrollable.getScrollDimensions();20const scrollPosition = scrollable.getCurrentScrollPosition();21super({22lazyRender: options.lazyRender,23host: host,24scrollbarState: new ScrollbarState(25(options.horizontalHasArrows ? options.arrowSize : 0),26(options.horizontal === ScrollbarVisibility.Hidden ? 0 : options.horizontalScrollbarSize),27(options.vertical === ScrollbarVisibility.Hidden ? 0 : options.verticalScrollbarSize),28scrollDimensions.width,29scrollDimensions.scrollWidth,30scrollPosition.scrollLeft31),32visibility: options.horizontal,33extraScrollbarClassName: 'horizontal',34scrollable: scrollable,35scrollByPage: options.scrollByPage36});3738if (options.horizontalHasArrows) {39const arrowDelta = (options.arrowSize - ARROW_IMG_SIZE) / 2;40const scrollbarDelta = (options.horizontalScrollbarSize - ARROW_IMG_SIZE) / 2;4142this._createArrow({43className: 'scra',44icon: Codicon.scrollbarButtonLeft,45top: scrollbarDelta,46left: arrowDelta,47bottom: undefined,48right: undefined,49bgWidth: options.arrowSize,50bgHeight: options.horizontalScrollbarSize,51onActivate: () => this._host.onMouseWheel(new StandardWheelEvent(null, 1, 0)),52});5354this._createArrow({55className: 'scra',56icon: Codicon.scrollbarButtonRight,57top: scrollbarDelta,58left: undefined,59bottom: undefined,60right: arrowDelta,61bgWidth: options.arrowSize,62bgHeight: options.horizontalScrollbarSize,63onActivate: () => this._host.onMouseWheel(new StandardWheelEvent(null, -1, 0)),64});65}6667this._createSlider(Math.floor((options.horizontalScrollbarSize - options.horizontalSliderSize) / 2), 0, undefined, options.horizontalSliderSize);68}6970protected _updateSlider(sliderSize: number, sliderPosition: number): void {71this.slider.setWidth(sliderSize);72this.slider.setLeft(sliderPosition);73}7475protected _renderDomNode(largeSize: number, smallSize: number): void {76this.domNode.setWidth(largeSize);77this.domNode.setHeight(smallSize);78this.domNode.setLeft(0);79this.domNode.setBottom(0);80}8182public onDidScroll(e: ScrollEvent): boolean {83this._shouldRender = this._onElementScrollSize(e.scrollWidth) || this._shouldRender;84this._shouldRender = this._onElementScrollPosition(e.scrollLeft) || this._shouldRender;85this._shouldRender = this._onElementSize(e.width) || this._shouldRender;86return this._shouldRender;87}8889protected _pointerDownRelativePosition(offsetX: number, offsetY: number): number {90return offsetX;91}9293protected _sliderPointerPosition(e: ISimplifiedPointerEvent): number {94return e.pageX;95}9697protected _sliderOrthogonalPointerPosition(e: ISimplifiedPointerEvent): number {98return e.pageY;99}100101protected _updateScrollbarSize(size: number): void {102this.slider.setHeight(size);103}104105public writeScrollPosition(target: INewScrollPosition, scrollPosition: number): void {106target.scrollLeft = scrollPosition;107}108109public updateOptions(options: ScrollableElementResolvedOptions): void {110this.updateScrollbarSize(options.horizontal === ScrollbarVisibility.Hidden ? 0 : options.horizontalScrollbarSize);111this._scrollbarState.setOppositeScrollbarSize(options.vertical === ScrollbarVisibility.Hidden ? 0 : options.verticalScrollbarSize);112this._visibilityController.setVisibility(options.horizontal);113this._scrollByPage = options.scrollByPage;114}115}116117118