import { BoundsUnmodifiable, Bounds, Size } from './bounds';
import { Notification, Notification1 } from './util/notification';
export declare type Painter = (gl: WebGLRenderingContext, viewport: BoundsUnmodifiable) => void;
export interface PointerEvent {
    paneViewport: BoundsUnmodifiable;
    i: number;
    j: number;
    wheelSteps?: number;
    clickCount?: number;
    mouseEvent?: MouseEvent;
}
export declare function xFrac(ev: PointerEvent): number;
export declare function yFrac(ev: PointerEvent): number;
export interface LayoutEntry {
    layoutArg: any;
    layoutOptions: any;
    viewport: Bounds;
    prefSize: Size;
}
export declare type LayoutPhase1 = (parentPrefSize: Size, children?: LayoutEntry[]) => LayoutPhase1;
export declare type LayoutPhase2 = (children: LayoutEntry[], parentViewport: BoundsUnmodifiable) => LayoutPhase2;
export interface Layout {
    updatePrefSize?: LayoutPhase1;
    updateChildViewports?: LayoutPhase2;
}
export declare type Mask2D = (viewport: BoundsUnmodifiable, i: number, j: number) => boolean;
export declare class Pane {
    private painters;
    private consumesInputEvents;
    private isInside;
    private _mouseCursor;
    private _mouseCursorChanged;
    private _childMouseCursorListener;
    private children;
    private _layout;
    private _viewport;
    private _scissor;
    private _viewportChanged;
    private _dispose;
    private _mouseUp;
    private _mouseDown;
    private _mouseMove;
    private _mouseWheel;
    private _mouseEnter;
    private _mouseExit;
    private _contextMenu;
    constructor(layout: Layout, consumesInputEvents?: boolean, isInside?: Mask2D);
    get layout(): Layout;
    set layout(layout: Layout);
    get mouseCursor(): string;
    set mouseCursor(mouseCursor: string);
    get mouseCursorChanged(): Notification;
    addPainter(painter: Painter): void;
    addPane(pane: Pane, layoutArg?: any, layoutOptions?: any): void;
    removePane(pane: Pane): void;
    layoutArg(pane: Pane): any;
    setLayoutArg(pane: Pane, layoutArg: any): void;
    updateLayoutArgs(updateFn: (layoutArg: any, layoutOptions: any) => any): void;
    layoutOptions(pane: Pane): any;
    private _childFor;
    updatePrefSizes(result: Size): void;
    updateBounds(viewport: BoundsUnmodifiable, scissor: BoundsUnmodifiable): void;
    paint(gl: WebGLRenderingContext): void;
    get viewport(): BoundsUnmodifiable;
    get scissor(): BoundsUnmodifiable;
    get viewportChanged(): Notification;
    panesAt(i: number, j: number): Pane[];
    private _panesAt;
    get mouseUp(): Notification1<PointerEvent>;
    get mouseDown(): Notification1<PointerEvent>;
    get mouseMove(): Notification1<PointerEvent>;
    get mouseWheel(): Notification1<PointerEvent>;
    get mouseEnter(): Notification1<PointerEvent>;
    get mouseExit(): Notification1<PointerEvent>;
    get contextMenu(): Notification1<PointerEvent>;
    fireMouseUp(i: number, j: number, clickCount: number, mouseEvent: MouseEvent): any;
    fireMouseDown(i: number, j: number, clickCount: number, mouseEvent: MouseEvent): any;
    fireMouseMove(i: number, j: number, mouseEvent: MouseEvent): any;
    fireMouseWheel(i: number, j: number, wheelSteps: number, mouseEvent: MouseEvent): any;
    fireMouseEnter(i: number, j: number, mouseEvent: MouseEvent): any;
    fireMouseExit(i: number, j: number, mouseEvent: MouseEvent): any;
    fireContextMenu(i: number, j: number, mouseEvent: MouseEvent): any;
    get dispose(): Notification;
}
export declare function requireGL(canvasElement: HTMLCanvasElement): WebGLRenderingContext;
export declare function isLeftMouseDown(ev: MouseEvent): boolean;
export declare function isMouseDown(ev: MouseEvent): boolean;
export interface Drawable {
    setContentPane(pane: Pane): void;
    redraw(): void;
    getPrefSize(): Size;
    prefSizeChanged(): Notification1<Size>;
}
export declare function newDrawable(canvas: HTMLCanvasElement): Drawable;
