/*---------------------------------------------------------------------------------------------
 *  Copyright (c) Microsoft Corporation. All rights reserved.
 *  Licensed under the MIT License. See License.txt in the project root for license information.
 *--------------------------------------------------------------------------------------------*/
import { IDragAndDropData } from "../../dnd.mjs";
import { Dimension } from "../../dom.mjs";
import { IMouseWheelEvent } from "../../mouseEvent.mjs";
import { Event } from "../../../common/event.mjs";
import { IDisposable } from "../../../common/lifecycle.mjs";
import { ScrollbarVisibility, ScrollEvent } from "../../../common/scrollable.mjs";
import { ISpliceable } from "../../../common/sequence.mjs";
import { IListDragAndDrop, IListGestureEvent, IListMouseEvent, IListRenderer, IListTouchEvent, IListVirtualDelegate } from "./list.mjs";
import { IObservableValue } from "../../../common/observableValue.mjs";
import { AriaRole } from "../aria/aria.mjs";
export interface IListViewDragAndDrop<T> extends IListDragAndDrop<T> {
    getDragElements(element: T): T[];
}
export interface IListViewAccessibilityProvider<T> {
    getSetSize?(element: T, index: number, listLength: number): number;
    getPosInSet?(element: T, index: number): number;
    getRole?(element: T): AriaRole | undefined;
    isChecked?(element: T): boolean | IObservableValue<boolean> | undefined;
}
export interface IListViewOptionsUpdate {
    readonly additionalScrollHeight?: number;
    readonly smoothScrolling?: boolean;
    readonly horizontalScrolling?: boolean;
    readonly mouseWheelScrollSensitivity?: number;
    readonly fastScrollSensitivity?: number;
}
export interface IListViewOptions<T> extends IListViewOptionsUpdate {
    readonly dnd?: IListViewDragAndDrop<T>;
    readonly useShadows?: boolean;
    readonly verticalScrollMode?: ScrollbarVisibility;
    readonly setRowLineHeight?: boolean;
    readonly setRowHeight?: boolean;
    readonly supportDynamicHeights?: boolean;
    readonly mouseSupport?: boolean;
    readonly accessibilityProvider?: IListViewAccessibilityProvider<T>;
    readonly transformOptimization?: boolean;
    readonly alwaysConsumeMouseWheel?: boolean;
    readonly initialSize?: Dimension;
}
export declare class ElementsDragAndDropData<T, TContext = void> implements IDragAndDropData {
    readonly elements: T[];
    private _context;
    get context(): TContext | undefined;
    set context(value: TContext | undefined);
    constructor(elements: T[]);
    update(): void;
    getData(): T[];
}
export declare class ExternalElementsDragAndDropData<T> implements IDragAndDropData {
    readonly elements: T[];
    constructor(elements: T[]);
    update(): void;
    getData(): T[];
}
export declare class NativeDragAndDropData implements IDragAndDropData {
    readonly types: any[];
    readonly files: any[];
    constructor();
    update(dataTransfer: DataTransfer): void;
    getData(): any;
}
/**
 * The {@link ListView} is a virtual scrolling engine.
 *
 * Given that it only renders elements within its viewport, it can hold large
 * collections of elements and stay very performant. The performance bottleneck
 * usually lies within the user's rendering code for each element.
 *
 * @remarks It is a low-level widget, not meant to be used directly. Refer to the
 * List widget instead.
 */
