import { DsfrSelectionMode } from '../../models/selection-mode.type';
import { DsfrNode, DsfrViewNode } from './tree.model';
/**
 * Interface utilisée par TreeSelectManager
 */
export interface TreeSelectable {
    /** Indique si toutes les options sont sélectionnées ou non. */
    isAllSelected: boolean;
    /** Retourne la structure arborescente du composant.  */
    get nodes(): DsfrNode[];
    /** Sélectionne / désélectionne tous les nœuds en mode multiple ou checkbox. */
    selectAll(select: boolean): void;
    /** Notifie le composant que node a changé d'état. */
    notifySelectEvent(node: DsfrNode): void;
    /** Mise à jour, graphique, du statut indeterminate. */
    updateIndeterminate(node: DsfrNode): void;
}
/**

 * TreeSelectManager implémente les fonctionnalités de sélection des nœuds d'une arborescence.
 * - Gère le mode de sélection
 * - Gère les checkbox
 * - Ne gère pas l'apparence des libellés sélectionnés
 */
export declare class TreeSelectManager {
    /**
     * Mode de sélection géré par le manager. Accessible par les composants utilisant ce manager.
     */
    selectionMode: DsfrSelectionMode;
    /** Stratégie de sélection : pouvoir sélectionner tous les noeuds ou uniquement les feuilles  */
    selectionStrategy: 'leaf' | 'all';
    /** Liste des nœuds sélectionnés. Si le mode de sélection est 'checkbox', seul les noeuds feuilles sont sélectionnables. */
    selectedNodes: DsfrNode[];
    /** Les noeuds feuilles doivent posséder un id défini à l'initialisation si compareWith n'est pas renseigné */
    noGenericId: boolean;
    /** Nombre total de feuilles de l'arbre */
    countLeaves: number;
    /** Composant géré par le manager. */
    private treeSelectable;
    /**
     * Attribut permettant de notifier qu'un noeud sélectionné à déjà été rencontré en mode single, permettant d'ignorer
     * l'état sélectionné de tous les noeuds subséquents.
     */
    private singleModeSelectedSkip;
    constructor(treeSelectable: TreeSelectable);
    /**
     * À appeler à chaque modification de l'arborescence.
     *
     * @param nodes Nœuds à initialiser
     */
    init(nodes: DsfrNode[]): DsfrViewNode[];
    /**
     * Sélection / désélection du nœud suite à un clic.
     * - Le nœud devient le nœud courant en mettant tabIndex=0
     * - Gestion des différents modes de sélection
     * - Envoie d'une notification sur le changement d'état de node.selected
     * Dans le cas du mode checkbox, il n'y a pas de modification suite aux changements d'états des enfants
     */
    doSelectNode(node: DsfrNode, nodeElt: HTMLElement): void;
    isSelectable(): boolean;
    isCheckboxMode(): boolean;
    isSingleMode(): boolean;
    isMultipleMode(): boolean;
    /**
     * Initialisation par défaut des propriétés d'un nœud : 'selected', 'id'.
     *
     * @param nodes Les noeuds à initialiser
     * @param level Le niveau du noeud dans la hiérarchie
     */
    initNodes(nodes: DsfrNode[], level: number): DsfrViewNode[];
    /**
     * Mise à jour des propriétés des nœuds (label, data, id) sans modifier l'état (select, expand) et ajouts éventuels.
     * @param nodes Nœuds d'entrée à mettre à jour.
     * @param viewNodes Nœuds clonés représentant l'état actuel de l'arbre.
     */
    updateNodesContent(nodes: DsfrNode[], viewNodes: DsfrViewNode[], level: number): DsfrNode[];
    selectAllNodes(nodes: DsfrNode[], select?: boolean): void;
    /**
     * Mise à jour liste des feuilles sélectionnées
     * (suppression des nœuds non sélectionnés)
     */
    updateSelectedNodes(): DsfrNode[];
    /**
     * Détermine l'état de l'attribut selected d'un noeud en fonction du mode courant et du model fournit.
     *
     * @param node Nœud du model fournit.
     * @param viewNode Nœud cloné représentant l'état actuel de l'arbre.
     */
    private handleNodeSelectedInitialization;
    private toggleNodeSelectedState;
    private handleSingleModeSelection;
    private handleMultipleModeSelection;
    private handleCheckboxModeSelection;
    /**
     * Met à jour, récursivement, l'état de chaque nœud en parcourant l'arborescence de haut en bas.
     */
    private updateChildren;
    /**
     * Met à jour l'état `selected` d'une branche en fonction de ses nœuds enfants ('true', 'false' ou 'undefined').
     * Émet un événement si l'état du nœud change.
     * Met à jour la propriété indeterminate de la checkbox
     * @param node Nœud de l'arbre
     */
    private updateBranchState;
    /**
     * Lance la mise à jour de l'état de sélection de chaque banche en parcourant l'arborescence de bas en haut de manière recursive.
     *
     * ex: Pour un model tel que le suivant:
     *    B1
     *   / \
     *  B2  B3
     *  |   |
     *  F1  F2
     *
     * La méthode updateBranches(B1) tentera de mettre à jour le noeud B2 qui recursivement mettra à jour la
     * feuille F1 avant de se mettre elle même (B2) à jour. Ensuite, la méthode mettra à jour les noeuds suivants de
     * la même façon, d'abord F2, puis B3. Enfin, une fois tous ses descendants à jour, B1 se mettra lui même à jour.
     */
    private updateBranches;
    /**
     * Retourne le 1er nœud sélectionné dans l'arborescence.
     * @param nodes arborescence
     * @return 1er nœud sélectionné ou undefined
     */
    private findFirstNodeSelected;
    /**
     * Sélectionne / déselectionne récursivement tous les nœuds nodes et leurs descendants
     * @param nodes Liste de nœuds à sélectionner
     * @param select true : selection des noeuds, false : fermeture
     */
    private toggleNodesState;
}
