import _WidgetBase = require("./_WidgetBase"); import { PlacePosition, PlaceLocation } from "./place"; interface PopupOpenArgs { /** * widget to display */ popup?: _WidgetBase; /** * the button etc. that is displaying this popup */ parent?: _WidgetBase; /** * DOM node (typically a button); place popup relative to this node. (Specify this *or* "x" and "y" parameters.) */ around?: HTMLElement; /** * Absolute horizontal position (in pixels) to place node at. (Specify this *or* "around" parameter.) */ x?: number; /** * Absolute vertical position (in pixels) to place node at. (Specify this *or* "around" parameter.) */ y?: number; /** * When the around parameter is specified, orient should be a list of positions to try */ orient?: string | string[] | { BL?: string; TR?: string; TL?: string; BR?: string; }; /** * callback when user has canceled the popup by: * * 1. hitting ESC or * 2. by using the popup widget's proprietary cancel mechanism (like a cancel button in a dialog); * i.e. whenever popupWidget.onCancel() is called, args.onCancel is called */ onCancel?: () => void; /** * callback whenever this popup is closed */ onClose?: () => void; /** * callback when user "executed" on the popup/sub-popup by selecting a menu choice, etc. (top menu only) */ onExecute?: () => void; /** * adding a buffer around the opening position. This is only useful when around is not set. */ padding?: PlacePosition; /** * The max height for the popup. Any popup taller than this will have scrollbars. * Set to Infinity for no max height. Default is to limit height to available space in viewport, * above or below the aroundNode or specified x/y position. */ maxHeight?: number; } interface PopupManager { /** * Stack of currently popped up widgets. * (someone opened _stack[0], and then it opened _stack[1], etc.) */ _stack: _WidgetBase[]; /** * Z-index of the first popup. (If first popup opens other * popups they get a higher z-index.) */ _beginZIndex: number; _idGen: number; /** * If screen has been scrolled, reposition all the popups in the stack. * Then set timer to check again later. */ _repositionAll(): void; /** * Initialization for widgets that will be used as popups. * Puts widget inside a wrapper DIV (if not already in one), * and returns pointer to that wrapper DIV. */ _createWrapper(widget: _WidgetBase): HTMLDivElement; /** * Moves the popup widget off-screen. * Do not use this method to hide popups when not in use, because * that will create an accessibility issue: the offscreen popup is * still in the tabbing order. */ moveOffScreen(widget: _WidgetBase): HTMLDivElement; /** * Hide this popup widget (until it is ready to be shown). * Initialization for widgets that will be used as popups * * Also puts widget inside a wrapper DIV (if not already in one) * * If popup widget needs to layout it should * do so when it is made visible, and popup._onShow() is called. */ hide(widget: _WidgetBase): void; /** * Compute the closest ancestor popup that's *not* a child of another popup. * Ex: For a TooltipDialog with a button that spawns a tree of menus, find the popup of the button. */ getTopPopup(): _WidgetBase; /** * Popup the widget at the specified position */ open(args: PopupOpenArgs): PlaceLocation; /** * Close specified popup and any popups that it parented. * If no popup is specified, closes all popups. */ close(popup?: _WidgetBase): void; }