import { CombinedOnSignature } from 'ol/Observable';
import { Coordinate } from 'ol/coordinate';
import { default as default_2 } from 'ol/control/Control';
import { default as default_3 } from 'ol/Map';
import { default as default_4 } from 'ol/events/Event';
import { default as default_5 } from 'ol/MapBrowserEvent';
import { EventsKey } from 'ol/events';
import { EventTypes as EventTypes_2 } from 'ol/Observable';
import { ObjectEvent } from 'ol/Object';
import { OnSignature } from 'ol/Observable';
import { Pixel } from 'ol/pixel';
import { TinyEmitter } from 'tiny-emitter';
import { Types } from 'ol/ObjectEventType';

export declare type CallbackObject = {
    coordinate: Coordinate;
    data: unknown;
};

declare class ContextMenu extends default_2 {
    protected map: default_3;
    protected emitter: TinyEmitter;
    protected container: HTMLDivElement;
    protected coordinate: Coordinate;
    protected pixel: Pixel;
    protected contextMenuEventListener: (evt: MouseEvent) => void;
    protected entryCallbackEventListener: (evt: MouseEvent) => void;
    protected mapMoveListener: () => void;
    protected lineHeight: number;
    protected disabled: boolean;
    protected opened: boolean;
    protected items: Item[];
    protected menuEntries: Map<string, MenuEntry>;
    on: OnSignature<EventTypes_2 | `${CustomEventTypes.CLOSE}`, default_4, EventsKey> & OnSignature<`${CustomEventTypes.OPEN}` | `${CustomEventTypes.BEFOREOPEN}`, ContextMenuEvent, EventsKey> & OnSignature<Types, ObjectEvent, EventsKey> & CombinedOnSignature<EventTypes_2 | Types | `${CustomEventTypes.OPEN}` | `${CustomEventTypes.CLOSE}` | `${CustomEventTypes.BEFOREOPEN}`, EventsKey>;
    once: OnSignature<EventTypes_2 | `${CustomEventTypes.CLOSE}`, default_4, EventsKey> & OnSignature<`${CustomEventTypes.OPEN}` | `${CustomEventTypes.BEFOREOPEN}`, ContextMenuEvent, EventsKey> & OnSignature<Types, ObjectEvent, EventsKey> & CombinedOnSignature<EventTypes_2 | Types | `${CustomEventTypes.OPEN}` | `${CustomEventTypes.CLOSE}` | `${CustomEventTypes.BEFOREOPEN}`, EventsKey>;
    un: OnSignature<EventTypes_2 | `${CustomEventTypes.CLOSE}`, default_4, void> & OnSignature<`${CustomEventTypes.OPEN}` | `${CustomEventTypes.BEFOREOPEN}`, ContextMenuEvent, EventsKey> & OnSignature<Types, ObjectEvent, void> & CombinedOnSignature<EventTypes_2 | Types | `${CustomEventTypes.OPEN}` | `${CustomEventTypes.CLOSE}` | `${CustomEventTypes.BEFOREOPEN}`, void>;
    options: Options;
    constructor(opts?: Partial<Options>);
    clear(): void;
    enable(): void;
    disable(): void;
    getDefaultItems(): SingleItem[];
    countItems(): number;
    extend(items: Item[]): void;
    closeMenu(): void;
    isOpen(): boolean;
    updatePosition(pixel: Pixel): void;
    pop(): void;
    shift(): void;
    push(item: Item): void;
    setMap(map: default_3): void;
    protected removeListeners(): void;
    protected removeMenuEntry(id: string): void;
    protected handleContextMenu(evt: MouseEvent): void;
    protected openMenu(evt: MouseEvent): void;
    protected getMenuEntriesLength(): number;
    protected calculateMenuSize(): {
        h: number;
        w: number;
    };
    protected calculateVerticalPosition(mapSize: [number, number], spaceLeft: {
        h: number;
        w: number;
    }, menuSize: {
        h: number;
        w: number;
    }): number;
    protected adjustPositionAfterRender(mapSize: [number, number], menuSize: {
        h: number;
        w: number;
    }): void;
    protected positionContainer(): void;
    protected handleMapMove(): void;
    protected handleEntryCallback(evt: MouseEvent): void;
    protected handleAddMenuEntry(item: MenuEntry, element: HTMLLIElement): void;
}
export default ContextMenu;

export declare class ContextMenuEvent extends default_5<any> {
    constructor(options: {
        map: default_3;
        originalEvent: MouseEvent | PointerEvent;
        type: `${CustomEventTypes.OPEN}` | `${CustomEventTypes.BEFOREOPEN}`;
    });
}

export declare enum CustomEventTypes {
    BEFOREOPEN = "beforeopen",
    OPEN = "open",
    CLOSE = "close",
    ADD_MENU_ENTRY = "add-menu-entry"
}

export declare enum EventTypes {
    CONTEXTMENU = "contextmenu",
    CLICK = "click",
    DBLCLICK = "dblclick"
}

export declare type Item = SingleItem | ItemSeparator | ItemWithNested;

export declare type ItemSeparator = '-';

export declare type ItemWithNested = {
    classname?: string;
    icon?: string;
    items: Item[];
    text: string;
};

export declare type MenuEntry = {
    callback: null | SingleItem['callback'];
    data: unknown;
    id: string;
    isInsideSubmenu: boolean;
    isSeparator: boolean;
    isSubmenu: boolean;
};

export declare type Options = {
    defaultItems: boolean;
    eventType: `${EventTypes}`;
    items: Item[];
    scrollAt: number;
    width: number;
};

export declare type SingleItem = {
    callback: (object: CallbackObject, map: default_3) => void;
    classname?: string;
    data?: unknown;
    icon?: string;
    text: string;
};

export { }
