hta-ctx-menu
Version:
create real context menus for HTA (HTML Application)
1,075 lines (1,069 loc) • 38.1 kB
TypeScript
declare type MenuModelEventNames = 'label' | 'icon' | 'arrow' | 'class' | 'checked' | 'disabled' | 'unselectable' | 'css';
declare type MenuItemUserEventNames = 'activate' | 'click' | 'close' | 'change' | 'dblclick' | 'highlight' | 'beforeload' | 'load' | 'unload' | '_rootclose' | '_viewready' | 'demand';
declare type MenuGlobalEventNames = 'highlight' | 'click' | 'dblclick' | 'activate';
declare type MenuGlobalEventsTypeForUser = {
[P in MenuGlobalEventNames as `on${P}`]?: UserEventListener;
};
declare const AllMenuTypesList: readonly ["normal", "radio", "checkbox", "separator", "submenu", "popup", "demand", "radios", "checkboxes"];
declare type AllMenuTypes = typeof AllMenuTypesList[number];
declare const MenuItemTypesList: readonly ["normal", "radio", "checkbox", "separator", "submenu", "popup"];
declare type MenuItemTypes = typeof MenuItemTypesList[number];
declare type MenuItemParameter = MenuItemNormalParameter | MenuItemCheckboxParameter | MenuItemRadioParameter | MenuItemSubmenuParameter | MenuItemSeparatorParameter | MenuItemPopupParameter;
declare type UserEventListener = (ev: MenuUserEventObject, ctx: any) => any;
interface MenuItemNormalParameter {
type?: 'normal';
label: string;
html?: boolean;
nowrap?: boolean;
icon?: IconSettingType;
customClass?: string;
title?: string;
align?: 'left' | 'center' | 'right';
cssText?: string;
fontSize?: string;
fontFamily?: string;
id?: string;
onclick?: UserEventListener;
ondblclick?: UserEventListener;
onhighlight?: UserEventListener;
onactivate?: UserEventListener;
ignoreGlobalEvents?: boolean;
ignoreErrors?: boolean;
disabled?: boolean;
unselectable?: boolean;
unlistening?: boolean;
union?: boolean;
hold?: boolean;
unholdByDblclick?: boolean;
holdParent?: boolean;
flash?: number;
}
interface _MenuItemCheckableParameter extends Omit<MenuItemNormalParameter, 'icon' | 'type'> {
name?: string;
global?: boolean;
checked?: boolean;
value?: any;
record?: CheckableRecord;
onchange?: UserEventListener;
}
interface MenuItemCheckboxParameter extends _MenuItemCheckableParameter {
type: 'checkbox';
checkboxIcon?: CheckableIconPairParam;
key?: string;
records?: {
[key: string]: boolean;
};
}
interface MenuItemCheckboxGroupParameter extends Omit<MenuItemCheckboxParameter, 'type' | 'name' | 'checked' | 'value' | 'label' | 'record' | 'key'> {
type: 'checkboxes';
setChecked?: (value: any, index: number, label: string) => boolean;
labels: string[] | // labels
[
string,
(boolean | object)
][] | // [label, parameter(checked | record object)]
[
string,
any,
boolean?
][] | // [label, parameter(checked | record key or value | record object)]
{
[key: string]: (undefined | boolean | string | object);
};
records?: {
[key: string]: boolean;
};
}
interface MenuItemRadioParameter extends _MenuItemCheckableParameter {
type: 'radio';
radioIcon?: CheckableIconPairParam;
uncheckable?: boolean;
}
interface MenuItemRadioGroupParameter extends Omit<MenuItemRadioParameter, 'type' | 'value' | 'checked' | 'label'> {
type: 'radios';
selectedIndex?: number;
setChecked?: (value: any, index: number, label: string) => boolean;
serialId?: boolean;
labels: string[] | // labels
[
string,
any?,
boolean?
][];
}
declare type CheckableRecord = {
checked?: boolean;
value?: any;
selectedIndex?: number;
};
interface MenuItemSubmenuParameter extends Omit<MenuItemNormalParameter, 'type'> {
type: 'submenu';
items: MenuItemCreateParameterList;
customDialogClass?: string;
skin?: string;
menuCssText?: string;
menuFontSize?: string;
menuFontFamily?: string;
checkboxIcon?: CheckableIconPairParam;
radioIcon?: CheckableIconPairParam;
arrowIcon?: IconSettingType;
flashItems?: boolean | number;
leftMargin?: number;
childLeftMargin?: number;
onload?: UserEventListener;
onbeforeload?: UserEventListener;
onunload?: UserEventListener;
globalEvents?: MenuGlobalEventsTypeForUser;
autoClose?: boolean;
inherit?: SubmenuInheritanceFlags | boolean;
}
interface SubmenuInheritanceFlags {
skin?: boolean;
globalEvents?: boolean;
checkboxIcon?: boolean;
radioIcon?: boolean;
arrowIcon?: boolean;
flashItems?: boolean;
childLeftMargin?: boolean;
autoClose?: boolean;
cssText?: boolean;
fontSize?: boolean;
fontFamily?: boolean;
}
declare const PopupXPos: readonly ["left", "left-out", "left-center", "right", "right-out", "right-center", "x-center"];
declare const PopupYPos: readonly ["top", "top-out", "top-center", "bottom", "bottom-out", "bottom-center", "y-center"];
interface PopupBase {
base?: 'item' | 'parent' | 'all' | 'screen' | string;
posX?: typeof PopupXPos[number];
posY?: typeof PopupYPos[number];
}
interface PopupMargin {
marginX?: number;
marginY?: number;
marginLeft?: number;
marginRight?: number;
}
interface PopupPosition extends PopupBase, PopupMargin {
}
interface MenuItemPopupParameter extends Omit<MenuItemSubmenuParameter, 'type'> {
type: 'popup';
pos?: PopupPosition;
exclusive?: boolean;
}
interface MenuItemSeparatorParameter {
type: 'separator';
id?: string;
customClass?: string;
}
declare type MenuItemCreateParameter = MenuItemParameter | MenuItemDemandParameter | MenuItemRadioGroupParameter | MenuItemCheckboxGroupParameter;
declare type MenuItemCreateParameterList = (MenuItemCreateParameter | undefined | null)[];
interface MenuItemDemandParameter {
type: 'demand';
id?: string;
ondemand: (ev: MenuUserEventObject, ctx: any) => MenuItemCreateParameter | MenuItemCreateParameterList | null | undefined;
}
declare type IconSettingType = string | {
path: string;
width?: string | number;
height?: string | number;
blank?: boolean;
} | {
text: string;
fontFamily?: string;
fontSize?: string;
blank?: boolean;
};
declare type CheckableIconPair = [IconSettingType, IconSettingType];
declare type CheckableIconPairParam = CheckableIconPair | IconSettingType;
interface MenuUserEventObjectModel {
cancelGlobal: boolean;
dispose(): void;
}
declare type MenuItemFlagsType = {
union?: boolean;
hold?: boolean;
unholdByDblclick?: boolean;
holdParent?: boolean;
unselectable?: boolean;
unlistening?: boolean;
disabled?: boolean;
flash?: number;
html?: boolean;
nowrap?: boolean;
checked?: boolean;
usericon?: boolean;
align?: 'left' | 'center' | 'right';
fontSize?: string;
fontFamily?: string;
cssText?: string;
};
/**
* base menu item class.
* all menu items are descended from this.
* @abstract
* @class _MenuModelBase
*/
declare abstract class _MenuModelBase {
/**
* @type {AllMenuTypes}
*/
protected abstract _type: AllMenuTypes;
protected readonly _uniqueId: string;
protected readonly _id?: string;
protected _parent?: MenuSubmenu;
protected _index: number;
protected _customClassNames: string[];
protected _isDynamicallyProduced: boolean;
constructor(args: MenuItemCreateParameter, parent?: MenuSubmenu, demanded?: boolean);
protected _unexpectedTypeError(): void;
getType(this: MenuModelItem): MenuItemTypes;
getId(): string | undefined;
getUniqueId(): string;
getCustomClassNames(): string[];
getFlags(): MenuItemFlagsType;
getIcon(): IconSettingType | undefined;
getLabel(): void;
getIndex(): number;
setIndex(num: number): number;
isDynamicallyProduced(): boolean;
protected getRealParentSubmenu(): MenuSubmenu | null;
private _menuModelEventListeners;
private _listenerIdCounter;
/**
* set internal model event listeners
* @param {MenuModelEventNames} handler
* @param {Function} listener
* @memberof MenuModel
*/
addMenuModelEvent(handler: MenuModelEventNames, listener: Function): number;
removeMenuModelEvent(handler: MenuModelEventNames, listenerId: number): boolean;
/**
* fire events
* @param {string} handler
*/
fireMenuModelEvent(handler: MenuModelEventNames, ...args: any): void;
isNormal(): this is MenuNormal;
isSubmenu(): this is MenuSubmenu;
isPopup(): this is MenuPopup;
isCheckable(): this is _MenuCheckable;
isRadio(): this is MenuRadio;
isCheckbox(): this is MenuCheckbox;
isSeparator(): this is MenuSeparator;
isDemandable(): this is MenuDemand;
$L(): string;
dispose(): void;
}
/**
* MenuNormal items have basic menu item functions
* @class MenuNormal
* @extends {_MenuModelBase}
*/
declare class MenuNormal extends _MenuModelBase {
protected readonly _type: AllMenuTypes;
protected _label: string;
protected _useHTML: boolean;
protected _nowrap: boolean;
protected _union: boolean;
protected _icon?: IconSettingType;
protected _title?: string;
protected _align?: 'left' | 'center' | 'right';
protected _cssText: string;
protected _fontSize: string;
protected _fontFamily: string;
protected _unselectable: boolean;
protected _disabled: boolean;
protected _unlistening: boolean;
protected _hold: boolean;
protected _unholdByDblclick: boolean;
protected _holdParent: boolean;
protected _flash: number;
protected onclick?: UserEventListener;
protected ondblclick?: UserEventListener;
protected onhighlight?: UserEventListener;
protected onactivate?: UserEventListener;
protected _ignoreGlobalEvents: boolean;
protected _ignoreErrors: boolean;
protected _selected: boolean;
constructor(args: MenuItemNormalParameter, parent?: MenuSubmenu, demanded?: boolean);
/**
* fire user events such as onclick, onchange, etc
*/
fireUserEvent(handler: MenuItemUserEventNames, ctx: any, eventObj: MenuUserEventObject): void;
setLabel(label: string, asHtml?: boolean): void;
getLabel(asHtml?: boolean): string;
setIcon(icon: IconSettingType): void;
protected _applyIcon(icon: IconSettingType): void;
getIcon(): IconSettingType | undefined;
hasUsersIcon(): boolean;
/**
* get item flags
* @return {*}
* @memberof MenuNormal
*/
getFlags(): MenuItemFlagsType;
dispose(): void;
}
/**
* radio or checkbox item
* @abstract
* @class MenuCheckable
* @extends {MenuNormal}
*/
declare abstract class _MenuCheckable extends MenuNormal {
protected abstract readonly _type: 'checkbox' | 'radio';
protected _parent: MenuSubmenu;
protected _name: string;
protected _isNamed: boolean;
protected _global: boolean;
protected _recordSubmenu: MenuSubmenu;
protected _record: CheckableRecord;
protected _checked: boolean;
protected _value?: any;
protected _previousChecked?: boolean;
protected _defaultPairIcons: CheckableIconPair;
protected _pairIcons: CheckableIconPair | null;
onchange?: UserEventListener;
constructor(args: MenuItemRadioParameter | MenuItemCheckboxParameter, parent: MenuSubmenu, demanded?: boolean);
updateCheckableIcon(force?: boolean): void;
abstract updateCheckedStatByRecord(): void;
getFlags(): MenuItemFlagsType;
getName(): string;
setValue(val: any): void;
getValue(): any;
isChecked(): boolean;
isGlobal(): boolean;
getRecord(): CheckableRecord;
getRecordRopository(): MenuSubmenu;
setIcon(icon: CheckableIconPairParam | null, apply?: boolean): void;
hasUsersIcon(): boolean;
protected abstract _setChecked(flag?: boolean, fromPublic?: boolean): boolean;
setChecked(flag?: boolean): boolean;
}
declare class MenuCheckbox extends _MenuCheckable {
protected readonly _type = "checkbox";
protected readonly _key?: string;
protected readonly _keyRecords?: {
[key: string]: boolean;
};
constructor(args: MenuItemCheckboxParameter, parent: MenuSubmenu, demanded?: boolean);
protected _setChecked(flag: boolean, fromPublic?: boolean): boolean;
private _linkOtherCheckboxesInParents;
updateCheckedStatByRecord(): void;
private _setRecordChecked;
private _getRecordChecked;
}
declare class MenuRadio extends _MenuCheckable {
protected readonly _type = "radio";
readonly _radioIndex: number;
private _uncheckable;
constructor(args: MenuItemRadioParameter, parent: MenuSubmenu, demanded?: boolean);
getRadioIndex(): number;
isUncheckable(): boolean;
protected _setChecked(flag: boolean, fromPublic?: boolean): boolean;
/**
* clear all other radios with same name
* @private
* @param {boolean} [recursive=false]
* @memberof MenuRadio
*/
private _clearOtherRadios;
updateCheckedStatByRecord(): void;
}
/**
* a MenuDemand can emit appropriate menu items dynamically on demand.
* @class MenuDemand
* @extends {_MenuModelBase}
*/
declare class MenuDemand extends _MenuModelBase {
protected readonly _type = "demand";
protected readonly ondemand: MenuItemDemandParameter["ondemand"];
constructor(args: MenuItemDemandParameter, parent?: MenuSubmenu, demanded?: boolean);
/**
* execute the ondemand callback
* @param {*} [eventObj]
* @return {*} {MenuItemsCreateParameter[]}
* @memberof MenuDemand
*/
extract(eventObj: MenuUserEventObject): MenuItemCreateParameterList;
}
/**
* for a separator
* @class MenuSeparator
* @extends {_MenuModelBase}
*/
declare class MenuSeparator extends _MenuModelBase {
protected readonly _type = "separator";
constructor(param: MenuItemSeparatorParameter, parent?: MenuSubmenu, demanded?: boolean);
}
/**
* MenuSubmenu contains all other menu items includes MenuSubmenu itself.
* when it does not have parent MenuSubmenu, it is the root of all menus.
* @class SubmenuItem
* @extends {_MenuModelBase}
*/
declare class MenuSubmenu extends MenuNormal {
protected readonly _type = "submenu";
private _pre_items;
private _items;
protected _layer: number;
private _root;
private _flashItems;
private _customDialogClass;
private _menuCssText;
private _menuFontSize;
private _menuFontFamily;
private _namedCheckableItemRecords;
private _globalNamedCheckableItemRecords;
private _radioCount;
private _globalRadioCount;
private _childLeftMargin?;
private _skinCSSPath?;
private _checkablePairIcons;
private _arrowIcon;
onload?: UserEventListener;
onbeforeload?: UserEventListener;
onunload?: UserEventListener;
_onrootclose?: UserEventListener;
_onviewready?: UserEventListener;
private _globalEvents?;
private _disableAutoClose?;
private _inherit;
constructor(param: MenuItemSubmenuParameter | MenuItemPopupParameter, parent?: MenuSubmenu, demanded?: boolean);
/**
* create pre-items
* MenuDemand items are not extracted yet at this time
*/
private _preCreateItems;
private _extractRadiosParameter;
private _extractCheckboxParameter;
/**
* extract all MenuDemand items and return complete item list
* @param {*} [eventObj]
* @return {*}
* @memberof MenuSubmenu
*/
produceItems(eventObj: MenuUserEventObject): MenuModelItem[];
/**
* set records for MenuCheckable items.
* @param {string} name
* @param {boolean} checked
* @memberof MenuSubmenu
*/
getNamedCheckableItemRecord(name: string, global?: boolean): CheckableRecord;
/**
* set the object as record so that users interact with the record too
* @param {string} name
* @param {*} record
* @memberof MenuSubmenu
*/
setUserObjectAsRecord(name: string, record: CheckableRecord, global?: boolean): void;
resetRadioIndex(): void;
countRadioIndex(name?: string, global?: boolean, id?: string): number;
protected getItems(): MenuModelItem[];
getParent(): MenuSubmenu | null;
isRoot(): boolean;
getRoot(): MenuSubmenu;
getLayer(): number;
setSkin(css: string): void;
getSkin(): string;
getCSSText(): string;
getFontSize(): string;
getFontFamily(): string | undefined;
getGlobalEvent(handler: MenuItemUserEventNames): UserEventListener | null;
getChildLeftMargin(): number | undefined;
getArrowIcon(): IconSettingType;
getDefaultCheckableIcon(type: 'checkbox' | 'radio'): CheckableIconPair | undefined;
getAutoClose(): boolean;
setArrowIcon(arrow: IconSettingType): void;
setDefaultCheckableIcon(type: 'checkbox' | 'radio', icon: CheckableIconPairParam): void;
/**
* enumerate items
*/
each(callback: (item: MenuModelItem, index?: number) => void): void;
getItem(index: number): MenuModelItem;
getItemCount(): number;
getItemById(id: any): MenuModelItem | null;
getItemsByName(name: string): _MenuCheckable[];
getPreItems(): _MenuModelBase[];
getCustomDialogClass(): string;
__setSystemUserEvent(handler: '_rootclose' | '_viewready', callback: UserEventListener): void;
setGlobalEvent(handler: MenuGlobalEventNames, listener: UserEventListener | null): void;
clearGlobalEvents(): void;
fireUserEvent(handler: '_rootclose' | '_viewready' | MenuItemUserEventNames, ctx: any, eventObj: MenuUserEventObject): void;
dispose(): void;
}
/**
* EXPERIMENTAL:
* @class MenuPopup
* @extends {MenuSubmenu}
*/
declare class MenuPopup extends MenuSubmenu {
private _pos;
private _exclusive;
constructor(param: MenuItemPopupParameter, parent?: MenuSubmenu, demanded?: boolean);
getPosObject(): PopupPosition;
}
declare abstract class _MenuModelable {
abstract getModel(): MenuSubmenu;
}
declare type MenuModelItem = MenuNormal | MenuSeparator;
/**
* virtual DOM node to 0.0update at arbitrary timing
*
* @class VirtualHTMLElement
*/
declare class VirtualDOMNode {
readonly nodeName: string;
className: string;
private _queuedClassNames;
private _lastRealClasses;
readonly attributes: {
[key: string]: string;
};
readonly childNodes: (VirtualDOMNode | string)[];
style: string;
private _lastRealStyle;
readonly id: string;
readonly uniqueId: string;
label: string;
private _transitions;
private _staticfilters;
private _flipStaticFilters;
private _onfilterchange;
private _onTransitionEnds;
private _realElement?;
private _linked;
private _updated;
private _hasLinkedVNode;
private _parent;
private _disposed;
constructor(node: string | HTMLElement, attributes?: {
[key: string]: any;
}, label?: string);
addClass(addClasses: string): void;
removeClass(remClasses: string, target?: string): string | undefined;
hasClass(className: string): boolean;
queueClass(qclass: string, add: boolean): void;
hasQueuedClasses(): boolean;
consumeQueuedClasses(onebyone?: boolean): string[] | null;
apply(): void;
play(ontransitionend?: Function): boolean;
getTransitions(): {
filter: TransitionFilterType;
type: string;
}[];
clearTransitions(): void;
flipFilters(): void;
setAttribute(attr: string, val: any): void;
removeAttribute(attr: string): void;
setStyle(style: string): void;
addStyle(style: string): void;
append(...nodes: (VirtualDOMNode | string)[]): void;
remove(): void;
html(html: string, escapeHTML?: boolean): void;
linkRealElement(node: HTMLElement, parseChildren?: boolean, readClasses?: boolean): void;
linkRealElementFromParent(): void;
isLinkedRealElement(): boolean;
/**
* @param {boolean} [autolink=false] link to real element automatically if it has not
* @return {*} {(HTMLElement | undefined)}
* @memberof VirtualDOMNode
*/
getRealElement(autolink?: boolean): HTMLElement | undefined;
updateRealElement(force?: boolean): null | {
[key: string]: boolean;
};
clearUpdate(): void;
toString(): string;
dispose(): void;
}
declare type VNodeUpdaterQueueItem = {
type: 'update' | 'consume' | 'apply' | 'play' | 'unreserve';
node: VirtualDOMNode;
reservedNode?: VirtualDOMNode;
flip?: boolean;
label?: string;
onebyone?: boolean;
ontransitionend?: Function;
} | {
type: 'callback';
callback: Function;
};
declare class VirtualNodeUpdater {
private _qlist;
private _delay;
private _hooked;
private _tid;
private _beforeCallbacks;
private _afterCallbacks;
constructor(delay?: number);
hook(): void;
clear(): void;
update(vnodes: VirtualDOMNode | (VirtualDOMNode | undefined)[], priority?: number): void;
consumeQueuedClass(vnode: VirtualDOMNode, onebyone?: boolean): void;
apply(vnode: VirtualDOMNode): void;
play(vnode: VirtualDOMNode, ontransitionend?: Function): void;
callback(func: Function): void;
queue(qitem: VNodeUpdaterQueueItem, priority?: number): void;
process(): void;
addListener(handler: 'before' | 'after', callback: Function): void;
}
declare type TransitionFilterType = {
play: (d?: number) => {};
apply: () => {};
stop: () => {};
enabled: boolean;
duration: number;
percent: number;
status: number;
};
declare type TransTypes = 'highlight' | 'checked' | 'radio-checked' | 'checkbox-checked' | 'activate' | 'open';
declare type TransTargets = {
[key in TransTypes]?: {
direction: 'to' | 'from' | 'change';
target: string;
}[];
};
declare type MenuViewDialogStatFlagType = {
[key: string]: boolean;
};
declare type MenuViewItemStatFlagType = {
[key in TransTypes]?: boolean;
};
declare abstract class _ViewBase<TView> {
private static _ViewListWaitingToUpdate;
/**
* add queues of updating View's class and transition each time before executing VirtualNodeUpdater
*
* @static
* @param {VirtualNodeUpdater} vupdater
* @memberof _ViewBase
*/
static hookVnodeUpdater(vupdater: VirtualNodeUpdater): void;
readonly uid: string;
private _statFlags;
protected abstract _mainNode: VirtualDOMNode;
protected abstract _disposed: boolean;
protected abstract $L(): string;
protected abstract getLayer(): number;
protected abstract _getTransTargets(): TransTargets;
protected abstract isBeWaitingAfterLoad(): boolean;
protected abstract clearWaitingAfterLoad(): void;
constructor();
protected _selectorBank: {
[key: string]: VirtualDOMNode;
};
protected _getVNode(selector: string): VirtualDOMNode | null;
isAvailable(): boolean;
private _checkIfViewFlagIsInUpdatingList;
private _addViewFlagUpdatingList;
private _removeViewFlagUpdatingList;
setViewFlag(flagName: keyof (TView extends MenuItemView ? MenuViewItemStatFlagType : MenuViewDialogStatFlagType), flag: boolean, ontransitionend?: Function): void;
getViewFlag(flagName: keyof (TView extends MenuItemView ? MenuViewItemStatFlagType : MenuViewDialogStatFlagType)): boolean;
setClassAndTransitions(className: string, flag: boolean, ontransitionend?: Function): void;
flashHighlight(ftime: number, onendflashing?: Function): void;
dispose(): void;
}
/**
* modeless dialogs
* @class MenuDialog
*/
declare class MenuDialogView extends _ViewBase<MenuDialogView> {
private _win;
private _doc;
protected _mainNode: VirtualDOMNode;
private _vdoc;
private _vbody;
private _vmenutable;
private _vcontainer;
private _vtablecontainer;
private _transTargetsForContainer;
private _transTargetsForItems;
protected _disposed: boolean;
private _appeared;
private _items;
private _indexByUniqueId;
private _evaWin;
private _evaDoc;
private _styleSheet;
private _activeStyleSheet?;
private _calculatedTableItemMargin;
private _layer;
private _SkinSystemSettings;
constructor(itemNumber: number, parent?: MenuDialogView | null, customClass?: string, specifiedParentWindow?: Window);
private _initializeDialog;
private _initializeStyleSheet;
initLayout(): void;
loadStyleSheet(path: string): void;
removeStylSheet(index?: number): void;
setCSSText(cssText: string, getSettings?: boolean): void;
setMenuFontSize(fontSize: number | string): void;
setMenuFontFamily(fontFamily: string): void;
clearStyleSheet(): void;
tweakAnimatedGIFSuffix(suffix?: string): void;
private _parseTransitionTargetsFromCSS;
_getTransTargets(flagForItem?: boolean): TransTargets;
private _parseSystemSettingsFromCSSText;
getSubmenuMarginSettingFromCSS(dir?: 'left' | 'right'): number | undefined;
isEmptyCSS(): boolean | undefined;
private _calculateTableItemMargin;
getItemMargin(): {
left: number;
right: number;
bottom: number;
top: number;
tableClientLeft: number;
tableClientTop: number;
};
getDoc(): Document;
getLayer(): number;
focus(): void;
setDocumentClass(cstring: string, flag?: boolean, immediate?: boolean): void;
createTableViewItems(itemParams: UpdateItemType[]): MenuItemView[];
getMenuElementByUniqueId(id: string): MenuItemView | null;
addWindowEvent(name: string, handler: EventListener): void;
removeWindowEvent(name: string, handler: EventListener): void;
addDocumentEvent(name: string, handler: EventListener): void;
removeDocumentEvent(name: string, handler: EventListener): void;
doc(): Document;
win(): MSWindowModeless;
hasFocus(): boolean;
getContentSize(): {
width: number;
height: number;
};
getContentSize(callback?: Function): void;
getDialogPosition(): ClientRect;
resizeDialog(w: number, h: number): void;
moveDialog(x?: number, y?: number): void;
adjustDialog(x?: number, y?: number): void;
isReadyToUse(): boolean;
checkExistence(): any;
setLoad(): void;
setBodyViewFlagByItem(flagName: string, flag: boolean, itemIndex: number, customClasses: string[]): void;
private _waitingAfterLoad;
isBeWaitingAfterLoad(): boolean;
clearWaitingAfterLoad(): void;
dispose(): void;
private _dispose;
static hookBeforeUpdate(callback: Function): void;
static hookAfterUpdate(callback: Function): void;
$L(): string;
}
declare type UpdateItemType = {
type: MenuItemTypes;
label?: string | void;
icon?: IconSettingType;
arrow?: IconSettingType;
flags?: MenuItemFlagsType;
classNames?: string[];
itemNumber?: number;
index?: number;
};
/**
* Menu items
* @class MenuElement
*/
declare class MenuItemView extends _ViewBase<MenuItemView> {
private _container;
protected _mainNode: VirtualDOMNode;
private _vrow;
private _eva;
protected _disposed: boolean;
private _index;
private _itemNumber;
constructor(dialog: MenuDialogView, updateParam: UpdateItemType, index: number);
/**
* use virtual DOM nodes because interacting with elements in another windows is terribly slow.
*/
private _createVirtualNodes;
getVirtualElement(): VirtualDOMNode;
prepareRealElements(): void;
updateVirtualNodes(): void;
update({ type, label, icon, arrow, flags: { unselectable, checked, disabled, html, usericon, nowrap, align, fontFamily, fontSize, cssText } }: UpdateItemType): void;
addEvent(name: string, handler: EventListener): void;
removeEvent(name: string, handler: EventListener): void;
private _setIcon;
_getTransTargets(): TransTargets;
getItemPosition(): ClientRect;
getLayer(): number;
getItemNumber(): number;
$L(): string;
isBeWaitingAfterLoad(): boolean;
protected clearWaitingAfterLoad(): void;
isAvailable(): boolean;
dispose(): void;
}
declare type ViewPosition = {
left: number;
top: number;
posX: PopupPosition["posX"];
posY: PopupPosition["posY"];
base: PopupPosition["base"];
};
declare abstract class _RootController extends _MenuModelable {
protected _locked: number;
protected _lastChild?: MenuContainerController;
protected _enableOnlyLastChild: boolean;
abstract open(...args: any): void;
setLocked(flag: boolean): void;
isLocked(ctrl?: MenuContainerController): boolean;
setLastChild(ctrl: MenuContainerController): void;
enableOnlyLastChild(flag?: boolean): void;
move(x: number, y: number): void;
getRootController(): this;
abstract close(): void;
}
declare class MenuRootController extends _RootController {
protected _model: MenuSubmenu;
protected _ctrl: MenuContainerController | null;
protected _readyToUse: boolean;
protected _isUpdatingView: boolean;
protected _openedPos: {
x: number;
y: number;
};
constructor(param: MenuItemSubmenuParameter);
/**
* create controller and view
*/
open(x: number, y: number, ctx: any, parentWindow?: Window): void;
/**
* close View
* @memberof MenuUserInterface
*/
close(): void;
isUpdatingView(): boolean;
getLastPosition(): {
x: number;
y: number;
};
getRectangleOfWholeMenus(): ClientRect;
getModel(): MenuSubmenu;
loadSkin(path: string): void;
setGlobalEvent(handler: MenuGlobalEventNames, listener: UserEventListener | null): void;
clearGlobalEvents(): void;
focus(): void;
destroy(): void;
}
/**
* core Menu controller
* @class MenuContainerController
*/
declare class MenuContainerController {
private _model;
private _view;
private _items;
private _ctx;
private _parent;
private _root;
private _rootCtrl;
private _parentItem;
private _child;
private _initializingView;
private _openingSubmenu;
private _evaBaseDoc?;
private _currentItem;
private _mouseOverItemTimeoutId;
private _closingCurrentChildTimeoutId;
private _mouseStayOutSubmenuTimeoutId;
private _mouseStayTime;
private _mouseStayoutSubmenuTime;
private _lastMouseDownedItem;
private _direction;
private _pos?;
private _viewPosition;
private _currentChildPositionClassText;
private _modelEventMananger;
private _disposed;
/**
* Creates an instance of MenuContainerController.
* @param {MenuSubmenu} param
* @param {(any | MenuItemController)} [ctx] - it is MenuItemController if it is created by parent MenuItemController, otherwise it is a root context.
* @memberof MenuContainerController
*/
constructor(param: MenuRootController | MenuItemController, ctx: any, pos?: PopupPosition, rootWindow?: Window);
private _createView;
private _calculatePosition;
private _createItems;
setSkinToCurrentView(css: string): void;
setCSSTextToCurrentView(cssText: string): void;
resizeView(width: number, height: number): void;
getView(): MenuDialogView | null;
hasView(): boolean;
getViewPosition(): ViewPosition | null;
getDialogPosition(): ClientRect | null;
getModel(): MenuSubmenu;
isReadyToUse(): boolean | undefined;
getChild(): MenuContainerController | null;
getRootController(): MenuRootController;
getContext(): any;
getLayer(): number;
getBasedItemController(): MenuItemController | null;
isCurrentOpenedChildSubmenuItem(item: MenuItemController): boolean | undefined;
getLastMouseDownedItem(): MenuItemController | null;
setLastMouseDownedItem(item: MenuItemController): MenuItemController;
synchronize(): void;
/**
* create and open submenu
*
* @param {MenuItemController} item
* @return {*}
* @memberof MenuContainerController
*/
openSubmenu(item: MenuItemController): null | undefined;
setTopMost(): void;
/**
* check if the controller is alive before firing the callback
* @private
* @param {(...args:any[]) => any} callback
* @return {*}
* @memberof MenuItemController
*/
checkAvailabilityBeforeCall(callback: (...args: any[]) => any, _this?: MenuItemController): (...args: any[]) => void;
private _setViewDOMEvents;
private _onMenuDragStart;
private _onDocumentFocusOut;
/**
* always close when HTA's document.body is clicked
* @private
* @param {MSEventObj} ev
* @return {*}
* @memberof MenuContainerController
*/
private _onBaseDocClick;
private _onUnload;
/**
* Keyboard events
* @private
* @param {MSEventObj} ev
* @memberof MenuContainerController
*/
private _onKeyPress;
private _onPressAltF4;
private _onDocumentMouseWheel;
getElementsByName(name: string): void;
getNextMenuItem(plus: number, current?: MenuItemController): MenuItemController | null;
setCurrentItem(item: MenuItemController, activateMouseStay?: boolean): void;
private _hookMouseStay;
private _clearMouseStayTimeout;
/**
* close an opened child menu if the mouse cursor leaves the outside of its submenu item
* @private
* @param {MenuItemController} item
* @return {*}
* @memberof MenuContainerController
*/
private _hookToCloseCurrentChild;
clearClosingCurrentChildTimeout(): void;
getCurrentItem(): MenuItemController | null;
/**
* set parent's currentItem as this submenu item
* @memberof MenuContainerController
*/
setThisAsParentCurrentItem(view: MenuDialogView | null): void;
hide(): void;
isAvailable(): boolean;
isLocked(): boolean;
isDisposed(): boolean;
disposeAll(causedItem?: MenuItemController): void;
disposeFromParent(causedItem?: MenuItemController): void;
disposeChild(causedItem?: MenuItemController): void;
dispose(causedItem?: MenuItemController): void;
private _dispose;
getDirection(): number;
$L(): string;
}
/**
* controller for each menu item
* @class MenuItemController
* @implements {LoggerInterface}
*/
declare class MenuItemController {
private _model;
private _container;
private _view?;
private _modelEventMananger;
constructor(model: MenuModelItem, container: MenuContainerController, view: MenuItemView);
private _prepareModel;
getView(): MenuItemView | undefined;
isCurrentItem(): boolean;
private _setItemEvents;
private _onMouseOverItem;
private _onMouseDownItem;
private _onMouseUpItem;
private _onMouseClickItem;
/**
* activate the menu item
* @param {(MSEventObj)} ev
* @memberof MenuItemController
*/
activate(ev?: MSEventObj): false | undefined;
/**
* fire if the mouse cursor hover on the item for more than certain time
* @memberof MenuItemController
*/
fireMouseStay(): false | undefined;
getModel(): MenuModelItem;
getContainer(): MenuContainerController;
dispose(destroy?: boolean): void;
}
/**
* each user event interacts with menu items through this wrapper.
* this event object is passed as a first argument to each event handler.
*/
declare class MenuUserEventObject implements MenuUserEventObjectModel {
ctx: any;
srcContext: any;
target: MenuContainerUI | MenuItemUI;
readonly type: MenuItemUserEventNames;
readonly index?: number;
readonly id?: string;
readonly name?: string;
readonly radioIndex?: number;
readonly selectedIndex?: number;
readonly checked?: boolean;
readonly rootX: number;
readonly rootY: number;
readonly canceled?: boolean;
value?: any;
cancelGlobal: boolean;
constructor(type: MenuItemUserEventNames, ctrl: MenuContainerController | MenuItemController, causedItem?: MenuItemController);
dispose(): void;
}
declare abstract class _MenuUI<T> {
protected _ctrl: T;
constructor(ctrl: T);
dispose(): void;
}
declare class MenuContainerUI extends _MenuUI<MenuContainerController> {
constructor(ctrl: MenuContainerController);
loadSkin(css: string, root?: boolean): void;
/**
* create stand alone popup dialog
*/
popup(args: any, marginX?: number, marginY?: number): any;
}
declare class MenuItemUI extends _MenuUI<MenuItemController> {
constructor(ctrl: MenuItemController);
getContainer(): MenuContainerUI;
setLabel(text: string, asHtml?: boolean): void;
getLabel(): string | void;
setIcon(icon: IconSettingType): void;
remove(): void;
}
interface HtaContextMenuArguments extends Omit<MenuItemSubmenuParameter, 'type' | 'label'> {
type?: 'submenu' | 'popup';
onunload?: (...args: any) => any;
}
declare class HtaContextMenu extends MenuRootController {
Types: {
MenuConstructorParameter: HtaContextMenuArguments;
MenuItemParameter: MenuItemCreateParameter;
MenuItemParameterOrNull: MenuItemCreateParameter | null | undefined;
};
constructor(param: HtaContextMenuArguments);
getVersion(): string;
showVersion(): void;
}
export { HtaContextMenu as default };