Advertisement
Guest User

family tree widget

a guest
Jan 9th, 2020
366
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. // family-tree.ts
  2.  
  3. import {
  4.   CompositeTreeNode,
  5.   ExpandableTreeNode,
  6.   SelectableTreeNode,
  7.   TreeImpl,
  8.   TreeNode
  9. } from "@theia/core/lib/browser";
  10.  
  11. export default class FamilyTree extends TreeImpl {
  12.   async resolveChildren(parent: CompositeTreeNode): Promise<TreeNode[]> {
  13.     if (FamilyMemberNode.is(parent)) {
  14.       const memberNode = parent as FamilyMemberNode;
  15.  
  16.       if (!memberNode.children) return [];
  17.       return memberNode.familyMember.children.map(child =>
  18.         FamilyMemberNode.toNode(child, parent)
  19.       );
  20.     }
  21.     return Array.from(parent.children);
  22.   }
  23. }
  24.  
  25. export interface FamilyMember {
  26.   name: string;
  27.   children: FamilyMember[];
  28. }
  29.  
  30. export interface FamilyMemberNode
  31.   extends SelectableTreeNode,
  32.     ExpandableTreeNode {
  33.   familyMember: FamilyMember;
  34. }
  35.  
  36. export namespace FamilyMemberNode {
  37.   export function is(node: object | undefined): node is FamilyMemberNode {
  38.     return !!node && "familyMember" in node;
  39.   }
  40.  
  41.   export function toNode(
  42.     member: FamilyMember,
  43.     parent: CompositeTreeNode | undefined = undefined
  44.   ): FamilyMemberNode {
  45.     const node: FamilyMemberNode = {
  46.       id: member.name,
  47.       name: member.name,
  48.       familyMember: member,
  49.       selected: false,
  50.       visible: true,
  51.       expanded: false,
  52.       children: [],
  53.       parent
  54.     };
  55.     return node;
  56.   }
  57. }
  58.  
  59. // family-tree-model.ts
  60.  
  61. import { TreeModelImpl } from "@theia/core/lib/browser";
  62.  
  63. export class FamilyTreeModel extends TreeModelImpl {
  64.    
  65. }
  66.  
  67. // family-tree-label-provider.ts
  68.  
  69. import { LabelProviderContribution } from "@theia/core/lib/browser";
  70. import { FamilyMemberNode } from "./family-tree";
  71.  
  72. export class FamilyTreeLabelProvider implements LabelProviderContribution {
  73.   canHandle(element: object): number {
  74.     return FamilyMemberNode.is(element) ? 1 : 0;
  75.   }
  76.  
  77.   getName(node: FamilyMemberNode): string {
  78.     return node.familyMember.name;
  79.   }
  80. }
  81.  
  82.  
  83. // family-tree-widget.tsx
  84.  
  85. import {
  86.   CompositeTreeNode,
  87.   ContextMenuRenderer,
  88.   TreeProps,
  89.   TreeWidget,
  90.   TreeModel
  91. } from "@theia/core/lib/browser";
  92. import { inject, injectable, postConstruct } from "inversify";
  93. import { FamilyMemberNode, FamilyMember } from "./family-tree";
  94. import { FamilyTreeModel } from "./family-tree-model";
  95. import * as React from "react";
  96.  
  97. @injectable()
  98. export class FamilyTreeWidget extends TreeWidget {
  99.   static readonly ID = "family-tree:widget";
  100.   static readonly LABEL = "Family";
  101.  
  102.   constructor(
  103.     @inject(TreeProps) readonly props: TreeProps,
  104.     @inject(FamilyTreeModel) readonly model: FamilyTreeModel,
  105.     @inject(ContextMenuRenderer) contextMenuRenderer: ContextMenuRenderer
  106.   ) {
  107.     super(props, model, contextMenuRenderer);
  108.     const members: FamilyMember[] = [
  109.       {
  110.         name: "member 1",
  111.         children: [
  112.           {
  113.             name: "child1",
  114.             children: []
  115.           },
  116.           {
  117.             name: "child2",
  118.             children: []
  119.           }
  120.         ]
  121.       },
  122.       {
  123.         name: "member 2",
  124.         children: [
  125.           {
  126.             name: "child3",
  127.             children: []
  128.           },
  129.           {
  130.             name: "child4",
  131.             children: []
  132.           }
  133.         ]
  134.       }
  135.     ];
  136.     this.model.root = {
  137.       id: "family-tree-root",
  138.       name: "Family Tree Root",
  139.       children: members.map(member => FamilyMemberNode.toNode(member)),
  140.       visible: true,
  141.       parent: undefined
  142.     } as CompositeTreeNode;
  143.   }
  144.  
  145.   @postConstruct()
  146.   protected async init(): Promise<void> {
  147.     this.id = FamilyTreeWidget.ID;
  148.     this.title.label = FamilyTreeWidget.LABEL;
  149.     this.title.caption = FamilyTreeWidget.LABEL;
  150.     this.title.closable = true;
  151.     this.title.iconClass = "fa fa-window-maximize"; // example widget icon.
  152.     this.update();
  153.   }
  154. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement