/*---------------------------------------------------------------------------------------------
 *  Copyright (c) Microsoft Corporation. All rights reserved.
 *  Licensed under the MIT License. See License.txt in the project root for license information.
 *--------------------------------------------------------------------------------------------*/
import { FastDomNode } from "../../fastDomNode.mjs";
import { StandardWheelEvent } from "../../mouseEvent.mjs";
import { ScrollbarArrowOptions } from "./scrollbarArrow.mjs";
import { ScrollbarState } from "./scrollbarState.mjs";
import { ScrollbarVisibilityController } from "./scrollbarVisibilityController.mjs";
import { Widget } from "../widget.mjs";
import { INewScrollPosition, Scrollable, ScrollbarVisibility } from "../../../common/scrollable.mjs";
export interface ISimplifiedPointerEvent {
    buttons: number;
    pageX: number;
    pageY: number;
}
export interface ScrollbarHost {
    onMouseWheel(mouseWheelEvent: StandardWheelEvent): void;
    onDragStart(): void;
    onDragEnd(): void;
}
export interface AbstractScrollbarOptions {
    lazyRender: boolean;
    host: ScrollbarHost;
    scrollbarState: ScrollbarState;
    visibility: ScrollbarVisibility;
    extraScrollbarClassName: string;
    scrollable: Scrollable;
    scrollByPage: boolean;
}
export declare abstract class AbstractScrollbar extends Widget {
    protected _host: ScrollbarHost;
    protected _scrollable: Scrollable;
    protected _scrollByPage: boolean;
    private _lazyRender;
    protected _scrollbarState: ScrollbarState;
    protected _visibilityController: ScrollbarVisibilityController;
    private _pointerMoveMonitor;
    domNode: FastDomNode<HTMLElement>;
    slider: FastDomNode<HTMLElement>;
    protected _shouldRender: boolean;
    constructor(opts: AbstractScrollbarOptions);
    /**
     * Creates the dom node for an arrow & adds it to the container
     */
    protected _createArrow(opts: ScrollbarArrowOptions): void;
    /**
     * Creates the slider dom node, adds it to the container & hooks up the events
     */
    protected _createSlider(top: number, left: number, width: number | undefined, height: number | undefined): void;
    protected _onElementSize(visibleSize: number): boolean;
    protected _onElementScrollSize(elementScrollSize: number): boolean;
    protected _onElementScrollPosition(elementScrollPosition: number): boolean;
    beginReveal(): void;
    beginHide(): void;
    render(): void;
    private _domNodePointerDown;
    delegatePointerDown(e: PointerEvent): void;
    private _onPointerDown;
    private _sliderPointerDown;
    private _setDesiredScrollPositionNow;
    updateScrollbarSize(scrollbarSize: number): void;
    isNeeded(): boolean;
    protected abstract _renderDomNode(largeSize: number, smallSize: number): void;
    protected abstract _updateSlider(sliderSize: number, sliderPosition: number): void;
    protected abstract _pointerDownRelativePosition(offsetX: number, offsetY: number): number;
    protected abstract _sliderPointerPosition(e: ISimplifiedPointerEvent): number;
    protected abstract _sliderOrthogonalPointerPosition(e: ISimplifiedPointerEvent): number;
    protected abstract _updateScrollbarSize(size: number): void;
    abstract writeScrollPosition(target: INewScrollPosition, scrollPosition: number): void;
}
