import { AfterViewInit, ChangeDetectorRef, ElementRef, Injector, OnChanges, OnDestroy, OnInit, SimpleChanges } from '@angular/core'; import { EventBusHandler } from '../../../event-bus/handler'; import { NavTreeNode } from '../../../interface/tree'; import { TreeComponent } from '../../../components/tree/tree'; import { CommonFileNavTreeDataService } from '../../../nav-data/common-file'; import { ContextService } from '../../../services/context.service'; import { NavTreeNodeIconService } from '../../../nav-data/node-icon'; import { NavTreeService } from '../../../services/nav-tree.service'; import { EditorController } from '../../../controller/editor.controller'; import { CommonNodeIconService } from '../../../nav-data/default-impl/node-icon.service'; import { NavTreeSearchBarConfig } from '../../../interface/nav-panel'; import { NavTreeSearchBarComponent } from './search-bar/search-bar'; import { NavTreeSearchService } from './search-bar/search.service'; /** * 通用文件导航树组件 * @remarks * 应该根据相应的接口设置导航树数据以及图标服务 */ export declare class CommonFileNavTreeComponent implements AfterViewInit, OnChanges, OnInit, OnDestroy { private injector; private cd; private eventBusHandler; private context; private controller; private navTreeService; private defaultIconService; private searchService; /** 数据为空时的提示信息 */ emptyMessage: string; /** * 是否主要导航树 * @remarks * 主要导航树会随着当前页签的变化而切换自己的当前选中节点 * 默认所有导航树都是主要导航树 */ isMainNavTree: boolean; /** 根路径,作为获取导航树数据时需要传入的参数 */ readonly root: string; /** * 根文件地址 * @remarks 默认为空,如果为空则使用上下文服务中的入口文件地址,否则使用该地址作为加载导航树根节点的路径信息 */ rootFilePath: string; /** 上方搜索栏配置 */ searchBarConfig?: NavTreeSearchBarConfig; /** 是否禁用搜索服务,提高性能 */ disableSearchService?: boolean; /** 是否启用虚拟列表,默认不启用 */ virtualized?: boolean; /** 树组件实例 */ treeCmp: TreeComponent; /** 最外层的div元素引用 */ wrapperEl: ElementRef; /** 作为滚动条容器的div元素引用 */ scrollContainerEl: ElementRef; /** 作为滚动条滚动内容的外层div元素引用 */ scrollElementEl: ElementRef; /** 上方的搜索栏组件实例 */ searchBar: NavTreeSearchBarComponent; /** * 由文件路径到树节点Id的映射 * @remarks 在导航树中可能存在多个文件路径相同的节点,所以需要记录右侧编辑器中的文件是由那个节点双击打开的 */ private path2IdMap; /** 导航树数据 */ treeData: NavTreeNode[]; /** 导航树数据服务 */ private dataService; /** 导航树图标服务 */ private iconService; /** 需要在组件销毁时取消的订阅监听 */ private subscriptions; /** 代码视图入口文件路径 */ private entryFilePath; /** 代码视图事件总线实例 */ private eventBus; /** 展平后的节点数组,每次更新数据后由treeData拷贝而来(为搜索功能服务),必须保持同步 */ private flatNodes; /** 搜索关键词,判断本关键词非空时显示搜索结果树 */ private searchKey; /** 搜索结果树节点数据 */ private searchResult; /** 数据是否为空,为空时隐藏导航树并显示自定义的提示信息 */ readonly empty: boolean; /** 当本字段有值时,优先使用本字段的值控制搜索栏显隐性 */ private _showSearchBar; /** 是否显示搜索栏 */ readonly showSearchBar: boolean; /** 如果启用虚拟列表则需要为树组件设置高度 */ readonly scrollElementStyle: any; /** * 待展示的树数据 * @remarks 搜索关键词非空时展示搜索结果树 */ readonly treeDataToShow: NavTreeNode[]; /** * 数据为空时的提示信息 * @remarks 数据为空或搜索结果为空 */ readonly emptyMessageToShow: string; constructor(injector: Injector, // 防止依赖变更导致需要重新打包 cd: ChangeDetectorRef, eventBusHandler: EventBusHandler, context: ContextService, controller: EditorController, navTreeService: NavTreeService, defaultIconService: CommonNodeIconService, searchService: NavTreeSearchService); ngOnInit(): void; ngOnDestroy(): void; ngOnChanges(changes: SimpleChanges): void; ngAfterViewInit(): void; /** 订阅外部事件 */ private subscribeOuterEvent; /** 处理搜索栏关键词变化事件 */ private subscribeSearchBar; /** * 直接设置导航树数据和图标服务 * @remarks 此方法与dataServiceType属性相互冲突,请勿同时调用/设置 */ setDataService(dataService: CommonFileNavTreeDataService, iconService?: NavTreeNodeIconService): void; /** * 隐藏/显示搜索栏 * @remarks 隐藏前会自动清空输入框 */ toggleSearchBar(): void; /** 清空搜索栏内容并显示全部数据 */ private clearSearchBar; /** * 重新加载导航树节点数据 * @param selectNodePath 数据加载完成后,选中该路径节点 */ reloadTreeData(selectNodePath?: string): Promise; /** * 通过文件路径获取文件条目标识 * @remarks 当不存在路径标识映射时,通过该方法获取文件条目标识 * @param path 文件路径 * @returns 条目标识 */ getIdByPath(path: string): string; private findNodeByPath; /** * 清空选中状态 */ clearSelection(): void; /** * 根据文件路径选中节点 * @param path 文件路径 * @returns 是否成功,如果节点不存在则失败 */ selectByPath(path: string): boolean; /** 尝试将节点自动移入视口 */ private scrollNodeIntoView; /** * 处理节点双击事件 * @remarks 打开文件并选中当前条目 */ handleDblClick(node: NavTreeNode): void; /** 处理节点展开事件 */ handleTreeNodeExpand(node: NavTreeNode): Promise; onMenuItemClick($event: any): void; /** 更新导航树节点图标 */ private setIcon; /** 触发树组件变更检查 */ private refresh; /** 获取滚动条所在的元素 */ getScrollContainer(): HTMLElement; /** 获取大小变化导致滚动条更新的元素,这里是树列表组件 */ getScrollElement(): HTMLElement; }