OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2012 Google Inc. All rights reserved. | 2 * Copyright (C) 2012 Google Inc. All rights reserved. |
3 * | 3 * |
4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
5 * modification, are permitted provided that the following conditions are | 5 * modification, are permitted provided that the following conditions are |
6 * met: | 6 * met: |
7 * | 7 * |
8 * * Redistributions of source code must retain the above copyright | 8 * * Redistributions of source code must retain the above copyright |
9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
10 * * Redistributions in binary form must reproduce the above | 10 * * Redistributions in binary form must reproduce the above |
(...skipping 213 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
224 this.recursiveSortingEnter(); | 224 this.recursiveSortingEnter(); |
225 var children = this.allChildren(this.rootNode()); | 225 var children = this.allChildren(this.rootNode()); |
226 this.rootNode().removeChildren(); | 226 this.rootNode().removeChildren(); |
227 children.sort(sortFunction); | 227 children.sort(sortFunction); |
228 for (var i = 0, l = children.length; i < l; ++i) { | 228 for (var i = 0, l = children.length; i < l; ++i) { |
229 var child = children[i]; | 229 var child = children[i]; |
230 this.appendChildAfterSorting(child); | 230 this.appendChildAfterSorting(child); |
231 if (child.expanded) | 231 if (child.expanded) |
232 child.sort(); | 232 child.sort(); |
233 } | 233 } |
234 this.updateVisibleNodes(); | |
235 this.recursiveSortingLeave(); | 234 this.recursiveSortingLeave(); |
236 }, | 235 }, |
237 | 236 |
238 appendChildAfterSorting: function(child) | 237 appendChildAfterSorting: function(child) |
239 { | 238 { |
240 var revealed = child.revealed; | 239 var revealed = child.revealed; |
241 this.rootNode().appendChild(child); | 240 this.rootNode().appendChild(child); |
242 child.revealed = revealed; | 241 child.revealed = revealed; |
243 }, | 242 }, |
244 | 243 |
245 recursiveSortingEnter: function() | 244 recursiveSortingEnter: function() |
246 { | 245 { |
247 ++this._recursiveSortingDepth; | 246 ++this._recursiveSortingDepth; |
248 }, | 247 }, |
249 | 248 |
250 recursiveSortingLeave: function() | 249 recursiveSortingLeave: function() |
251 { | 250 { |
252 if (!this._recursiveSortingDepth) | 251 if (!this._recursiveSortingDepth) |
253 return; | 252 return; |
254 if (!--this._recursiveSortingDepth) | 253 if (--this._recursiveSortingDepth) |
255 this.dispatchEventToListeners("sorting complete"); | 254 return; |
| 255 this.updateVisibleNodes(); |
| 256 this.dispatchEventToListeners("sorting complete"); |
256 }, | 257 }, |
257 | 258 |
258 updateVisibleNodes: function() | 259 updateVisibleNodes: function() |
259 { | 260 { |
260 }, | 261 }, |
261 | 262 |
262 /** | 263 /** |
263 * @param {!WebInspector.DataGridNode} parent | 264 * @param {!WebInspector.DataGridNode} parent |
264 * @return {!Array.<!WebInspector.HeapSnapshotGridNode>} | 265 * @return {!Array.<!WebInspector.HeapSnapshotGridNode>} |
265 */ | 266 */ |
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
324 topLevelNodes: function() | 325 topLevelNodes: function() |
325 { | 326 { |
326 return this.allChildren(this.rootNode()); | 327 return this.allChildren(this.rootNode()); |
327 }, | 328 }, |
328 | 329 |
329 appendChildAfterSorting: function(child) | 330 appendChildAfterSorting: function(child) |
330 { | 331 { |
331 // Do nothing here, it will be added in updateVisibleNodes. | 332 // Do nothing here, it will be added in updateVisibleNodes. |
332 }, | 333 }, |
333 | 334 |
334 updateVisibleNodes: function() | 335 /** |
| 336 * @param {number=} scrollTop |
| 337 */ |
| 338 updateVisibleNodes: function(scrollTop) |
335 { | 339 { |
336 var scrollTop = this.scrollContainer.scrollTop; | 340 if (scrollTop === undefined) |
337 var children = this.topLevelNodes(); | 341 scrollTop = this.scrollContainer.scrollTop; |
| 342 var viewPortHeight = this.scrollContainer.offsetHeight; |
| 343 var selectedNode = this.selectedNode; |
| 344 this.rootNode().removeChildren(); |
338 | 345 |
339 var topPadding = 0; | 346 this._topPaddingHeight = 0; |
340 for (var i = 0; i < children.length; ++i) { | 347 this._bottomPaddingHeight = 0; |
341 if (children[i].revealed) { | |
342 var newTop = topPadding + children[i].nodeHeight(); | |
343 if (newTop > scrollTop) | |
344 break; | |
345 topPadding = newTop; | |
346 } | |
347 } | |
348 | 348 |
349 this._addVisibleNodes(this.rootNode(), i, scrollTop - topPadding, topPad
ding); | 349 this._addVisibleNodes(this.rootNode(), scrollTop, scrollTop + viewPortHe
ight); |
350 }, | |
351 | 350 |
352 /** | 351 this._topPadding.setHeight(this._topPaddingHeight); |
353 * @param {!WebInspector.DataGridNode} parentNode | 352 this._bottomPadding.setHeight(this._bottomPaddingHeight); |
354 * @param {number} firstVisibleNodeIndex | |
355 * @param {number} firstNodeHiddenHeight | |
356 * @param {number} topPadding | |
357 */ | |
358 _addVisibleNodes: function(parentNode, firstVisibleNodeIndex, firstNodeHidde
nHeight, topPadding) | |
359 { | |
360 var viewPortHeight = this.scrollContainer.offsetHeight; | |
361 | |
362 var children = this.allChildren(parentNode); | |
363 var selectedNode = this.selectedNode; | |
364 | |
365 parentNode.removeChildren(); | |
366 | |
367 // The height of the view port + invisible top part. | |
368 var heightToFill = viewPortHeight + firstNodeHiddenHeight; | |
369 var filledHeight = 0; | |
370 var i = firstVisibleNodeIndex; | |
371 while (i < children.length && filledHeight < heightToFill) { | |
372 if (children[i].revealed) { | |
373 parentNode.appendChild(children[i]); | |
374 filledHeight += children[i].nodeHeight(); | |
375 } | |
376 ++i; | |
377 } | |
378 | |
379 var bottomPadding = 0; | |
380 while (i < children.length) { | |
381 bottomPadding += children[i].nodeHeight(); | |
382 ++i; | |
383 } | |
384 | |
385 this._topPadding.setHeight(topPadding); | |
386 this._bottomPadding.setHeight(bottomPadding); | |
387 | 353 |
388 if (selectedNode) { | 354 if (selectedNode) { |
389 if (selectedNode.parent) { | 355 if (selectedNode.parent) { |
390 selectedNode.select(true); | 356 selectedNode.select(true); |
391 } else { | 357 } else { |
392 // Keep selection even if the node is not in the current viewpor
t. | 358 // Keep selection even if the node is not in the current viewpor
t. |
393 this.selectedNode = selectedNode; | 359 this.selectedNode = selectedNode; |
394 } | 360 } |
395 } | 361 } |
396 }, | 362 }, |
397 | 363 |
398 /** | 364 /** |
| 365 * @param {!WebInspector.DataGridNode} parentNode |
| 366 * @param {number} topBound |
| 367 * @param {number} bottomBound |
| 368 * @return {number} |
| 369 */ |
| 370 _addVisibleNodes: function(parentNode, topBound, bottomBound) |
| 371 { |
| 372 if (!parentNode.expanded) |
| 373 return 0; |
| 374 |
| 375 var children = this.allChildren(parentNode); |
| 376 var topPadding = 0; |
| 377 // Iterate over invisible nodes beyond the upper bound of viewport. |
| 378 // Do not insert them into the grid, but count their total height. |
| 379 for (var i = 0; i < children.length; ++i) { |
| 380 var newTop = topPadding + this._nodeHeight(children[i]); |
| 381 if (newTop > topBound) |
| 382 break; |
| 383 topPadding = newTop; |
| 384 } |
| 385 |
| 386 // Put visible nodes into the data grid. |
| 387 var position = topPadding; |
| 388 for (; i < children.length && position < bottomBound; ++i) { |
| 389 var child = children[i]; |
| 390 var hasChildren = child.hasChildren; |
| 391 child.removeChildren(); |
| 392 child.hasChildren = hasChildren; |
| 393 child.revealed = true; |
| 394 parentNode.appendChild(child); |
| 395 position += child.nodeSelfHeight(); |
| 396 position += this._addVisibleNodes(child, topBound - position, bottom
Bound - position); |
| 397 } |
| 398 |
| 399 // Count the invisible nodes beyond the bottom bound of the viewport. |
| 400 var bottomPadding = 0; |
| 401 for (; i < children.length; ++i) |
| 402 bottomPadding += this._nodeHeight(children[i]); |
| 403 |
| 404 this._topPaddingHeight += topPadding; |
| 405 this._bottomPaddingHeight += bottomPadding; |
| 406 return position + bottomPadding; |
| 407 }, |
| 408 |
| 409 /** |
| 410 * @param {!WebInspector.HeapSnapshotGridNode} node |
| 411 * @return {number} |
| 412 */ |
| 413 _nodeHeight: function(node) |
| 414 { |
| 415 if (!node.revealed) |
| 416 return 0; |
| 417 var result = node.nodeSelfHeight(); |
| 418 if (!node.expanded) |
| 419 return result; |
| 420 var children = this.allChildren(node); |
| 421 for (var i = 0; i < children.length; i++) |
| 422 result += this._nodeHeight(children[i]); |
| 423 return result; |
| 424 }, |
| 425 |
| 426 /** |
399 * @override | 427 * @override |
400 * @return {?Element} | 428 * @return {?Element} |
401 */ | 429 */ |
402 defaultAttachLocation: function() | 430 defaultAttachLocation: function() |
403 { | 431 { |
404 return this._bottomPadding.element; | 432 return this._bottomPadding.element; |
405 }, | 433 }, |
406 | 434 |
| 435 /** |
| 436 * @param {!WebInspector.HeapSnapshotGridNode} nodeToReveal |
| 437 */ |
407 _revealTopLevelNode: function(nodeToReveal) | 438 _revealTopLevelNode: function(nodeToReveal) |
408 { | 439 { |
409 var children = this.allChildren(this.rootNode()); | 440 var children = this.allChildren(this.rootNode()); |
410 | |
411 var topPadding = 0; | 441 var topPadding = 0; |
412 for (var i = 0; i < children.length; ++i) { | 442 for (var i = 0; i < children.length; ++i) { |
413 if (children[i] === nodeToReveal) | 443 if (children[i] === nodeToReveal) |
414 break; | 444 break; |
415 if (children[i].revealed) { | 445 if (children[i].revealed) { |
416 var newTop = topPadding + children[i].nodeHeight(); | 446 var newTop = topPadding + this._nodeHeight(children[i]); |
417 topPadding = newTop; | 447 topPadding = newTop; |
418 } | 448 } |
419 } | 449 } |
420 | 450 this.updateVisibleNodes(topPadding); |
421 this._addVisibleNodes(this.rootNode(), i, 0, topPadding); | |
422 }, | 451 }, |
423 | 452 |
424 /** | 453 /** |
425 * @param {!WebInspector.DataGridNode} parent | 454 * @param {!WebInspector.DataGridNode} parent |
426 * @return {!Array.<!WebInspector.DataGridNode>} | 455 * @return {!Array.<!WebInspector.HeapSnapshotGridNode>} |
427 */ | 456 */ |
428 allChildren: function(parent) | 457 allChildren: function(parent) |
429 { | 458 { |
430 return parent._allChildren || (parent._allChildren = []); | 459 return parent._allChildren || (parent._allChildren = []); |
431 }, | 460 }, |
432 | 461 |
433 /** | 462 /** |
434 * @param {!WebInspector.DataGridNode} parent | 463 * @param {!WebInspector.DataGridNode} parent |
435 * @param {!WebInspector.DataGridNode} node | 464 * @param {!WebInspector.DataGridNode} node |
436 */ | 465 */ |
(...skipping 663 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1100 urlElement.style.maxWidth = "75%"; | 1129 urlElement.style.maxWidth = "75%"; |
1101 cell.insertBefore(urlElement, cell.firstChild); | 1130 cell.insertBefore(urlElement, cell.firstChild); |
1102 } | 1131 } |
1103 | 1132 |
1104 return cell; | 1133 return cell; |
1105 }, | 1134 }, |
1106 | 1135 |
1107 __proto__: WebInspector.DataGridNode.prototype | 1136 __proto__: WebInspector.DataGridNode.prototype |
1108 } | 1137 } |
1109 | 1138 |
OLD | NEW |