forked from kiddkai/atom-node-debugger
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathTreeView.coffee
More file actions
123 lines (111 loc) · 3.62 KB
/
Copy pathTreeView.coffee
File metadata and controls
123 lines (111 loc) · 3.62 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
hg = require 'mercury'
{h} = hg
Promise = require 'bluebird'
log = (msg) -> #console.log(msg)
TreeView = (title, loadChildren, { handlers, isRoot } = {}) ->
log "TreeView constructor. title=#{title}, isRoot=#{isRoot}"
return hg.state({
isRoot: hg.value(isRoot)
title: hg.value(title)
items: hg.array([])
isOpen: hg.value(false)
loading: hg.value(false)
loaded: hg.value(false)
channels: {
click:
(state) ->
log "TreeView event handler for click invoked"
TreeView.toggle(state)
handlers?.click?(state)
dblclick:
(state) ->
log "TreeView event handler for dblclick invoked"
handlers?.dblclick?(state)
customEvent:
(state) ->
log "TreeView event handler for customEvent invoked"
handlers?.customEvent?(state)
}
functors: {
render: TreeView.defaultRender
loadChildren: loadChildren
}
})
TreeView.toggle = (state) ->
log "TreeView.toggle #{state.isOpen()} item count=#{state.items().length} loaded=#{state.loaded()}, loading=#{state.loading()}"
state.isOpen.set(!state.isOpen())
return if state.loading() or state.loaded()
TreeView.populate(state)
TreeView.reset = (state) ->
log "TreeView.reset"
return unless state.loaded()
state.items.set([])
state.isOpen.set(false)
state.loaded.set(false)
state.loading.set(false)
log "TreeView.reset: done"
TreeView.populate = (state) ->
log "TreeView.populate"
state.loading.set(true)
state.functors.loadChildren(state)
.then (children) ->
log "TreeView.populate: children loaded. count=#{children.length})"
state.items.set(children)
state.loaded.set(true)
state.loading.set(false)
log "TreeView.populate: all done"
.catch (e) ->
log("TreeView.populate:error!!!" + JSON.stringify(e))
state.loaded.set(false)
state.loading.set(false)
TreeView.render = (state) ->
return state?.functors?.render?(state)
TreeView.defaultRender = (state) ->
log "TreeView.render"
title = state.title?(state) ? state.title
result = h('li.list-nested-item', {
className: if state.isOpen then '' else 'collapsed'
}, [
h('div.header.list-item' + (if state.isRoot then '.heading' else ''), {
'ev-click': hg.send state.channels.click
'ev-dblclick': hg.send state.channels.dblclick
}, [title]),
h('ul.entries.list-tree', {}, state.items.map(TreeView.render))
])
result = h('div.debugger-vertical-pane.inset-panel', {}, [
h('ul.list-tree.has-collapsable-children', {}, [result])
]) if state.isRoot
return result
TreeViewItem = (value, { handlers } = {}) -> hg.state({
value: hg.value(value)
channels: {
click:
(state) ->
log "TreeViewItem event handler for click invoked"
handlers?.click?(state)
dblclick:
(state) ->
log "TreeViewItem event handler for dblclick invoked"
handlers?.dblclick?(state)
}
functors: {
render: TreeViewItem.render
}
})
TreeViewItem.render = (state) ->
h('li.list-item.entry', {
'ev-click': hg.send state.channels.click
'ev-dblclick': hg.send state.channels.dblclick
}, [state.value?(state) ? state.value])
class TreeViewUtils
@createFileRefHeader: (fullPath, line) ->
return (state) -> h("div", {
title: fullPath
style:
display: 'inline'
}
["#{atom.project.relativizePath(fullPath)[1]} : #{line}"]
)
exports.TreeView = TreeView
exports.TreeViewItem = TreeViewItem
exports.TreeViewUtils = TreeViewUtils