|
44 | 44 |
|
45 | 45 | require.config({ baseUrl: '/static' }); |
46 | 46 |
|
47 | | - require(['vs/base/browser/ui/tree/indexTree', 'vs/base/browser/ui/tree/asyncDataTree', 'vs/base/browser/ui/tree/tree', 'vs/base/common/iterator'], ({ IndexTree }, { AsyncDataTree }, { TreeVisibility }, { iter }) => { |
| 47 | + require(['vs/base/browser/ui/tree/indexTree', 'vs/base/browser/ui/tree/asyncDataTree', 'vs/base/browser/ui/tree/dataTree', 'vs/base/browser/ui/tree/tree', 'vs/base/common/iterator'], ({ IndexTree }, { AsyncDataTree }, { DataTree }, { TreeVisibility }, { iter }) => { |
48 | 48 | function createIndexTree(opts) { |
49 | 49 | opts = opts || {}; |
50 | 50 |
|
|
182 | 182 | return { tree, treeFilter }; |
183 | 183 | } |
184 | 184 |
|
| 185 | + function createDataTree() { |
| 186 | + const delegate = { |
| 187 | + getHeight() { return 22; }, |
| 188 | + getTemplateId() { return 'template'; } |
| 189 | + }; |
| 190 | + |
| 191 | + const renderer = { |
| 192 | + templateId: 'template', |
| 193 | + renderTemplate(container) { return container; }, |
| 194 | + renderElement(node, index, container) { container.textContent = node.element.name; }, |
| 195 | + disposeElement() { }, |
| 196 | + disposeTemplate() { } |
| 197 | + }; |
| 198 | + |
| 199 | + const treeFilter = new class { |
| 200 | + constructor() { |
| 201 | + this.pattern = null; |
| 202 | + let timeout; |
| 203 | + filter.oninput = () => { |
| 204 | + clearTimeout(timeout); |
| 205 | + timeout = setTimeout(() => this.updatePattern(), 300); |
| 206 | + }; |
| 207 | + } |
| 208 | + |
| 209 | + updatePattern() { |
| 210 | + if (!filter.value) { |
| 211 | + this.pattern = null; |
| 212 | + } else { |
| 213 | + this.pattern = new RegExp(filter.value, 'i'); |
| 214 | + } |
| 215 | + |
| 216 | + perf('refilter', () => tree.refilter()); |
| 217 | + } |
| 218 | + filter(el) { |
| 219 | + return (this.pattern ? this.pattern.test(el.name) : true) ? TreeVisibility.Visible : TreeVisibility.Recurse; |
| 220 | + } |
| 221 | + }; |
| 222 | + |
| 223 | + const dataSource = new class { |
| 224 | + getChildren(element) { |
| 225 | + return element.children || []; |
| 226 | + } |
| 227 | + }; |
| 228 | + |
| 229 | + const identityProvider = { |
| 230 | + getId(node) { |
| 231 | + return node.name; |
| 232 | + } |
| 233 | + }; |
| 234 | + |
| 235 | + const tree = new DataTree(container, delegate, [renderer], dataSource, { filter: treeFilter, identityProvider }); |
| 236 | + |
| 237 | + tree.input = { |
| 238 | + children: [ |
| 239 | + { name: 'A', children: [{ name: 'AA' }, { name: 'AB' }] }, |
| 240 | + { name: 'B', children: [{ name: 'BA', children: [{ name: 'BAA' }] }, { name: 'BB' }] }, |
| 241 | + { name: 'C' } |
| 242 | + ] |
| 243 | + }; |
| 244 | + |
| 245 | + return { tree, treeFilter }; |
| 246 | + } |
| 247 | + |
185 | 248 | switch (location.search) { |
186 | 249 | case '?problems': { |
187 | 250 | const { tree, treeFilter } = createIndexTree(); |
|
216 | 279 |
|
217 | 280 | break; |
218 | 281 | } |
| 282 | + case '?objectdata': { |
| 283 | + const { tree, treeFilter } = createDataTree(); |
| 284 | + |
| 285 | + expandall.onclick = () => perf('expand all', () => tree.expandAll()); |
| 286 | + collapseall.onclick = () => perf('collapse all', () => tree.collapseAll()); |
| 287 | + renderwidth.onclick = () => perf('renderwidth', () => tree.layoutWidth(Math.random())); |
| 288 | + refresh.onclick = () => perf('refresh', () => tree.refresh(null, true)); |
| 289 | + |
| 290 | + break; |
| 291 | + } |
219 | 292 | case '?height': { |
220 | 293 | const { tree, treeFilter } = createIndexTree({ supportDynamicHeights: true }); |
221 | 294 |
|
|
0 commit comments