import type { Event, Disposable } from '@difizen/mana-common';
import type { SelectionProvider } from '@difizen/mana-core';
import { TreeNode } from './tree';
/**
 * The tree selection service.
 */
export declare const TreeSelectionService: unique symbol;
export type TreeSelectionService = {
    /**
     * The tree selection, representing the selected nodes from the tree. If nothing is selected, the
     * result will be empty.
     */
    readonly selectedNodes: readonly Readonly<SelectableTreeNode>[];
    /**
     * Emitted when the selection has changed in the tree.
     */
    readonly onSelectionChanged: Event<readonly Readonly<SelectableTreeNode>[]>;
    /**
     * Registers the given selection into the tree selection service. If the selection state changes after adding the
     * `selectionOrTreeNode` argument, a selection changed event will be fired. If the argument is a tree node,
     * a it will be treated as a tree selection with the default selection type.
     */
    addSelection: (selectionOrTreeNode: TreeSelection | Readonly<SelectableTreeNode>) => void;
    /**
     * Store selection state.
     */
    storeState: () => object;
    /**
     * Restore selection state.
     */
    restoreState: (state: object) => void;
} & Disposable & SelectionProvider<readonly Readonly<SelectableTreeNode>[]>;
/**
 * Representation of a tree selection.
 */
export type TreeSelection = {
    /**
     * The actual item that has been selected.
     */
    readonly node: Readonly<SelectableTreeNode>;
    /**
     * The optional tree selection type. Defaults to `SelectionType.DEFAULT`;
     */
    readonly type?: TreeSelection.SelectionType;
};
export declare namespace TreeSelection {
    /**
     * Enumeration of selection types.
     */
    enum SelectionType {
        DEFAULT = 0,
        TOGGLE = 1,
        RANGE = 2
    }
    function is(arg: Record<any, any> | undefined): arg is TreeSelection;
    function isRange(arg: TreeSelection | SelectionType | undefined): boolean;
    function isToggle(arg: TreeSelection | SelectionType | undefined): boolean;
}
/**
 * A selectable tree node.
 */
export type SelectableTreeNode = {
    /**
     * `true` if the tree node is selected. Otherwise, `false`.
     */
    selected: boolean;
    /**
     * `true` if the tree node has the focus. Otherwise, `false`. Defaults to `false`.
     */
    focus?: boolean;
} & TreeNode;
export declare namespace SelectableTreeNode {
    function is(node: TreeNode | undefined): node is SelectableTreeNode;
    function isSelected(node: TreeNode | undefined): node is SelectableTreeNode;
    function hasFocus(node: TreeNode | undefined): boolean;
    function isVisible(node: TreeNode | undefined): node is SelectableTreeNode;
    function getVisibleParent(node: TreeNode | undefined): SelectableTreeNode | undefined;
}
//# sourceMappingURL=tree-selection.d.ts.map