/*
 * Copyright (c) 2010, 2026 BSI Business Systems Integration AG
 *
 * This program and the accompanying materials are made
 * available under the terms of the Eclipse Public License 2.0
 * which is available at https://www.eclipse.org/legal/epl-2.0/
 *
 * SPDX-License-Identifier: EPL-2.0
 */
import {Action, FilterOrFunction, Menu, ObjectOrChildModel, ObjectOrModel, TreeCheckableStyle, TreeDisplayStyle, TreeNode, WidgetModel} from '../index';

export interface TreeModel extends WidgetModel {
  /**
   * Default is false.
   */
  toggleBreadcrumbStyleEnabled?: boolean;
  breadcrumbTogglingThreshold?: number;
  /**
   * When set to true, all children of a node will be checked/unchecked together with their parents.
   *
   * The state of a node is a representation of its children.
   * - When none of the children are checked, the node is unchecked
   * - When some of the children are checked, the node is partly checked
   * - When all children are checked, the node is also checked
   *
   * Only has an effect if the tree is checkable.
   *
   * Default is false
   */
  autoCheckChildren?: boolean;
  /**
   * Default is false.
   */
  checkable?: boolean;
  /**
   * Default is {@link Tree.CheckableStyle.CHECKBOX_TREE_NODE}.
   */
  checkableStyle?: TreeCheckableStyle;
  /**
   * Default is {@link Tree.DisplayStyle.DEFAULT}.
   */
  displayStyle?: TreeDisplayStyle;
  /**
   * Specifies whether it should be possible to drop elements onto the tree.
   *
   * Currently, only {@link DropType.FILE_TRANSFER} is supported.
   *
   * By default, dropping is disabled.
   */
  dropType?: number;
  /**
   * Specifies the maximum size in bytes a file can have if it is being dropped.
   *
   * It only has an effect if {@link dropType} is set to {@link DropType.FILE_TRANSFER}.
   *
   * Default is {@link dragAndDrop.DEFAULT_DROP_MAXIMUM_SIZE}
   */
  dropMaximumSize?: number;
  /**
   * Default is true.
   */
  lazyExpandingEnabled?: boolean;
  /**
   * Configures the menus to be displayed in the {@link MenuBar} of the tree.
   *
   * The visibility of the {@link Menu} and where it should appear depends on the used {@link Tree.MenuType} configured in {@link Menu.menuTypes}.
   */
  menus?: ObjectOrChildModel<Menu>[];
  /**
   * Configures the keystrokes that should be registered in the current {@link keyStrokeContext}.
   *
   * Use the {@link ActionModel.keyStroke} to assign the keys that need to be pressed.
   *
   * @see KeyStrokeContext
   */
  keyStrokes?: ObjectOrChildModel<Action>[];
  /**
   * Default is true.
   */
  multiCheck?: boolean;
  /**
   * Top-level nodes
   */
  nodes?: ObjectOrModel<TreeNode>[];
  /**
   * Default is 23.
   */
  nodePaddingLevelCheckable?: number;
  /**
   * Default is 18.
   */
  nodePaddingLevelNotCheckable?: number;
  /**
   * Defines whether the tree should automatically scroll to the selected nodes when it is rendered.
   *
   * Default is false.
   */
  scrollToSelection?: boolean;
  selectedNodes?: TreeNode[] | string[];
  /**
   * Defines the node that has the focus when the tree is focused.
   *
   * The focused node can be changed using keyboard navigation.
   *
   * This property only has an effect if {@link nodesFocusable} is set to true.
   */
  focusedNode?: TreeNode | string;
  /**
   * Defines whether the nodes should show a focus indicator when the tree is focused.
   *
   * The currently focused node is defined by {@link focusedNode}.
   *
   * Default is false.
   */
  nodesFocusable?: boolean;
  /**
   * The filters control which nodes are allowed to be displayed in the table.
   *
   * If one of the filters does not accept a specific node, the node won't be shown. Hence, all filters must agree to make a node visible.
   *
   * By default, there are no filters.
   *
   * @see Tree.visibleNodesFlat
   * @see Tree.nodes
   */
  filters?: FilterOrFunction<TreeNode>[];
  textFilterEnabled?: boolean;
  defaultMenuTypes?: string[];
}
