import { CompositeTreeNode, ExpandableTreeNode, SelectableTreeNode, TreeNode } from '@gedit/tree'; import { FileStat, MaybePromise, URI } from '@gedit/utils'; import { UriSelection } from '@gedit/application-common'; export interface NavigatorResourceNode { icon: string, label: string, uri?: string, // 节点对应文件路径 uriPath?: string, // 相对路径, uri和uriPath必须得有一个 priority?: number, // 优先级, 用于排序 isDirectory?: boolean // 是否为目录 disableOpen?: boolean // 禁用打开 contextMenuPath?: string[], // 对应的右键菜单 } export interface NavigatorChildrenResolver { canHandle(parent: NavigatorResourceNode): boolean moveTo?(fromNode: NavigatorResourceNode, toNode?: NavigatorResourceNode): void; resolveChildren(parent: NavigatorResourceNode): MaybePromise; } export interface NavigatorTreeNode extends SelectableTreeNode, UriSelection { children?: NavigatorTreeNode[] expanded?: boolean resource: NavigatorResourceNode } export type NavigatorDirNode = NavigatorTreeNode & ExpandableTreeNode; export namespace NavigatorTreeNode { export function is(node: Object | undefined): node is NavigatorTreeNode { return !!node && TreeNode.is(node) && 'resource' in node && 'uri' in node; } export function getUri(node: NavigatorTreeNode | undefined): string | undefined { if (is(node)) { return node.uri.toString(); } return undefined; } } export interface NavigatorRootNode extends NavigatorDirNode { parent: NavigatorDirNode } export namespace NavigatorRootNode { export function is(node: Object | undefined): node is NavigatorRootNode { return NavigatorDirNode.is(node) && NavigatorDirNode.is(node.parent); } } export namespace NavigatorDirNode { export const rootNode = { id: 'NavigatorResourceRootId', name: 'NavigatorResourceRoot' }; export function is(node: Object | undefined): node is NavigatorDirNode { return NavigatorTreeNode.is(node) && !!node.resource.isDirectory; } export function compare(node: TreeNode, node2: TreeNode): number { return dirCompare(node, node2) || uriCompare(node, node2); } export function uriCompare(node: TreeNode, node2: TreeNode): number { if (NavigatorTreeNode.is(node)) { if (NavigatorTreeNode.is(node2)) { return node.uri.displayName.localeCompare(node2.uri.displayName); } return 1; } if (NavigatorTreeNode.is(node2)) { return -1; } return 0; } export function dirCompare(node: TreeNode, node2: TreeNode): number { const a = NavigatorDirNode.is(node) ? 1 : 0; const b = NavigatorDirNode.is(node2) ? 1 : 0; return b - a; } export function isRootNode(node: TreeNode | undefined): node is NavigatorTreeNode { return CompositeTreeNode.is(node) && node.id === NavigatorDirNode.rootNode.id; } /** * 创建根节点 * @param fileStat * @param resourceName */ export function createRoot(fileStat: FileStat, resourceName?: string): NavigatorDirNode { const resource = { uri: fileStat.uri, icon: '', label: '' }; return { id: NavigatorDirNode.rootNode.id, name: resourceName || NavigatorDirNode.rootNode.name, parent: undefined, children: [], expanded: true, uri: new URI(resource.uri), visible: false, selected: false, resource }; } }