export declare class ListView<T> implements ISpliceable<T>, IDisposable {
    private virtualDelegate;
    private static InstanceCount;
    readonly domId: string;
    readonly domNode: HTMLElement;
    private items;
    private itemId;
    private rangeMap;
    private cache;
    private renderers;
    private lastRenderTop;
    private lastRenderHeight;
    private renderWidth;
    private rowsContainer;
    private scrollable;
    private scrollableElement;
    private _scrollHeight;
    private scrollableElementUpdateDisposable;
    private scrollableElementWidthDelayer;
    private splicing;
    private dragOverAnimationDisposable;
    private dragOverAnimationStopDisposable;
    private dragOverMouseY;
    private setRowLineHeight;
    private setRowHeight;
    private supportDynamicHeights;
    private additionalScrollHeight;
    private accessibilityProvider;
    private scrollWidth;
    private dnd;
    private canDrop;
    private currentDragData;
    private currentDragFeedback;
    private currentDragFeedbackDisposable;
    private onDragLeaveTimeout;
    private readonly disposables;
    private readonly _onDidChangeContentHeight;
    readonly onDidChangeContentHeight: Event<number>;
    get contentHeight(): number;
    get onDidScroll(): Event<ScrollEvent>;
    get onWillScroll(): Event<ScrollEvent>;
    get containerDomNode(): HTMLElement;
    get scrollableElementDomNode(): HTMLElement;
    private _horizontalScrolling;
    private get horizontalScrolling();
    private set horizontalScrolling(value);
    constructor(container: HTMLElement, virtualDelegate: IListVirtualDelegate<T>, renderers: IListRenderer<any, any>[], options?: IListViewOptions<T>);
    updateOptions(options: IListViewOptionsUpdate): void;
    delegateScrollFromMouseWheelEvent(browserEvent: IMouseWheelEvent): void;
    delegateVerticalScrollbarPointerDown(browserEvent: PointerEvent): void;
    updateElementHeight(index: number, size: number | undefined, anchorIndex: number | null): void;
    splice(start: number, deleteCount: number, elements?: readonly T[]): T[];
    private _splice;
    private eventuallyUpdateScrollDimensions;
    private eventuallyUpdateScrollWidth;
    private updateScrollWidth;
    updateWidth(index: number): void;
    rerender(): void;
    get length(): number;
    get renderHeight(): number;
    get firstVisibleIndex(): number;
    get lastVisibleIndex(): number;
    element(index: number): T;
    indexOf(element: T): number;
    domElement(index: number): HTMLElement | null;
    elementHeight(index: number): number;
    elementTop(index: number): number;
    indexAt(position: number): number;
    indexAfter(position: number): number;
    layout(height?: number, width?: number): void;
    private render;
    private insertItemInDOM;
    private measureItemWidth;
    private updateItemInDOM;
    private removeItemFromDOM;
    getScrollTop(): number;
    setScrollTop(scrollTop: number, reuseAnimation?: boolean): void;
    getScrollLeft(): number;
    setScrollLeft(scrollLeft: number): void;
    get scrollTop(): number;
    set scrollTop(scrollTop: number);
    get scrollHeight(): number;
    get onMouseClick(): Event<IListMouseEvent<T>>;
    get onMouseDblClick(): Event<IListMouseEvent<T>>;
    get onMouseMiddleClick(): Event<IListMouseEvent<T>>;
    get onMouseUp(): Event<IListMouseEvent<T>>;
    get onMouseDown(): Event<IListMouseEvent<T>>;
    get onMouseOver(): Event<IListMouseEvent<T>>;
    get onMouseMove(): Event<IListMouseEvent<T>>;
    get onMouseOut(): Event<IListMouseEvent<T>>;
    get onContextMenu(): Event<IListMouseEvent<T> | IListGestureEvent<T>>;
    get onTouchStart(): Event<IListTouchEvent<T>>;
    get onTap(): Event<IListGestureEvent<T>>;
    private toMouseEvent;
    private toTouchEvent;
    private toGestureEvent;
    private toDragEvent;
    private onScroll;
    private onTouchChange;
    private onDragStart;
    private onDragOver;
    private onDragLeave;
    private onDrop;
    private onDragEnd;
    private clearDragOverFeedback;
    private setupDragAndDropScrollTopAnimation;
    private animateDragAndDropScrollTop;
    private teardownDragAndDropScrollTopAnimation;
    private getItemIndexFromEventTarget;
    private getRenderRange;
    /**
     * Given a stable rendered state, checks every rendered element whether it needs
     * to be probed for dynamic height. Adjusts scroll height and top if necessary.
     */
    private _rerender;
    private probeDynamicHeight;
    private getNextToLastElement;
    getElementDomId(index: number): string;
    dispose(): void;
}
