import { Formats } from './format';
import { Slot } from './slot';
import { Attribute, Formatter } from './attribute';
import { Component } from './component';
export declare class EventCache<T, K extends keyof T = keyof T> {
    private listeners;
    add(eventType: K, callback: T[K]): void;
    get(eventType: K): Array<T[K]>;
    clean(eventType: K): void;
}
export declare const eventCacheMap: WeakMap<Component<import("./types").State>, EventCache<EventTypes, keyof EventTypes>>;
/**
 * 插入内容事件对象
 */
export interface InsertEventData {
    /** 插槽插入的位置 */
    index: number;
    /** 当前插入的内容 */
    content: string | Component;
    /** 当前插入的附加的格式 */
    formats: Formats;
}
/**
 * 换行事件对象
 */
export interface BreakEventData {
    /** 换行事件插槽的第几位触发的换行操作 */
    index: number;
}
/**
 * 删除数据事件对象
 */
export interface DeleteEventData {
    /** 删除数据的位置 */
    index: number;
    /** 删除数据的长度 */
    count: number;
    /** 是否是向结束位置删除 */
    toEnd: boolean;
    /** 删除内容还是移动内容 */
    actionType: 'delete' | 'move';
}
/**
 * 粘贴事件对象
 */
export interface PasteEventData {
    /** 标识粘贴发生在插槽的第几位 */
    index: number;
    /** 粘贴的内容 */
    data: Slot;
    /** 粘贴内容的纯文本 */
    text: string;
}
/**
 * 组合输入开始事件对象
 */
export interface CompositionStartEventData {
    /** 标识在插槽的第几位触发 */
    index: number;
}
/**
 * 组合输入更新事件对象
 */
export interface CompositionUpdateEventData {
    /** 标识在插槽的第几位触发 */
    index: number;
    /** 组件数据输入的数据 */
    data: string;
}
/**
 * 组件插槽设置属性事件对象
 */
export interface SlotSetAttributeEventData<T = any> {
    attribute: Attribute<T>;
    value: T;
}
/**
 * 组件插槽应用格式事件对象
 */
export interface SlotApplyFormatEventData<T = any> {
    formatter: Formatter<T>;
    value: T;
}
/**
 * 上下文本菜单配置项
 */
export interface ContextMenuItem {
    type: string;
    disabled?: boolean;
    onClick(): void;
}
/**
 * 自定义上下文本菜单配置项
 */
export interface ContextMenuCustomItem<T = unknown> {
    type: string;
    value?: T;
    disabled?: boolean;
    validate?(value: T): true | string;
    onComplete(value: T): void;
}
/**
 * 上下文多级菜单配置项
 */
export interface ContextMenuGroup {
    type: string;
    disabled?: boolean;
    submenu: Array<ContextMenuItem | ContextMenuCustomItem>;
}
export type ContextMenuConfig = ContextMenuGroup | ContextMenuItem;
export interface SlotRange {
    slot: Slot;
    startIndex: number;
    endIndex: number;
}
export interface EventTypes {
    onUnselect: () => void;
    onSelected: () => void;
    onFocus: () => void;
    onBlur: () => void;
    onFocusIn: () => void;
    onFocusOut: () => void;
    onDetach: () => void;
    onParentSlotUpdated: () => void;
    onSelectionFromFront: (event: Event<Component>) => void;
    onSelectionFromEnd: (event: Event<Component>) => void;
    onBreak: (event: Event<Slot, BreakEventData>) => void;
    onPaste: (event: Event<Slot, PasteEventData>) => void;
    onContextMenu: (event: ContextMenuEvent<Component>) => void;
    onContentInserted: (event: Event<Slot, InsertEventData>) => void;
    onContentInsert: (event: Event<Slot, InsertEventData>) => void;
    onContentDelete: (event: Event<Slot, DeleteEventData>) => void;
    onContentDeleted: (event: Event<Slot>) => void;
    onGetRanges: (event: GetRangesEvent<Component>) => void;
    onCompositionStart: (event: Event<Slot, CompositionStartEventData>) => void;
    onCompositionUpdate: (event: Event<Slot, CompositionUpdateEventData>) => void;
    onCompositionEnd: (event: Event<Slot>) => void;
    onSlotSetAttribute: (event: Event<Slot, SlotSetAttributeEventData>) => void;
    onSlotApplyFormat: (event: Event<Slot, SlotApplyFormatEventData>) => void;
}
/**
 * Textbus 事件对象
 */
export declare class Event<S, T = null> {
    target: S;
    data: T;
    get isPrevented(): boolean;
    private _isPrevented;
    constructor(target: S, data: T);
    preventDefault(): void;
}
export declare class ContextMenuEvent<T> extends Event<T> {
    private getMenus;
    constructor(target: T, getMenus: (menus: ContextMenuConfig[]) => void);
    get stopped(): boolean;
    private isStopped;
    stopPropagation(): void;
    useMenus(menus: ContextMenuConfig[]): void;
}
export declare class GetRangesEvent<T> extends Event<T> {
    private getRanges;
    constructor(target: T, getRanges: (ranges: SlotRange[]) => void);
    useRanges(ranges: SlotRange[]): void;
}
/**
 * 触发组件事件的方法
 * @param target 目标组件
 * @param eventType 事件名
 * @param event 事件对象
 */
