1
1
import { View } from "../view" ;
2
2
import { Heap } from "../../controllers/heap" ;
3
3
import { FIELDS_RESULTS } from "../../types" ;
4
- import TreeView , { TreeViewItem } from "js-treeview " ;
4
+ import ThreeView , { ThreeViewItem } from "../three/three " ;
5
5
6
6
7
7
export class Fields {
8
8
private static ROOT_NODE : HTMLDivElement | null = null ;
9
9
private static ROOT_NODE_CLASS_NAME : string = 'fields-root-node' ;
10
10
11
11
static async getRootNode ( ) : Promise < HTMLDivElement > {
12
- return Fields . ROOT_NODE = await View . getRootNode ( Fields . ROOT_NODE , Fields . ROOT_NODE_CLASS_NAME ) ;
12
+ Fields . ROOT_NODE = await View . getRootNode ( Fields . ROOT_NODE , Fields . ROOT_NODE_CLASS_NAME ) ;
13
+ Fields . ROOT_NODE . role = "tree" ;
14
+ return Fields . ROOT_NODE ;
13
15
}
14
16
constructor ( private heap : Heap ) { }
15
17
16
- displayStructs ( parentNode : HTMLDivElement , fieldResults : FIELDS_RESULTS [ ] , struct : string , kmalloc : string ) {
17
- let root = { name : '' , children : [ ] } as TreeViewItem < FIELDS_RESULTS > ;
18
+ displayStructs ( parentNode : HTMLDivElement , fieldResults : FIELDS_RESULTS [ ] , struct : string , kmalloc : string , kmalloc_cache_name : string | undefined , kmalloc_cgroup_name : string | undefined , bits_offset : string , bits_end : string ) {
19
+ let root = { name : '' , children : [ ] } as ThreeViewItem < FIELDS_RESULTS > ;
18
20
let fullName = false ;
19
21
20
22
fieldResults . forEach ( field => {
@@ -25,16 +27,18 @@ export class Fields {
25
27
if ( part == "" ) {
26
28
part = `union` ;
27
29
}
28
- let nextLeaf : TreeViewItem < FIELDS_RESULTS > = leaf . children . find ( e => e . name == part ) ;
30
+ let nextLeaf = leaf . children ? .find ( e => e . name == part ) ;
29
31
if ( ! nextLeaf ) {
30
32
nextLeaf = {
31
33
expanded : true ,
34
+ selected : bits_offset == field . bits_offset && bits_end == field . bits_end ,
32
35
get name ( ) {
33
36
if ( fullName ) {
34
37
return `[${ this . data ! . bits_offset } ..${ this . data ! . bits_end } ] ${ part } (${ this . data ! . type } )` ;
35
38
}
36
39
return part ;
37
40
} ,
41
+ label : part ,
38
42
children : [ ] ,
39
43
data : {
40
44
bits_offset : field . bits_offset ,
@@ -44,9 +48,10 @@ export class Fields {
44
48
type : part == 'union' ? '...' : 'struct'
45
49
}
46
50
} ;
47
- leaf . children . push ( nextLeaf ) ;
51
+ leaf . children ? .push ( nextLeaf ) ;
48
52
} else if ( parseInt ( nextLeaf . data ! . bits_end ) < parseInt ( field . bits_end ) ) {
49
- nextLeaf . data ! . bits_end = field . bits_end
53
+ nextLeaf . data ! . bits_end = field . bits_end ;
54
+ nextLeaf . selected = bits_offset == nextLeaf . data ! . bits_offset && bits_end == field . bits_end ;
50
55
}
51
56
if ( index == pathParts . length - 1 ) {
52
57
nextLeaf . data ! . type = field . type ;
@@ -59,10 +64,29 @@ export class Fields {
59
64
} ) ;
60
65
fullName = true ;
61
66
parentNode . replaceChildren ( ) ;
62
- const treeview = new TreeView < FIELDS_RESULTS > ( root . children , parentNode ) ;
67
+ const treeview = new ThreeView < FIELDS_RESULTS > ( root . children , parentNode ) ;
63
68
treeview . on ( 'select' , e => {
64
69
let field = e . data . data ! ;
65
- location . hash = `!heap/${ kmalloc } /${ struct } /${ field . bits_offset } ..${ field . bits_end } ` ;
70
+ history . pushState ( null , '' , `#!heap/${ kmalloc } /${ struct } /${ field . bits_offset } ..${ field . bits_end } ` ) ;
71
+ this . heap . displayAccess (
72
+ Number ( field . bits_offset ) ,
73
+ Number ( field . bits_end ) ,
74
+ struct ,
75
+ kmalloc ,
76
+ kmalloc_cache_name ,
77
+ kmalloc_cgroup_name ,
78
+ 0 ) ;
66
79
} ) ;
80
+ let sel = treeview . getSelected ( ) ;
81
+ switch ( sel ?. length ) {
82
+ case undefined :
83
+ case 0 :
84
+ treeview . focus ( treeview . getFirst ( ) ) ;
85
+ break ;
86
+ case 1 :
87
+ break ;
88
+ default :
89
+ treeview . select ( sel ! [ 0 ] ) ;
90
+ }
67
91
}
68
92
}
0 commit comments