/*---------------------------------------------------------------------------------------------
 *  Copyright (c) Microsoft Corporation. All rights reserved.
 *  Licensed under the MIT License. See License.txt in the project root for license information.
 *--------------------------------------------------------------------------------------------*/

import { Event } from './event.mjs';
import { Disposable, IDisposable } from './lifecycle.mjs';
export declare const enum ScrollbarVisibility {
	Auto = 1,
	Hidden = 2,
	Visible = 3,
}
export interface ScrollEvent {
	inSmoothScrolling: boolean;
	oldWidth: number;
	oldScrollWidth: number;
	oldScrollLeft: number;
	width: number;
	scrollWidth: number;
	scrollLeft: number;
	oldHeight: number;
	oldScrollHeight: number;
	oldScrollTop: number;
	height: number;
	scrollHeight: number;
	scrollTop: number;
	widthChanged: boolean;
	scrollWidthChanged: boolean;
	scrollLeftChanged: boolean;
	heightChanged: boolean;
	scrollHeightChanged: boolean;
	scrollTopChanged: boolean;
}
export declare class ScrollState implements IScrollDimensions, IScrollPosition {
	private readonly _forceIntegerValues;
	_scrollStateBrand: void;
	readonly rawScrollLeft: number;
	readonly rawScrollTop: number;
	readonly width: number;
	readonly scrollWidth: number;
	readonly scrollLeft: number;
	readonly height: number;
	readonly scrollHeight: number;
	readonly scrollTop: number;
	constructor(
		_forceIntegerValues: boolean,
		width: number,
		scrollWidth: number,
		scrollLeft: number,
		height: number,
		scrollHeight: number,
		scrollTop: number,
	);
	equals(other: ScrollState): boolean;
	withScrollDimensions(update: INewScrollDimensions, useRawScrollPositions: boolean): ScrollState;
	withScrollPosition(update: INewScrollPosition): ScrollState;
	createScrollEvent(previous: ScrollState, inSmoothScrolling: boolean): ScrollEvent;
}
export interface IScrollDimensions {
	readonly width: number;
	readonly scrollWidth: number;
	readonly height: number;
	readonly scrollHeight: number;
}
export interface INewScrollDimensions {
	width?: number;
	scrollWidth?: number;
	height?: number;
	scrollHeight?: number;
}
export interface IScrollPosition {
	readonly scrollLeft: number;
	readonly scrollTop: number;
}
export interface ISmoothScrollPosition {
	readonly scrollLeft: number;
	readonly scrollTop: number;
	readonly width: number;
	readonly height: number;
}
export interface INewScrollPosition {
	scrollLeft?: number;
	scrollTop?: number;
}
export interface IScrollableOptions {
	/**
	 * Define if the scroll values should always be integers.
	 */
	forceIntegerValues: boolean;
	/**
	 * Set the duration (ms) used for smooth scroll animations.
	 */
	smoothScrollDuration: number;
	/**
	 * A function to schedule an update at the next frame (used for smooth scroll animations).
	 */
	scheduleAtNextAnimationFrame: (callback: () => void) => IDisposable;
}
export declare class Scrollable extends Disposable {
	_scrollableBrand: void;
	private _smoothScrollDuration;
	private readonly _scheduleAtNextAnimationFrame;
	private _state;
	private _smoothScrolling;
	private _onScroll;
	readonly onScroll: Event<ScrollEvent>;
	constructor(options: IScrollableOptions);
	dispose(): void;
	setSmoothScrollDuration(smoothScrollDuration: number): void;
	validateScrollPosition(scrollPosition: INewScrollPosition): IScrollPosition;
	getScrollDimensions(): IScrollDimensions;
	setScrollDimensions(dimensions: INewScrollDimensions, useRawScrollPositions: boolean): void;
	/**
	 * Returns the final scroll position that the instance will have once the smooth scroll animation concludes.
	 * If no scroll animation is occurring, it will return the current scroll position instead.
	 */
	getFutureScrollPosition(): IScrollPosition;
	/**
	 * Returns the current scroll position.
	 * Note: This result might be an intermediate scroll position, as there might be an ongoing smooth scroll animation.
	 */
	getCurrentScrollPosition(): IScrollPosition;
	setScrollPositionNow(update: INewScrollPosition): void;
	setScrollPositionSmooth(update: INewScrollPosition, reuseAnimation?: boolean): void;
	private _performSmoothScrolling;
	private _setState;
}
export declare class SmoothScrollingUpdate {
	readonly scrollLeft: number;
	readonly scrollTop: number;
	readonly isDone: boolean;
	constructor(scrollLeft: number, scrollTop: number, isDone: boolean);
}
export declare class SmoothScrollingOperation {
	readonly from: ISmoothScrollPosition;
	to: ISmoothScrollPosition;
	readonly duration: number;
	readonly startTime: number;
	animationFrameDisposable: IDisposable | null;
	private scrollLeft;
	private scrollTop;
	constructor(from: ISmoothScrollPosition, to: ISmoothScrollPosition, startTime: number, duration: number);
	private _initAnimations;
	private _initAnimation;
	dispose(): void;
	acceptScrollDimensions(state: ScrollState): void;
	tick(): SmoothScrollingUpdate;
	protected _tick(now: number): SmoothScrollingUpdate;
	combine(from: ISmoothScrollPosition, to: ISmoothScrollPosition, duration: number): SmoothScrollingOperation;
	static start(from: ISmoothScrollPosition, to: ISmoothScrollPosition, duration: number): SmoothScrollingOperation;
}
