Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(655)

Unified Diff: third_party/WebKit/Source/devtools/front_end/ui_lazy/ViewportDataGrid.js

Issue 2466123002: DevTools: reformat front-end code to match chromium style. (Closed)
Patch Set: all done Created 4 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: third_party/WebKit/Source/devtools/front_end/ui_lazy/ViewportDataGrid.js
diff --git a/third_party/WebKit/Source/devtools/front_end/ui_lazy/ViewportDataGrid.js b/third_party/WebKit/Source/devtools/front_end/ui_lazy/ViewportDataGrid.js
index b64c54c9f34cd14f3003502fcb59ab02ee874e09..f928eca6939f49cf0988181564f437fee906530a 100644
--- a/third_party/WebKit/Source/devtools/front_end/ui_lazy/ViewportDataGrid.js
+++ b/third_party/WebKit/Source/devtools/front_end/ui_lazy/ViewportDataGrid.js
@@ -1,24 +1,24 @@
// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-
/**
- * @constructor
- * @extends {WebInspector.DataGrid}
- * @param {!Array.<!WebInspector.DataGrid.ColumnDescriptor>} columnsArray
- * @param {function(!WebInspector.DataGridNode, string, string, string)=} editCallback
- * @param {function(!WebInspector.DataGridNode)=} deleteCallback
- * @param {function()=} refreshCallback
+ * @unrestricted
*/
-WebInspector.ViewportDataGrid = function(columnsArray, editCallback, deleteCallback, refreshCallback)
-{
- WebInspector.DataGrid.call(this, columnsArray, editCallback, deleteCallback, refreshCallback);
+WebInspector.ViewportDataGrid = class extends WebInspector.DataGrid {
+ /**
+ * @param {!Array.<!WebInspector.DataGrid.ColumnDescriptor>} columnsArray
+ * @param {function(!WebInspector.DataGridNode, string, string, string)=} editCallback
+ * @param {function(!WebInspector.DataGridNode)=} deleteCallback
+ * @param {function()=} refreshCallback
+ */
+ constructor(columnsArray, editCallback, deleteCallback, refreshCallback) {
+ super(columnsArray, editCallback, deleteCallback, refreshCallback);
this._onScrollBound = this._onScroll.bind(this);
- this._scrollContainer.addEventListener("scroll", this._onScrollBound, true);
+ this._scrollContainer.addEventListener('scroll', this._onScrollBound, true);
// This is not in setScrollContainer because mouse wheel needs to detect events on the content not the scrollbar itself.
- this._scrollContainer.addEventListener("mousewheel", this._onWheel.bind(this), true);
+ this._scrollContainer.addEventListener('mousewheel', this._onWheel.bind(this), true);
/** @type {!Array.<!WebInspector.ViewportDataGridNode>} */
this._visibleNodes = [];
/** @type {?Array.<!WebInspector.ViewportDataGridNode>} */
@@ -42,443 +42,423 @@ WebInspector.ViewportDataGrid = function(columnsArray, editCallback, deleteCallb
this._lastScrollTop = 0;
this.setRootNode(new WebInspector.ViewportDataGridNode());
+ }
+
+ /**
+ * @param {!Element} scrollContainer
+ */
+ setScrollContainer(scrollContainer) {
+ this._scrollContainer.removeEventListener('scroll', this._onScrollBound, true);
+ this._scrollContainer = scrollContainer;
+ this._scrollContainer.addEventListener('scroll', this._onScrollBound, true);
+ }
+
+ /**
+ * @override
+ */
+ onResize() {
+ if (this._stickToBottom && this._atBottom)
+ this._scrollContainer.scrollTop = this._scrollContainer.scrollHeight - this._scrollContainer.clientHeight;
+ this.scheduleUpdate();
+ super.onResize();
+ }
+
+ /**
+ * @param {boolean} stick
+ */
+ setStickToBottom(stick) {
+ this._stickToBottom = stick;
+ }
+
+ /**
+ * @param {?Event} event
+ */
+ _onWheel(event) {
+ this._wheelTarget = event.target ? event.target.enclosingNodeOrSelfWithNodeName('tr') : null;
+ }
+
+ /**
+ * @param {?Event} event
+ */
+ _onScroll(event) {
+ this._atBottom = this._scrollContainer.isScrolledToBottom();
+ if (this._lastScrollTop !== this._scrollContainer.scrollTop)
+ this.scheduleUpdate();
+ }
+
+ /**
+ * @protected
+ */
+ scheduleUpdateStructure() {
+ this._flatNodes = null;
+ this.scheduleUpdate();
+ }
+
+ /**
+ * @protected
+ */
+ scheduleUpdate() {
+ if (this._updateAnimationFrameId)
+ return;
+ this._updateAnimationFrameId = this.element.window().requestAnimationFrame(this._update.bind(this));
+ }
+
+ updateInstantlyForTests() {
+ if (!this._updateAnimationFrameId)
+ return;
+ this.element.window().cancelAnimationFrame(this._updateAnimationFrameId);
+ this._update();
+ }
+
+ /**
+ * @override
+ */
+ renderInline() {
+ this._inline = true;
+ super.renderInline();
+ this._update();
+ }
+
+ /**
+ * @return {!Array.<!WebInspector.ViewportDataGridNode>}
+ */
+ _flatNodesList() {
+ if (this._flatNodes)
+ return this._flatNodes;
+ var flatNodes = [];
+ var children = [this._rootNode.children];
+ var counters = [0];
+ var depth = 0;
+ while (depth >= 0) {
+ var node = children[depth][counters[depth]++];
+ if (!node) {
+ depth--;
+ continue;
+ }
+ flatNodes.push(node);
+ node.setDepth(depth);
+ if (node._expanded && node.children.length) {
+ depth++;
+ children[depth] = node.children;
+ counters[depth] = 0;
+ }
+ }
+ this._flatNodes = flatNodes;
+ return this._flatNodes;
+ }
+
+ /**
+ * @param {number} clientHeight
+ * @param {number} scrollTop
+ * @return {{topPadding: number, bottomPadding: number, contentHeight: number, visibleNodes: !Array.<!WebInspector.ViewportDataGridNode>, offset: number}}
+ */
+ _calculateVisibleNodes(clientHeight, scrollTop) {
+ var nodes = this._flatNodesList();
+ if (this._inline)
+ return {topPadding: 0, bottomPadding: 0, contentHeight: 0, visibleNodes: nodes, offset: 0};
+
+ var size = nodes.length;
+ var i = 0;
+ var y = 0;
+
+ for (; i < size && y + nodes[i].nodeSelfHeight() < scrollTop; ++i)
+ y += nodes[i].nodeSelfHeight();
+ var start = i;
+ var topPadding = y;
+
+ for (; i < size && y < scrollTop + clientHeight; ++i)
+ y += nodes[i].nodeSelfHeight();
+ var end = i;
+
+ var bottomPadding = 0;
+ for (; i < size; ++i)
+ bottomPadding += nodes[i].nodeSelfHeight();
+
+ return {
+ topPadding: topPadding,
+ bottomPadding: bottomPadding,
+ contentHeight: y - topPadding,
+ visibleNodes: nodes.slice(start, end),
+ offset: start
+ };
+ }
+
+ /**
+ * @return {number}
+ */
+ _contentHeight() {
+ var nodes = this._flatNodesList();
+ var result = 0;
+ for (var i = 0, size = nodes.length; i < size; ++i)
+ result += nodes[i].nodeSelfHeight();
+ return result;
+ }
+
+ _update() {
+ delete this._updateAnimationFrameId;
+
+ var clientHeight = this._scrollContainer.clientHeight;
+ var scrollTop = this._scrollContainer.scrollTop;
+ var currentScrollTop = scrollTop;
+ var maxScrollTop = Math.max(0, this._contentHeight() - clientHeight);
+ if (this._stickToBottom && this._atBottom)
+ scrollTop = maxScrollTop;
+ scrollTop = Math.min(maxScrollTop, scrollTop);
+ this._atBottom = scrollTop === maxScrollTop;
+
+ var viewportState = this._calculateVisibleNodes(clientHeight, scrollTop);
+ var visibleNodes = viewportState.visibleNodes;
+ var visibleNodesSet = new Set(visibleNodes);
+
+ if (this._hiddenWheelTarget && this._hiddenWheelTarget !== this._wheelTarget) {
+ this._hiddenWheelTarget.remove();
+ this._hiddenWheelTarget = null;
+ }
+
+ for (var i = 0; i < this._visibleNodes.length; ++i) {
+ var oldNode = this._visibleNodes[i];
+ if (!visibleNodesSet.has(oldNode) && oldNode.attached()) {
+ var element = oldNode._element;
+ if (element === this._wheelTarget)
+ this._hiddenWheelTarget = oldNode.abandonElement();
+ else
+ element.remove();
+ oldNode.wasDetached();
+ }
+ }
+
+ var previousElement = this._topFillerRow;
+ if (previousElement.nextSibling === this._hiddenWheelTarget)
+ previousElement = this._hiddenWheelTarget;
+ var tBody = this.dataTableBody;
+ var offset = viewportState.offset;
+ for (var i = 0; i < visibleNodes.length; ++i) {
+ var node = visibleNodes[i];
+ var element = node.element();
+ node.willAttach();
+ element.classList.toggle('odd', (offset + i) % 2 === 0);
+ tBody.insertBefore(element, previousElement.nextSibling);
+ previousElement = element;
+ }
+
+ this.setVerticalPadding(viewportState.topPadding, viewportState.bottomPadding);
+ this._lastScrollTop = scrollTop;
+ if (scrollTop !== currentScrollTop)
+ this._scrollContainer.scrollTop = scrollTop;
+ var contentFits =
+ viewportState.contentHeight <= clientHeight && viewportState.topPadding + viewportState.bottomPadding === 0;
+ if (contentFits !== this.element.classList.contains('data-grid-fits-viewport')) {
+ this.element.classList.toggle('data-grid-fits-viewport', contentFits);
+ this.updateWidths();
+ }
+ this._visibleNodes = visibleNodes;
+ this.dispatchEventToListeners(WebInspector.ViewportDataGrid.Events.ViewportCalculated);
+ }
+
+ /**
+ * @param {!WebInspector.ViewportDataGridNode} node
+ */
+ _revealViewportNode(node) {
+ var nodes = this._flatNodesList();
+ var index = nodes.indexOf(node);
+ if (index === -1)
+ return;
+ var fromY = 0;
+ for (var i = 0; i < index; ++i)
+ fromY += nodes[i].nodeSelfHeight();
+ var toY = fromY + node.nodeSelfHeight();
+
+ var scrollTop = this._scrollContainer.scrollTop;
+ if (scrollTop > fromY) {
+ scrollTop = fromY;
+ this._atBottom = false;
+ } else if (scrollTop + this._scrollContainer.offsetHeight < toY) {
+ scrollTop = toY - this._scrollContainer.offsetHeight;
+ }
+ this._scrollContainer.scrollTop = scrollTop;
+ }
};
WebInspector.ViewportDataGrid.Events = {
- ViewportCalculated: Symbol("ViewportCalculated")
-};
-
-WebInspector.ViewportDataGrid.prototype = {
- /**
- * @param {!Element} scrollContainer
- */
- setScrollContainer: function(scrollContainer)
- {
- this._scrollContainer.removeEventListener("scroll", this._onScrollBound, true);
- this._scrollContainer = scrollContainer;
- this._scrollContainer.addEventListener("scroll", this._onScrollBound, true);
- },
-
- /**
- * @override
- */
- onResize: function()
- {
- if (this._stickToBottom && this._atBottom)
- this._scrollContainer.scrollTop = this._scrollContainer.scrollHeight - this._scrollContainer.clientHeight;
- this.scheduleUpdate();
- WebInspector.DataGrid.prototype.onResize.call(this);
- },
-
- /**
- * @param {boolean} stick
- */
- setStickToBottom: function(stick)
- {
- this._stickToBottom = stick;
- },
-
- /**
- * @param {?Event} event
- */
- _onWheel: function(event)
- {
- this._wheelTarget = event.target ? event.target.enclosingNodeOrSelfWithNodeName("tr") : null;
- },
-
- /**
- * @param {?Event} event
- */
- _onScroll: function(event)
- {
- this._atBottom = this._scrollContainer.isScrolledToBottom();
- if (this._lastScrollTop !== this._scrollContainer.scrollTop)
- this.scheduleUpdate();
- },
-
- /**
- * @protected
- */
- scheduleUpdateStructure: function()
- {
- this._flatNodes = null;
- this.scheduleUpdate();
- },
-
- /**
- * @protected
- */
- scheduleUpdate: function()
- {
- if (this._updateAnimationFrameId)
- return;
- this._updateAnimationFrameId = this.element.window().requestAnimationFrame(this._update.bind(this));
- },
-
- updateInstantlyForTests: function()
- {
- if (!this._updateAnimationFrameId)
- return;
- this.element.window().cancelAnimationFrame(this._updateAnimationFrameId);
- this._update();
- },
-
- /**
- * @override
- */
- renderInline: function()
- {
- this._inline = true;
- WebInspector.DataGrid.prototype.renderInline.call(this);
- this._update();
- },
-
- /**
- * @return {!Array.<!WebInspector.ViewportDataGridNode>}
- */
- _flatNodesList: function()
- {
- if (this._flatNodes)
- return this._flatNodes;
- var flatNodes = [];
- var children = [this._rootNode.children];
- var counters = [0];
- var depth = 0;
- while (depth >= 0) {
- var node = children[depth][counters[depth]++];
- if (!node) {
- depth--;
- continue;
- }
- flatNodes.push(node);
- node.setDepth(depth);
- if (node._expanded && node.children.length) {
- depth++;
- children[depth] = node.children;
- counters[depth] = 0;
- }
- }
- this._flatNodes = flatNodes;
- return this._flatNodes;
- },
-
- /**
- * @param {number} clientHeight
- * @param {number} scrollTop
- * @return {{topPadding: number, bottomPadding: number, contentHeight: number, visibleNodes: !Array.<!WebInspector.ViewportDataGridNode>, offset: number}}
- */
- _calculateVisibleNodes: function(clientHeight, scrollTop)
- {
- var nodes = this._flatNodesList();
- if (this._inline)
- return {topPadding: 0, bottomPadding: 0, contentHeight: 0, visibleNodes: nodes, offset: 0};
-
- var size = nodes.length;
- var i = 0;
- var y = 0;
-
- for (; i < size && y + nodes[i].nodeSelfHeight() < scrollTop; ++i)
- y += nodes[i].nodeSelfHeight();
- var start = i;
- var topPadding = y;
-
- for (; i < size && y < scrollTop + clientHeight; ++i)
- y += nodes[i].nodeSelfHeight();
- var end = i;
-
- var bottomPadding = 0;
- for (; i < size; ++i)
- bottomPadding += nodes[i].nodeSelfHeight();
-
- return {topPadding: topPadding, bottomPadding: bottomPadding, contentHeight: y - topPadding, visibleNodes: nodes.slice(start, end), offset: start};
- },
-
- /**
- * @return {number}
- */
- _contentHeight: function()
- {
- var nodes = this._flatNodesList();
- var result = 0;
- for (var i = 0, size = nodes.length; i < size; ++i)
- result += nodes[i].nodeSelfHeight();
- return result;
- },
-
- _update: function()
- {
- delete this._updateAnimationFrameId;
-
- var clientHeight = this._scrollContainer.clientHeight;
- var scrollTop = this._scrollContainer.scrollTop;
- var currentScrollTop = scrollTop;
- var maxScrollTop = Math.max(0, this._contentHeight() - clientHeight);
- if (this._stickToBottom && this._atBottom)
- scrollTop = maxScrollTop;
- scrollTop = Math.min(maxScrollTop, scrollTop);
- this._atBottom = scrollTop === maxScrollTop;
-
- var viewportState = this._calculateVisibleNodes(clientHeight, scrollTop);
- var visibleNodes = viewportState.visibleNodes;
- var visibleNodesSet = new Set(visibleNodes);
-
- if (this._hiddenWheelTarget && this._hiddenWheelTarget !== this._wheelTarget) {
- this._hiddenWheelTarget.remove();
- this._hiddenWheelTarget = null;
- }
-
- for (var i = 0; i < this._visibleNodes.length; ++i) {
- var oldNode = this._visibleNodes[i];
- if (!visibleNodesSet.has(oldNode) && oldNode.attached()) {
- var element = oldNode._element;
- if (element === this._wheelTarget)
- this._hiddenWheelTarget = oldNode.abandonElement();
- else
- element.remove();
- oldNode.wasDetached();
- }
- }
-
- var previousElement = this._topFillerRow;
- if (previousElement.nextSibling === this._hiddenWheelTarget)
- previousElement = this._hiddenWheelTarget;
- var tBody = this.dataTableBody;
- var offset = viewportState.offset;
- for (var i = 0; i < visibleNodes.length; ++i) {
- var node = visibleNodes[i];
- var element = node.element();
- node.willAttach();
- element.classList.toggle("odd", (offset + i) % 2 === 0);
- tBody.insertBefore(element, previousElement.nextSibling);
- previousElement = element;
- }
-
- this.setVerticalPadding(viewportState.topPadding, viewportState.bottomPadding);
- this._lastScrollTop = scrollTop;
- if (scrollTop !== currentScrollTop)
- this._scrollContainer.scrollTop = scrollTop;
- var contentFits = viewportState.contentHeight <= clientHeight && viewportState.topPadding + viewportState.bottomPadding === 0;
- if (contentFits !== this.element.classList.contains("data-grid-fits-viewport")) {
- this.element.classList.toggle("data-grid-fits-viewport", contentFits);
- this.updateWidths();
- }
- this._visibleNodes = visibleNodes;
- this.dispatchEventToListeners(WebInspector.ViewportDataGrid.Events.ViewportCalculated);
- },
-
- /**
- * @param {!WebInspector.ViewportDataGridNode} node
- */
- _revealViewportNode: function(node)
- {
- var nodes = this._flatNodesList();
- var index = nodes.indexOf(node);
- if (index === -1)
- return;
- var fromY = 0;
- for (var i = 0; i < index; ++i)
- fromY += nodes[i].nodeSelfHeight();
- var toY = fromY + node.nodeSelfHeight();
-
- var scrollTop = this._scrollContainer.scrollTop;
- if (scrollTop > fromY) {
- scrollTop = fromY;
- this._atBottom = false;
- } else if (scrollTop + this._scrollContainer.offsetHeight < toY) {
- scrollTop = toY - this._scrollContainer.offsetHeight;
- }
- this._scrollContainer.scrollTop = scrollTop;
- },
-
- __proto__: WebInspector.DataGrid.prototype
+ ViewportCalculated: Symbol('ViewportCalculated')
};
/**
- * @constructor
- * @extends {WebInspector.DataGridNode}
- * @param {?Object.<string, *>=} data
- * @param {boolean=} hasChildren
+ * @unrestricted
*/
-WebInspector.ViewportDataGridNode = function(data, hasChildren)
-{
- WebInspector.DataGridNode.call(this, data, hasChildren);
+WebInspector.ViewportDataGridNode = class extends WebInspector.DataGridNode {
+ /**
+ * @param {?Object.<string, *>=} data
+ * @param {boolean=} hasChildren
+ */
+ constructor(data, hasChildren) {
+ super(data, hasChildren);
/** @type {boolean} */
this._stale = false;
-};
-
-WebInspector.ViewportDataGridNode.prototype = {
- /**
- * @override
- * @return {!Element}
- */
- element: function()
- {
- if (!this._element) {
- this.createElement();
- this.createCells();
- this._stale = false;
- }
-
- if (this._stale) {
- this.createCells();
- this._stale = false;
- }
-
- return /** @type {!Element} */ (this._element);
- },
-
- /**
- * @param {number} depth
- */
- setDepth: function(depth)
- {
- this._depth = depth;
- },
-
- /**
- * @override
- * @param {!WebInspector.DataGridNode} child
- * @param {number} index
- */
- insertChild: function(child, index)
- {
- if (child.parent === this) {
- var currentIndex = this.children.indexOf(child);
- if (currentIndex < 0)
- console.assert(false, "Inconsistent DataGrid state");
- if (currentIndex === index)
- return;
- if (currentIndex < index)
- --index;
- }
- child.remove();
- child.parent = this;
- child.dataGrid = this.dataGrid;
- if (!this.children.length)
- this.hasChildren = true;
- this.children.splice(index, 0, child);
- child.recalculateSiblings(index);
- if (this._expanded)
- this.dataGrid.scheduleUpdateStructure();
- },
-
- /**
- * @override
- * @param {!WebInspector.DataGridNode} child
- */
- removeChild: function(child)
- {
- if (this.dataGrid)
- this.dataGrid.updateSelectionBeforeRemoval(child, false);
- if (child.previousSibling)
- child.previousSibling.nextSibling = child.nextSibling;
- if (child.nextSibling)
- child.nextSibling.previousSibling = child.previousSibling;
- if (child.parent !== this)
- throw "removeChild: Node is not a child of this node.";
-
- child._unlink();
- this.children.remove(child, true);
- if (!this.children.length)
- this.hasChildren = false;
- if (this._expanded)
- this.dataGrid.scheduleUpdateStructure();
- },
-
- /**
- * @override
- */
- removeChildren: function()
- {
- if (this.dataGrid)
- this.dataGrid.updateSelectionBeforeRemoval(this, true);
- for (var i = 0; i < this.children.length; ++i)
- this.children[i]._unlink();
- this.children = [];
-
- if (this._expanded)
- this.dataGrid.scheduleUpdateStructure();
- },
-
- _unlink: function()
- {
- if (this.attached()) {
- this._element.remove();
- this.wasDetached();
- }
- this.dataGrid = null;
- this.parent = null;
- this.nextSibling = null;
- this.previousSibling = null;
- },
-
- /**
- * @override
- */
- collapse: function()
- {
- if (!this._expanded)
- return;
- this._expanded = false;
- if (this._element)
- this._element.classList.remove("expanded");
- this.dataGrid.scheduleUpdateStructure();
- },
-
- /**
- * @override
- */
- expand: function()
- {
- if (this._expanded)
- return;
- WebInspector.DataGridNode.prototype.expand.call(this);
- this.dataGrid.scheduleUpdateStructure();
- },
-
- /**
- * @protected
- */
- willAttach: function() { },
-
- /**
- * @protected
- * @return {boolean}
- */
- attached: function()
- {
- return !!(this.dataGrid && this._element && this._element.parentElement);
- },
-
- /**
- * @override
- */
- refresh: function()
- {
- if (this.attached()) {
- this._stale = true;
- this.dataGrid.scheduleUpdate();
- } else {
- this._element = null;
- }
- },
-
- /**
- * @return {?Element}
- */
- abandonElement: function()
- {
- var result = this._element;
- if (result)
- result.style.display = "none";
- this._element = null;
- return result;
- },
-
- reveal: function()
- {
- this.dataGrid._revealViewportNode(this);
- },
-
- __proto__: WebInspector.DataGridNode.prototype
+ }
+
+ /**
+ * @override
+ * @return {!Element}
+ */
+ element() {
+ if (!this._element) {
+ this.createElement();
+ this.createCells();
+ this._stale = false;
+ }
+
+ if (this._stale) {
+ this.createCells();
+ this._stale = false;
+ }
+
+ return /** @type {!Element} */ (this._element);
+ }
+
+ /**
+ * @param {number} depth
+ */
+ setDepth(depth) {
+ this._depth = depth;
+ }
+
+ /**
+ * @override
+ * @param {!WebInspector.DataGridNode} child
+ * @param {number} index
+ */
+ insertChild(child, index) {
+ if (child.parent === this) {
+ var currentIndex = this.children.indexOf(child);
+ if (currentIndex < 0)
+ console.assert(false, 'Inconsistent DataGrid state');
+ if (currentIndex === index)
+ return;
+ if (currentIndex < index)
+ --index;
+ }
+ child.remove();
+ child.parent = this;
+ child.dataGrid = this.dataGrid;
+ if (!this.children.length)
+ this.hasChildren = true;
+ this.children.splice(index, 0, child);
+ child.recalculateSiblings(index);
+ if (this._expanded)
+ this.dataGrid.scheduleUpdateStructure();
+ }
+
+ /**
+ * @override
+ * @param {!WebInspector.DataGridNode} child
+ */
+ removeChild(child) {
+ if (this.dataGrid)
+ this.dataGrid.updateSelectionBeforeRemoval(child, false);
+ if (child.previousSibling)
+ child.previousSibling.nextSibling = child.nextSibling;
+ if (child.nextSibling)
+ child.nextSibling.previousSibling = child.previousSibling;
+ if (child.parent !== this)
+ throw 'removeChild: Node is not a child of this node.';
+
+ child._unlink();
+ this.children.remove(child, true);
+ if (!this.children.length)
+ this.hasChildren = false;
+ if (this._expanded)
+ this.dataGrid.scheduleUpdateStructure();
+ }
+
+ /**
+ * @override
+ */
+ removeChildren() {
+ if (this.dataGrid)
+ this.dataGrid.updateSelectionBeforeRemoval(this, true);
+ for (var i = 0; i < this.children.length; ++i)
+ this.children[i]._unlink();
+ this.children = [];
+
+ if (this._expanded)
+ this.dataGrid.scheduleUpdateStructure();
+ }
+
+ _unlink() {
+ if (this.attached()) {
+ this._element.remove();
+ this.wasDetached();
+ }
+ this.dataGrid = null;
+ this.parent = null;
+ this.nextSibling = null;
+ this.previousSibling = null;
+ }
+
+ /**
+ * @override
+ */
+ collapse() {
+ if (!this._expanded)
+ return;
+ this._expanded = false;
+ if (this._element)
+ this._element.classList.remove('expanded');
+ this.dataGrid.scheduleUpdateStructure();
+ }
+
+ /**
+ * @override
+ */
+ expand() {
+ if (this._expanded)
+ return;
+ super.expand();
+ this.dataGrid.scheduleUpdateStructure();
+ }
+
+ /**
+ * @protected
+ */
+ willAttach() {
+ }
+
+ /**
+ * @protected
+ * @return {boolean}
+ */
+ attached() {
+ return !!(this.dataGrid && this._element && this._element.parentElement);
+ }
+
+ /**
+ * @override
+ */
+ refresh() {
+ if (this.attached()) {
+ this._stale = true;
+ this.dataGrid.scheduleUpdate();
+ } else {
+ this._element = null;
+ }
+ }
+
+ /**
+ * @return {?Element}
+ */
+ abandonElement() {
+ var result = this._element;
+ if (result)
+ result.style.display = 'none';
+ this._element = null;
+ return result;
+ }
+
+ /**
+ * @override
+ */
+ reveal() {
+ this.dataGrid._revealViewportNode(this);
+ }
};

Powered by Google App Engine
This is Rietveld 408576698