export declare function invokeListener(target: Component, eventType: 'onSelectionFromFront', event: Event<Component>): void;
export declare function invokeListener(target: Component, eventType: 'onSelectionFromEnd', event: Event<Component>): void;
export declare function invokeListener(target: Component, eventType: 'onContentInsert', event: Event<Slot, InsertEventData>): void;
export declare function invokeListener(target: Component, eventType: 'onContentInserted', event: Event<Slot, InsertEventData>): void;
export declare function invokeListener(target: Component, eventType: 'onContentDelete', event: Event<Slot, DeleteEventData>): void;
export declare function invokeListener(target: Component, eventType: 'onContentDeleted', event: Event<Slot>): void;
export declare function invokeListener(target: Component, eventType: 'onBreak', event: Event<Slot, BreakEventData>): void;
export declare function invokeListener(target: Component, eventType: 'onContextMenu', event: ContextMenuEvent<Component>): void;
export declare function invokeListener(target: Component, eventType: 'onPaste', event: Event<Slot, PasteEventData>): void;
export declare function invokeListener(target: Component, eventType: 'onGetRanges', event: GetRangesEvent<Component>): void;
export declare function invokeListener(target: Component, eventType: 'onCompositionStart', event: Event<Slot, CompositionStartEventData>): void;
export declare function invokeListener(target: Component, eventType: 'onCompositionUpdate', event: Event<Slot, CompositionUpdateEventData>): void;
export declare function invokeListener(target: Component, eventType: 'onSlotSetAttribute', event: Event<Slot, SlotSetAttributeEventData>): void;
export declare function invokeListener(target: Component, eventType: 'onSlotApplyFormat', event: Event<Slot, SlotApplyFormatEventData>): void;
export declare function invokeListener(target: Component, eventType: 'onCompositionEnd', event: Event<Slot>): void;
export declare function invokeListener(target: Component, eventType: 'onSelected'): void;
export declare function invokeListener(target: Component, eventType: 'onUnselect'): void;
export declare function invokeListener(target: Component, eventType: 'onFocus'): void;
export declare function invokeListener(target: Component, eventType: 'onBlur'): void;
export declare function invokeListener(target: Component, eventType: 'onFocusIn'): void;
export declare function invokeListener(target: Component, eventType: 'onFocusOut'): void;
export declare function invokeListener(target: Component, eventType: 'onDetach'): void;
export declare function invokeListener(target: Component, eventType: 'onParentSlotUpdated'): void;
/**
 * 根据组件触发上下文菜单
 * @param component
 */
export declare function triggerContextMenu(component: Component): ContextMenuConfig[][];
/**
 * 当已选中组件未选中或选区不只选中已选中组件时触发
 */
export declare const onUnselect: (listener: () => void) => void;
/**
 * 当选区刚好选中一个组件
 */
export declare const onSelected: (listener: () => void) => void;
/**
 * 当光标从前面进入组件
 */
export declare const onSelectionFromFront: (listener: (event: Event<Component>) => void) => void;
/**
 * 当光标从后面进入组件
 */
export declare const onSelectionFromEnd: (listener: (event: Event<Component>) => void) => void;
/**
 * 组件获取焦点事件的勾子
 */
export declare const onFocus: (listener: () => void) => void;
/**
 * 组件失去焦点事件的勾子
 */
export declare const onBlur: (listener: () => void) => void;
/**
 * 组件或子组件获取焦点事件的勾子
 */
export declare const onFocusIn: (listener: () => void) => void;
/**
 * 组件或子组件失去焦点事件的勾子
 */
export declare const onFocusOut: (listener: () => void) => void;
/**
 * 组件内粘贴事件勾子
 */
export declare const onPaste: (listener: (event: Event<Slot, PasteEventData>) => void) => void;
/**
 * 组件右键菜单事件勾子
 */
export declare const onContextMenu: (listener: (event: ContextMenuEvent<Component>) => void) => void;
/**
 * 组件子插槽内容删除时的勾子
 */
export declare const onContentDelete: (listener: (event: Event<Slot, DeleteEventData>) => void) => void;
/**
 * 组件子插槽内容删除完成时的勾子
 */
export declare const onContentDeleted: (listener: (event: Event<Slot>) => void) => void;
/**
 * 组件子插槽换行时的勾子
 */
export declare const onBreak: (listener: (event: Event<Slot, BreakEventData>) => void) => void;
/**
 * 组件子插槽插入内容时的勾子
 */
export declare const onContentInsert: (listener: (event: Event<Slot, InsertEventData>) => void) => void;
/**
 * 组件子插槽插入内容后时的勾子
 */
export declare const onContentInserted: (listener: (event: Event<Slot, InsertEventData>) => void) => void;
/**
 * 当组件为选区公共父组件时的勾子
 */
export declare const onGetRanges: (listener: (event: GetRangesEvent<Component>) => void) => void;
/**
 * 当插槽组合输入前触发
 */
export declare const onCompositionStart: (listener: (event: Event<Slot, CompositionStartEventData>) => void) => void;
/**
 * 当插槽组合输入时触发
 */
export declare const onCompositionUpdate: (listener: (event: Event<Slot, CompositionUpdateEventData>) => void) => void;
/**
 * 当插槽组合输入结束触发
 */
export declare const onCompositionEnd: (listener: (event: Event<Slot>) => void) => void;
/**
 * 当组件的父插槽数据发生更新后触发
 */
export declare const onParentSlotUpdated: (listener: () => void) => void;
/**
 * 当组件插槽设置属性时触发
 */
export declare const onSlotSetAttribute: (listener: (event: Event<Slot, SlotSetAttributeEventData>) => void) => void;
/**
 * 当组件插槽应用格式时触发
 */
export declare const onSlotApplyFormat: (listener: (event: Event<Slot, SlotApplyFormatEventData>) => void) => void;
/**
 * 当组件从数据模型上剥离时触发
 */
export declare const onDetach: (listener: () => void) => void;
