import type { BasePubSubService } from '@slickgrid-universal/event-pub-sub';
import type { Column, DOMEvent, DOMMouseOrTouchEvent, GridMenu, GridMenuCommandItemCallbackArgs, GridMenuEventWithElementCallbackArgs, GridMenuItem, GridMenuOption, GridOption, onGridMenuColumnsChangedCallbackArgs } from '../interfaces/index';
import type { ExtensionUtility } from '../extensions/extensionUtility';
import type { FilterService } from '../services/filter.service';
import type { SharedService } from '../services/shared.service';
import type { SortService } from '../services/sort.service';
import { type ExtendableItemTypes, type ExtractMenuType, MenuBaseClass, type MenuType } from '../extensions/menuBaseClass';
import { SlickEvent } from '../core/index';
/**
 * A control to add a Grid Menu with Extra Commands & Column Picker (hambuger menu on top-right of the grid)
 * To specify a custom button in a column header, extend the column definition like so:
 *   this.gridOptions = {
 *     enableGridMenu: true,
 *     gridMenu: {
 *       ... grid menu options ...
 *       commandItems: [{ ...command... }, { ...command... }]
 *     }
 *   }];
 * @class GridMenuControl
 * @constructor
 */
export declare class SlickGridMenu extends MenuBaseClass<GridMenu> {
    protected readonly extensionUtility: ExtensionUtility;
    protected readonly filterService: FilterService;
    protected readonly pubSubService: BasePubSubService;
    protected readonly sharedService: SharedService;
    protected readonly sortService: SortService;
    onAfterMenuShow: SlickEvent<GridMenuEventWithElementCallbackArgs>;
    onBeforeMenuShow: SlickEvent<GridMenuEventWithElementCallbackArgs>;
    onMenuClose: SlickEvent<GridMenuEventWithElementCallbackArgs>;
    onCommand: SlickEvent<GridMenuCommandItemCallbackArgs>;
    onColumnsChanged: SlickEvent<onGridMenuColumnsChangedCallbackArgs>;
    protected _areVisibleColumnDifferent: boolean;
    protected _columns: Column[];
    protected _columnCheckboxes: HTMLInputElement[];
    protected _columnTitleElm: HTMLDivElement;
    protected _commandMenuElm: HTMLDivElement | null;
    protected _gridMenuButtonElm: HTMLButtonElement;
    protected _headerElm: HTMLDivElement | null;
    protected _isMenuOpen: boolean;
    protected _listElm: HTMLSpanElement;
    protected _subMenuParentId: string;
    protected _userOriginalGridMenu: GridMenu;
    protected _defaults: GridMenuOption;
    /** Constructor of the SlickGrid 3rd party plugin, it can optionally receive options */
    constructor(extensionUtility: ExtensionUtility, filterService: FilterService, pubSubService: BasePubSubService, sharedService: SharedService, sortService: SortService);
    get addonOptions(): GridMenu;
    get columns(): Column[];
    set columns(newColumns: Column[]);
    get gridOptions(): GridOption;
    get gridUidSelector(): string;
    initEventHandlers(): void;
    /** Initialize plugin. */
    init(): void;
    /** Dispose (destroy) the SlickGrid 3rd party plugin */
    dispose(): void;
    deleteMenu(): void;
    createColumnPickerContainer(): void;
    /** Create parent grid menu container */
    createGridMenu(): void;
    /** Create the menu or sub-menu(s) but without the column picker which is a separate single process */
    createCommandMenu(commandItems: Array<GridMenuItem | 'divider'>, level?: number, item?: ExtractMenuType<ExtendableItemTypes, MenuType>): HTMLDivElement;
    /**
     * Get all columns including hidden columns.
     * @returns {Array<Object>} - all columns array
     */
    getAllColumns(): Column<any>[];
    /**
     * Get only the visible columns.
     * @returns {Array<Object>} - only the visible columns array
     */
    getVisibleColumns(): Column<any>[];
    /**
     * Hide the Grid Menu but only if it does detect as open prior to executing anything.
     * @param event
     * @returns
     */
    hideMenu(event: Event): void;
    /** destroy and recreate the Grid Menu in the DOM */
    recreateGridMenu(): void;
    repositionMenu(e: MouseEvent | TouchEvent, menuElm: HTMLElement, buttonElm?: HTMLButtonElement, addonOptions?: GridMenu): void;
    /** Open the Grid Menu */
    openGridMenu(): void;
    /** show Grid Menu from the click event, which in theory will recreate the grid menu in the DOM */
    showGridMenu(e: MouseEvent | TouchEvent, options?: GridMenuOption): void;
    /** Translate the Grid Menu titles and column picker */
    translateGridMenu(): void;
    translateTitleLabels(gridMenuOptions: GridMenu | null): void;
    /** Create Grid Menu with Custom Commands if user has enabled Filters and/or uses a Backend Service (OData, GraphQL) */
    protected addGridMenuCustomCommands(originalCommandItems: Array<GridMenuItem | 'divider'>): ("divider" | GridMenuItem)[];
    /**
     * Execute the Grid Menu Custom command callback that was triggered by the onCommand subscribe
     * These are the default internal custom commands
     * @param event
     * @param GridMenuItem args
     */
    protected executeGridMenuInternalCustomCommands(_e: Event, args: GridMenuItem): void;
    /** @return default Grid Menu options */
    protected getDefaultGridMenuOptions(): GridMenu;
    /** Mouse down handler when clicking anywhere in the DOM body */
    protected handleBodyMouseDown(e: DOMEvent<HTMLElement>): void;
    protected handleMenuItemCommandClick(event: DOMMouseOrTouchEvent<HTMLDivElement>, _type: MenuType, item: ExtractMenuType<ExtendableItemTypes, MenuType>, level?: number): void;
    protected handleMenuItemMouseOver(e: DOMMouseOrTouchEvent<HTMLElement>, _type: MenuType, item: ExtractMenuType<ExtendableItemTypes, MenuType>, level?: number): void;
    /** Re/Create Command List by adding title, close & list of commands */
    recreateCommandList(commandItems: Array<GridMenuItem | 'divider'>, menuElm: HTMLElement, callbackArgs: GridMenuEventWithElementCallbackArgs, item?: ExtractMenuType<ExtendableItemTypes, MenuType>): HTMLDivElement | null;
    protected repositionSubMenu(e: DOMMouseOrTouchEvent<HTMLElement>, item: ExtractMenuType<ExtendableItemTypes, MenuType>, level: number): void;
}
//# sourceMappingURL=slickGridMenu.d.ts.map