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

Unified Diff: third_party/WebKit/Source/devtools/front_end/ui_lazy/DataGrid.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/DataGrid.js
diff --git a/third_party/WebKit/Source/devtools/front_end/ui_lazy/DataGrid.js b/third_party/WebKit/Source/devtools/front_end/ui_lazy/DataGrid.js
index 3b5f34bf7d85e0f2f98a8c1ae53885f857af44cd..e97377aaa305b92f4cfacd87268bb5176ac380ce 100644
--- a/third_party/WebKit/Source/devtools/front_end/ui_lazy/DataGrid.js
+++ b/third_party/WebKit/Source/devtools/front_end/ui_lazy/DataGrid.js
@@ -22,22 +22,23 @@
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-
/**
- * @constructor
- * @extends {WebInspector.Object}
- * @param {!Array.<!WebInspector.DataGrid.ColumnDescriptor>} columnsArray
- * @param {function(!WebInspector.DataGridNode, string, string, string)=} editCallback
- * @param {function(!WebInspector.DataGridNode)=} deleteCallback
- * @param {function()=} refreshCallback
+ * @unrestricted
*/
-WebInspector.DataGrid = function(columnsArray, editCallback, deleteCallback, refreshCallback)
-{
- this.element = createElementWithClass("div", "data-grid");
- WebInspector.appendStyle(this.element, "ui_lazy/dataGrid.css");
+WebInspector.DataGrid = class extends WebInspector.Object {
+ /**
+ * @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();
+ this.element = createElementWithClass('div', 'data-grid');
+ WebInspector.appendStyle(this.element, 'ui_lazy/dataGrid.css');
this.element.tabIndex = 0;
- this.element.addEventListener("keydown", this._keyDown.bind(this), false);
- this.element.addEventListener("contextmenu", this._contextMenu.bind(this), true);
+ this.element.addEventListener('keydown', this._keyDown.bind(this), false);
+ this.element.addEventListener('contextmenu', this._contextMenu.bind(this), true);
/** @type {function(!WebInspector.DataGridNode, string, string, string)|undefined} */
this._editCallback = editCallback;
@@ -46,22 +47,22 @@ WebInspector.DataGrid = function(columnsArray, editCallback, deleteCallback, ref
/** @type {function()|undefined} */
this._refreshCallback = refreshCallback;
- var headerContainer = this.element.createChild("div", "header-container");
+ var headerContainer = this.element.createChild('div', 'header-container');
/** @type {!Element} */
- this._headerTable = headerContainer.createChild("table", "header");
+ this._headerTable = headerContainer.createChild('table', 'header');
/** @type {!Object.<string, !Element>} */
this._headerTableHeaders = {};
/** @type {!Element} */
- this._scrollContainer = this.element.createChild("div", "data-container");
+ this._scrollContainer = this.element.createChild('div', 'data-container');
/** @type {!Element} */
- this._dataTable = this._scrollContainer.createChild("table", "data");
+ this._dataTable = this._scrollContainer.createChild('table', 'data');
// FIXME: Add a createCallback which is different from editCallback and has different
// behavior when creating a new node.
if (editCallback)
- this._dataTable.addEventListener("dblclick", this._ondblclick.bind(this), false);
- this._dataTable.addEventListener("mousedown", this._mouseDownInDataTable.bind(this));
- this._dataTable.addEventListener("click", this._clickInDataTable.bind(this), true);
+ this._dataTable.addEventListener('dblclick', this._ondblclick.bind(this), false);
+ this._dataTable.addEventListener('mousedown', this._mouseDownInDataTable.bind(this));
+ this._dataTable.addEventListener('click', this._clickInDataTable.bind(this), true);
/** @type {boolean} */
this._inline = false;
@@ -79,23 +80,23 @@ WebInspector.DataGrid = function(columnsArray, editCallback, deleteCallback, ref
this._cellClass = null;
/** @type {!Element} */
- this._headerTableColumnGroup = this._headerTable.createChild("colgroup");
+ this._headerTableColumnGroup = this._headerTable.createChild('colgroup');
/** @type {!Element} */
- this._headerTableBody = this._headerTable.createChild("tbody");
+ this._headerTableBody = this._headerTable.createChild('tbody');
/** @type {!Element} */
- this._headerRow = this._headerTableBody.createChild("tr");
+ this._headerRow = this._headerTableBody.createChild('tr');
/** @type {!Element} */
- this._dataTableColumnGroup = this._dataTable.createChild("colgroup");
+ this._dataTableColumnGroup = this._dataTable.createChild('colgroup');
/**
* @protected
* @type {!Element}
*/
- this.dataTableBody = this._dataTable.createChild("tbody");
+ this.dataTableBody = this._dataTable.createChild('tbody');
/** @type {!Element} */
- this._topFillerRow = this.dataTableBody.createChild("tr", "data-grid-filler-row revealed");
+ this._topFillerRow = this.dataTableBody.createChild('tr', 'data-grid-filler-row revealed');
/** @type {!Element} */
- this._bottomFillerRow = this.dataTableBody.createChild("tr", "data-grid-filler-row revealed");
+ this._bottomFillerRow = this.dataTableBody.createChild('tr', 'data-grid-filler-row revealed');
this.setVerticalPadding(0, 0);
this._refreshHeader();
@@ -122,6 +123,1025 @@ WebInspector.DataGrid = function(columnsArray, editCallback, deleteCallback, ref
this._headerContextMenuCallback = null;
/** @type {?function(!WebInspector.ContextMenu, !WebInspector.DataGridNode)} */
this._rowContextMenuCallback = null;
+ }
+
+ /**
+ * @return {!Element}
+ */
+ headerTableBody() {
+ return this._headerTableBody;
+ }
+
+ /**
+ * @param {!WebInspector.DataGrid.ColumnDescriptor} column
+ * @param {number=} position
+ */
+ _innerAddColumn(column, position) {
+ var columnId = column.id;
+ if (columnId in this._columns)
+ this._innerRemoveColumn(columnId);
+
+ if (position === undefined)
+ position = this._columnsArray.length;
+
+ this._columnsArray.splice(position, 0, column);
+ this._columns[columnId] = column;
+ if (column.disclosure)
+ this.disclosureColumnId = columnId;
+
+ var cell = createElement('th');
+ cell.className = columnId + '-column';
+ cell[WebInspector.DataGrid._columnIdSymbol] = columnId;
+ this._headerTableHeaders[columnId] = cell;
+
+ var div = createElement('div');
+ if (column.titleDOMFragment)
+ div.appendChild(column.titleDOMFragment);
+ else
+ div.textContent = column.title;
+ cell.appendChild(div);
+
+ if (column.sort) {
+ cell.classList.add(column.sort);
+ this._sortColumnCell = cell;
+ }
+
+ if (column.sortable) {
+ cell.addEventListener('click', this._clickInHeaderCell.bind(this), false);
+ cell.classList.add('sortable');
+ cell.createChild('div', 'sort-order-icon-container').createChild('div', 'sort-order-icon');
+ }
+ }
+
+ /**
+ * @param {!WebInspector.DataGrid.ColumnDescriptor} column
+ * @param {number=} position
+ */
+ addColumn(column, position) {
+ this._innerAddColumn(column, position);
+ }
+
+ /**
+ * @param {string} columnId
+ */
+ _innerRemoveColumn(columnId) {
+ var column = this._columns[columnId];
+ if (!column)
+ return;
+ delete this._columns[columnId];
+ var index = this._columnsArray.findIndex(columnConfig => columnConfig.id === columnId);
+ this._columnsArray.splice(index, 1);
+ var cell = this._headerTableHeaders[columnId];
+ if (cell.parentElement)
+ cell.parentElement.removeChild(cell);
+ delete this._headerTableHeaders[columnId];
+ }
+
+ /**
+ * @param {string} columnId
+ */
+ removeColumn(columnId) {
+ this._innerRemoveColumn(columnId);
+ }
+
+ /**
+ * @param {string} cellClass
+ */
+ setCellClass(cellClass) {
+ this._cellClass = cellClass;
+ }
+
+ _refreshHeader() {
+ this._headerTableColumnGroup.removeChildren();
+ this._dataTableColumnGroup.removeChildren();
+ this._headerRow.removeChildren();
+ this._topFillerRow.removeChildren();
+ this._bottomFillerRow.removeChildren();
+
+ for (var i = 0; i < this._visibleColumnsArray.length; ++i) {
+ var column = this._visibleColumnsArray[i];
+ var columnId = column.id;
+ var headerColumn = this._headerTableColumnGroup.createChild('col');
+ var dataColumn = this._dataTableColumnGroup.createChild('col');
+ if (column.width) {
+ headerColumn.style.width = column.width;
+ dataColumn.style.width = column.width;
+ }
+ this._headerRow.appendChild(this._headerTableHeaders[columnId]);
+ this._topFillerRow.createChild('td', 'top-filler-td');
+ this._bottomFillerRow.createChild('td', 'bottom-filler-td')[WebInspector.DataGrid._columnIdSymbol] = columnId;
+ }
+
+ this._headerRow.createChild('th', 'corner');
+ this._topFillerRow.createChild('td', 'corner').classList.add('top-filler-td');
+ this._bottomFillerRow.createChild('td', 'corner').classList.add('bottom-filler-td');
+ this._headerTableColumnGroup.createChild('col', 'corner');
+ this._dataTableColumnGroup.createChild('col', 'corner');
+ }
+
+ /**
+ * @param {number} top
+ * @param {number} bottom
+ * @protected
+ */
+ setVerticalPadding(top, bottom) {
+ this._topFillerRow.style.height = top + 'px';
+ if (top || bottom)
+ this._bottomFillerRow.style.height = bottom + 'px';
+ else
+ this._bottomFillerRow.style.height = 'auto';
+ this.dispatchEventToListeners(WebInspector.DataGrid.Events.PaddingChanged);
+ }
+
+ /**
+ * @param {!WebInspector.DataGridNode} rootNode
+ * @protected
+ */
+ setRootNode(rootNode) {
+ if (this._rootNode) {
+ this._rootNode.removeChildren();
+ this._rootNode.dataGrid = null;
+ this._rootNode._isRoot = false;
+ }
+ /** @type {!WebInspector.DataGridNode} */
+ this._rootNode = rootNode;
+ rootNode._isRoot = true;
+ rootNode.hasChildren = false;
+ rootNode._expanded = true;
+ rootNode._revealed = true;
+ rootNode.selectable = false;
+ rootNode.dataGrid = this;
+ }
+
+ /**
+ * @return {!WebInspector.DataGridNode}
+ */
+ rootNode() {
+ return this._rootNode;
+ }
+
+ /**
+ * @param {!Event} event
+ */
+ _ondblclick(event) {
+ if (this._editing || this._editingNode)
+ return;
+
+ var columnId = this.columnIdFromNode(/** @type {!Node} */ (event.target));
+ if (!columnId || !this._columns[columnId].editable)
+ return;
+ this._startEditing(/** @type {!Node} */ (event.target));
+ }
+
+ /**
+ * @param {!WebInspector.DataGridNode} node
+ * @param {number} cellIndex
+ */
+ _startEditingColumnOfDataGridNode(node, cellIndex) {
+ this._editing = true;
+ /** @type {?WebInspector.DataGridNode} */
+ this._editingNode = node;
+ this._editingNode.select();
+
+ var element = this._editingNode._element.children[cellIndex];
+ WebInspector.InplaceEditor.startEditing(element, this._startEditingConfig(element));
+ element.getComponentSelection().setBaseAndExtent(element, 0, element, 1);
+ }
+
+ /**
+ * @param {!Node} target
+ */
+ _startEditing(target) {
+ var element = /** @type {?Element} */ (target.enclosingNodeOrSelfWithNodeName('td'));
+ if (!element)
+ return;
+
+ this._editingNode = this.dataGridNodeFromNode(target);
+ if (!this._editingNode) {
+ if (!this.creationNode)
+ return;
+ this._editingNode = this.creationNode;
+ }
+
+ // Force editing the 1st column when editing the creation node
+ if (this._editingNode.isCreationNode) {
+ this._startEditingColumnOfDataGridNode(this._editingNode, this._nextEditableColumn(-1));
+ return;
+ }
+
+ this._editing = true;
+ WebInspector.InplaceEditor.startEditing(element, this._startEditingConfig(element));
+
+ element.getComponentSelection().setBaseAndExtent(element, 0, element, 1);
+ }
+
+ renderInline() {
+ this.element.classList.add('inline');
+ this._cornerWidth = 0;
+ this._inline = true;
+ this.updateWidths();
+ }
+
+ /**
+ * @param {!Element} element
+ * @return {!WebInspector.InplaceEditor.Config}
+ */
+ _startEditingConfig(element) {
+ return new WebInspector.InplaceEditor.Config(
+ this._editingCommitted.bind(this), this._editingCancelled.bind(this), element.textContent);
+ }
+
+ /**
+ * @param {!Element} element
+ * @param {string} newText
+ * @param {string} oldText
+ * @param {string|undefined} context
+ * @param {string} moveDirection
+ */
+ _editingCommitted(element, newText, oldText, context, moveDirection) {
+ var columnId = this.columnIdFromNode(element);
+ if (!columnId) {
+ this._editingCancelled(element);
+ return;
+ }
+ var column = this._columns[columnId];
+ var cellIndex = this._visibleColumnsArray.indexOf(column);
+ var textBeforeEditing = /** @type {string} */ (this._editingNode.data[columnId]);
+ var currentEditingNode = this._editingNode;
+
+ /**
+ * @param {boolean} wasChange
+ * @this {WebInspector.DataGrid}
+ */
+ function moveToNextIfNeeded(wasChange) {
+ if (!moveDirection)
+ return;
+
+ if (moveDirection === 'forward') {
+ var firstEditableColumn = this._nextEditableColumn(-1);
+ if (currentEditingNode.isCreationNode && cellIndex === firstEditableColumn && !wasChange)
+ return;
+
+ var nextEditableColumn = this._nextEditableColumn(cellIndex);
+ if (nextEditableColumn !== -1) {
+ this._startEditingColumnOfDataGridNode(currentEditingNode, nextEditableColumn);
+ return;
+ }
+
+ var nextDataGridNode = currentEditingNode.traverseNextNode(true, null, true);
+ if (nextDataGridNode) {
+ this._startEditingColumnOfDataGridNode(nextDataGridNode, firstEditableColumn);
+ return;
+ }
+ if (currentEditingNode.isCreationNode && wasChange) {
+ this.addCreationNode(false);
+ this._startEditingColumnOfDataGridNode(this.creationNode, firstEditableColumn);
+ return;
+ }
+ return;
+ }
+
+ if (moveDirection === 'backward') {
+ var prevEditableColumn = this._nextEditableColumn(cellIndex, true);
+ if (prevEditableColumn !== -1) {
+ this._startEditingColumnOfDataGridNode(currentEditingNode, prevEditableColumn);
+ return;
+ }
+
+ var lastEditableColumn = this._nextEditableColumn(this._visibleColumnsArray.length, true);
+ var nextDataGridNode = currentEditingNode.traversePreviousNode(true, true);
+ if (nextDataGridNode)
+ this._startEditingColumnOfDataGridNode(nextDataGridNode, lastEditableColumn);
+ return;
+ }
+ }
+
+ if (textBeforeEditing === newText) {
+ this._editingCancelled(element);
+ moveToNextIfNeeded.call(this, false);
+ return;
+ }
+
+ // Update the text in the datagrid that we typed
+ this._editingNode.data[columnId] = newText;
+
+ // Make the callback - expects an editing node (table row), the column number that is being edited,
+ // the text that used to be there, and the new text.
+ this._editCallback(this._editingNode, columnId, textBeforeEditing, newText);
+
+ if (this._editingNode.isCreationNode)
+ this.addCreationNode(false);
+
+ this._editingCancelled(element);
+ moveToNextIfNeeded.call(this, true);
+ }
+
+ /**
+ * @param {!Element} element
+ */
+ _editingCancelled(element) {
+ this._editing = false;
+ this._editingNode = null;
+ }
+
+ /**
+ * @param {number} cellIndex
+ * @param {boolean=} moveBackward
+ * @return {number}
+ */
+ _nextEditableColumn(cellIndex, moveBackward) {
+ var increment = moveBackward ? -1 : 1;
+ var columns = this._visibleColumnsArray;
+ for (var i = cellIndex + increment; (i >= 0) && (i < columns.length); i += increment) {
+ if (columns[i].editable)
+ return i;
+ }
+ return -1;
+ }
+
+ /**
+ * @return {?string}
+ */
+ sortColumnId() {
+ if (!this._sortColumnCell)
+ return null;
+ return this._sortColumnCell[WebInspector.DataGrid._columnIdSymbol];
+ }
+
+ /**
+ * @return {?string}
+ */
+ sortOrder() {
+ if (!this._sortColumnCell || this._sortColumnCell.classList.contains(WebInspector.DataGrid.Order.Ascending))
+ return WebInspector.DataGrid.Order.Ascending;
+ if (this._sortColumnCell.classList.contains(WebInspector.DataGrid.Order.Descending))
+ return WebInspector.DataGrid.Order.Descending;
+ return null;
+ }
+
+ /**
+ * @return {boolean}
+ */
+ isSortOrderAscending() {
+ return !this._sortColumnCell || this._sortColumnCell.classList.contains(WebInspector.DataGrid.Order.Ascending);
+ }
+
+ /**
+ * @param {!Array.<number>} widths
+ * @param {number} minPercent
+ * @param {number=} maxPercent
+ * @return {!Array.<number>}
+ */
+ _autoSizeWidths(widths, minPercent, maxPercent) {
+ if (minPercent)
+ minPercent = Math.min(minPercent, Math.floor(100 / widths.length));
+ var totalWidth = 0;
+ for (var i = 0; i < widths.length; ++i)
+ totalWidth += widths[i];
+ var totalPercentWidth = 0;
+ for (var i = 0; i < widths.length; ++i) {
+ var width = Math.round(100 * widths[i] / totalWidth);
+ if (minPercent && width < minPercent)
+ width = minPercent;
+ else if (maxPercent && width > maxPercent)
+ width = maxPercent;
+ totalPercentWidth += width;
+ widths[i] = width;
+ }
+ var recoupPercent = totalPercentWidth - 100;
+
+ while (minPercent && recoupPercent > 0) {
+ for (var i = 0; i < widths.length; ++i) {
+ if (widths[i] > minPercent) {
+ --widths[i];
+ --recoupPercent;
+ if (!recoupPercent)
+ break;
+ }
+ }
+ }
+
+ while (maxPercent && recoupPercent < 0) {
+ for (var i = 0; i < widths.length; ++i) {
+ if (widths[i] < maxPercent) {
+ ++widths[i];
+ ++recoupPercent;
+ if (!recoupPercent)
+ break;
+ }
+ }
+ }
+
+ return widths;
+ }
+
+ /**
+ * @param {number} minPercent
+ * @param {number=} maxPercent
+ * @param {number=} maxDescentLevel
+ */
+ autoSizeColumns(minPercent, maxPercent, maxDescentLevel) {
+ var widths = [];
+ for (var i = 0; i < this._columnsArray.length; ++i)
+ widths.push((this._columnsArray[i].title || '').length);
+
+ maxDescentLevel = maxDescentLevel || 0;
+ var children = this._enumerateChildren(this._rootNode, [], maxDescentLevel + 1);
+ for (var i = 0; i < children.length; ++i) {
+ var node = children[i];
+ for (var j = 0; j < this._columnsArray.length; ++j) {
+ var text = node.data[this._columnsArray[j].id];
+ if (text.length > widths[j])
+ widths[j] = text.length;
+ }
+ }
+
+ widths = this._autoSizeWidths(widths, minPercent, maxPercent);
+
+ for (var i = 0; i < this._columnsArray.length; ++i)
+ this._columnsArray[i].weight = widths[i];
+ this._columnWidthsInitialized = false;
+ this.updateWidths();
+ }
+
+ /**
+ * @param {!WebInspector.DataGridNode} rootNode
+ * @param {!Array<!WebInspector.DataGridNode>} result
+ * @param {number} maxLevel
+ * @return {!Array<!WebInspector.DataGridNode>}
+ */
+ _enumerateChildren(rootNode, result, maxLevel) {
+ if (!rootNode._isRoot)
+ result.push(rootNode);
+ if (!maxLevel)
+ return [];
+ for (var i = 0; i < rootNode.children.length; ++i)
+ this._enumerateChildren(rootNode.children[i], result, maxLevel - 1);
+ return result;
+ }
+
+ onResize() {
+ this.updateWidths();
+ }
+
+ // Updates the widths of the table, including the positions of the column
+ // resizers.
+ //
+ // IMPORTANT: This function MUST be called once after the element of the
+ // DataGrid is attached to its parent element and every subsequent time the
+ // width of the parent element is changed in order to make it possible to
+ // resize the columns.
+ //
+ // If this function is not called after the DataGrid is attached to its
+ // parent element, then the DataGrid's columns will not be resizable.
+ updateWidths() {
+ // Do not attempt to use offsetes if we're not attached to the document tree yet.
+ if (!this._columnWidthsInitialized && this.element.offsetWidth) {
+ // Give all the columns initial widths now so that during a resize,
+ // when the two columns that get resized get a percent value for
+ // their widths, all the other columns already have percent values
+ // for their widths.
+ var headerTableColumns = this._headerTableColumnGroup.children;
+
+ // Use container size to avoid changes of table width caused by change of column widths.
+ var tableWidth = this.element.offsetWidth - this._cornerWidth;
+ var cells = this._headerTableBody.rows[0].cells;
+ var numColumns = cells.length - 1; // Do not process corner column.
+ for (var i = 0; i < numColumns; i++) {
+ var column = this._visibleColumnsArray[i];
+ if (!column.weight)
+ column.weight = 100 * cells[i].offsetWidth / tableWidth;
+ }
+ this._columnWidthsInitialized = true;
+ }
+ this._applyColumnWeights();
+ }
+
+ /**
+ * @param {string} name
+ */
+ setName(name) {
+ this._columnWeightsSetting = WebInspector.settings.createSetting('dataGrid-' + name + '-columnWeights', {});
+ this._loadColumnWeights();
+ }
+
+ _loadColumnWeights() {
+ if (!this._columnWeightsSetting)
+ return;
+ var weights = this._columnWeightsSetting.get();
+ for (var i = 0; i < this._columnsArray.length; ++i) {
+ var column = this._columnsArray[i];
+ var weight = weights[column.id];
+ if (weight)
+ column.weight = weight;
+ }
+ this._applyColumnWeights();
+ }
+
+ _saveColumnWeights() {
+ if (!this._columnWeightsSetting)
+ return;
+ var weights = {};
+ for (var i = 0; i < this._columnsArray.length; ++i) {
+ var column = this._columnsArray[i];
+ weights[column.id] = column.weight;
+ }
+ this._columnWeightsSetting.set(weights);
+ }
+
+ wasShown() {
+ this._loadColumnWeights();
+ }
+
+ willHide() {
+ }
+
+ _applyColumnWeights() {
+ var tableWidth = this.element.offsetWidth - this._cornerWidth;
+ if (tableWidth <= 0)
+ return;
+
+ var sumOfWeights = 0.0;
+ var fixedColumnWidths = [];
+ for (var i = 0; i < this._visibleColumnsArray.length; ++i) {
+ var column = this._visibleColumnsArray[i];
+ if (column.fixedWidth) {
+ var width = this._headerTableColumnGroup.children[i][WebInspector.DataGrid._preferredWidthSymbol] ||
+ this._headerTableBody.rows[0].cells[i].offsetWidth;
+ fixedColumnWidths[i] = width;
+ tableWidth -= width;
+ } else {
+ sumOfWeights += this._visibleColumnsArray[i].weight;
+ }
+ }
+ var sum = 0;
+ var lastOffset = 0;
+
+ for (var i = 0; i < this._visibleColumnsArray.length; ++i) {
+ var column = this._visibleColumnsArray[i];
+ var width;
+ if (column.fixedWidth) {
+ width = fixedColumnWidths[i];
+ } else {
+ sum += column.weight;
+ var offset = (sum * tableWidth / sumOfWeights) | 0;
+ width = offset - lastOffset;
+ lastOffset = offset;
+ }
+ this._setPreferredWidth(i, width);
+ }
+
+ this._positionResizers();
+ this.dispatchEventToListeners(WebInspector.DataGrid.Events.ColumnsResized);
+ }
+
+ /**
+ * @param {!Object.<string, boolean>} columnsVisibility
+ */
+ setColumnsVisiblity(columnsVisibility) {
+ this._visibleColumnsArray = [];
+ for (var i = 0; i < this._columnsArray.length; ++i) {
+ var column = this._columnsArray[i];
+ if (columnsVisibility[column.id])
+ this._visibleColumnsArray.push(column);
+ }
+ this._refreshHeader();
+ this._applyColumnWeights();
+ var nodes = this._enumerateChildren(this.rootNode(), [], -1);
+ for (var i = 0; i < nodes.length; ++i)
+ nodes[i].refresh();
+ }
+
+ get scrollContainer() {
+ return this._scrollContainer;
+ }
+
+ _positionResizers() {
+ var headerTableColumns = this._headerTableColumnGroup.children;
+ var numColumns = headerTableColumns.length - 1; // Do not process corner column.
+ var left = [];
+ var resizers = this._resizers;
+
+ while (resizers.length > numColumns - 1)
+ resizers.pop().remove();
+
+ for (var i = 0; i < numColumns - 1; i++) {
+ // Get the width of the cell in the first (and only) row of the
+ // header table in order to determine the width of the column, since
+ // it is not possible to query a column for its width.
+ left[i] = (left[i - 1] || 0) + this._headerTableBody.rows[0].cells[i].offsetWidth;
+ }
+
+ // Make n - 1 resizers for n columns.
+ for (var i = 0; i < numColumns - 1; i++) {
+ var resizer = resizers[i];
+ if (!resizer) {
+ // This is the first call to updateWidth, so the resizers need
+ // to be created.
+ resizer = createElement('div');
+ resizer.__index = i;
+ resizer.classList.add('data-grid-resizer');
+ // This resizer is associated with the column to its right.
+ WebInspector.installDragHandle(
+ resizer, this._startResizerDragging.bind(this), this._resizerDragging.bind(this),
+ this._endResizerDragging.bind(this), 'col-resize');
+ this.element.appendChild(resizer);
+ resizers.push(resizer);
+ }
+ if (resizer.__position !== left[i]) {
+ resizer.__position = left[i];
+ resizer.style.left = left[i] + 'px';
+ }
+ }
+ }
+
+ addCreationNode(hasChildren) {
+ if (this.creationNode)
+ this.creationNode.makeNormal();
+
+ var emptyData = {};
+ for (var column in this._columns)
+ emptyData[column] = null;
+ this.creationNode = new WebInspector.CreationDataGridNode(emptyData, hasChildren);
+ this.rootNode().appendChild(this.creationNode);
+ }
+
+ /**
+ * @param {!Event} event
+ */
+ _keyDown(event) {
+ if (!this.selectedNode || event.shiftKey || event.metaKey || event.ctrlKey || this._editing)
+ return;
+
+ var handled = false;
+ var nextSelectedNode;
+ if (event.key === 'ArrowUp' && !event.altKey) {
+ nextSelectedNode = this.selectedNode.traversePreviousNode(true);
+ while (nextSelectedNode && !nextSelectedNode.selectable)
+ nextSelectedNode = nextSelectedNode.traversePreviousNode(true);
+ handled = nextSelectedNode ? true : false;
+ } else if (event.key === 'ArrowDown' && !event.altKey) {
+ nextSelectedNode = this.selectedNode.traverseNextNode(true);
+ while (nextSelectedNode && !nextSelectedNode.selectable)
+ nextSelectedNode = nextSelectedNode.traverseNextNode(true);
+ handled = nextSelectedNode ? true : false;
+ } else if (event.key === 'ArrowLeft') {
+ if (this.selectedNode.expanded) {
+ if (event.altKey)
+ this.selectedNode.collapseRecursively();
+ else
+ this.selectedNode.collapse();
+ handled = true;
+ } else if (this.selectedNode.parent && !this.selectedNode.parent._isRoot) {
+ handled = true;
+ if (this.selectedNode.parent.selectable) {
+ nextSelectedNode = this.selectedNode.parent;
+ handled = nextSelectedNode ? true : false;
+ } else if (this.selectedNode.parent)
+ this.selectedNode.parent.collapse();
+ }
+ } else if (event.key === 'ArrowRight') {
+ if (!this.selectedNode.revealed) {
+ this.selectedNode.reveal();
+ handled = true;
+ } else if (this.selectedNode.hasChildren) {
+ handled = true;
+ if (this.selectedNode.expanded) {
+ nextSelectedNode = this.selectedNode.children[0];
+ handled = nextSelectedNode ? true : false;
+ } else {
+ if (event.altKey)
+ this.selectedNode.expandRecursively();
+ else
+ this.selectedNode.expand();
+ }
+ }
+ } else if (event.keyCode === 8 || event.keyCode === 46) {
+ if (this._deleteCallback) {
+ handled = true;
+ this._deleteCallback(this.selectedNode);
+ }
+ } else if (isEnterKey(event)) {
+ if (this._editCallback) {
+ handled = true;
+ this._startEditing(this.selectedNode._element.children[this._nextEditableColumn(-1)]);
+ }
+ }
+
+ if (nextSelectedNode) {
+ nextSelectedNode.reveal();
+ nextSelectedNode.select();
+ }
+ if (handled)
+ event.consume(true);
+ }
+
+ /**
+ * @param {?WebInspector.DataGridNode} root
+ * @param {boolean} onlyAffectsSubtree
+ */
+ updateSelectionBeforeRemoval(root, onlyAffectsSubtree) {
+ var ancestor = this.selectedNode;
+ while (ancestor && ancestor !== root)
+ ancestor = ancestor.parent;
+ // Selection is not in the subtree being deleted.
+ if (!ancestor)
+ return;
+
+ var nextSelectedNode;
+ // Skip subtree being deleted when looking for the next selectable node.
+ for (ancestor = root; ancestor && !ancestor.nextSibling; ancestor = ancestor.parent) {
+ }
+ if (ancestor)
+ nextSelectedNode = ancestor.nextSibling;
+ while (nextSelectedNode && !nextSelectedNode.selectable)
+ nextSelectedNode = nextSelectedNode.traverseNextNode(true);
+
+ if (!nextSelectedNode || nextSelectedNode.isCreationNode) {
+ nextSelectedNode = root.traversePreviousNode(true);
+ while (nextSelectedNode && !nextSelectedNode.selectable)
+ nextSelectedNode = nextSelectedNode.traversePreviousNode(true);
+ }
+ if (nextSelectedNode) {
+ nextSelectedNode.reveal();
+ nextSelectedNode.select();
+ } else {
+ this.selectedNode.deselect();
+ }
+ }
+
+ /**
+ * @param {!Node} target
+ * @return {?WebInspector.DataGridNode}
+ */
+ dataGridNodeFromNode(target) {
+ var rowElement = target.enclosingNodeOrSelfWithNodeName('tr');
+ return rowElement && rowElement._dataGridNode;
+ }
+
+ /**
+ * @param {!Node} target
+ * @return {?string}
+ */
+ columnIdFromNode(target) {
+ var cellElement = target.enclosingNodeOrSelfWithNodeName('td');
+ return cellElement && cellElement[WebInspector.DataGrid._columnIdSymbol];
+ }
+
+ /**
+ * @param {!Event} event
+ */
+ _clickInHeaderCell(event) {
+ var cell = event.target.enclosingNodeOrSelfWithNodeName('th');
+ if (!cell || (cell[WebInspector.DataGrid._columnIdSymbol] === undefined) || !cell.classList.contains('sortable'))
+ return;
+
+ var sortOrder = WebInspector.DataGrid.Order.Ascending;
+ if ((cell === this._sortColumnCell) && this.isSortOrderAscending())
+ sortOrder = WebInspector.DataGrid.Order.Descending;
+
+ if (this._sortColumnCell)
+ this._sortColumnCell.classList.remove(
+ WebInspector.DataGrid.Order.Ascending, WebInspector.DataGrid.Order.Descending);
+ this._sortColumnCell = cell;
+
+ cell.classList.add(sortOrder);
+
+ this.dispatchEventToListeners(WebInspector.DataGrid.Events.SortingChanged);
+ }
+
+ /**
+ * @param {string} columnId
+ * @param {!WebInspector.DataGrid.Order} sortOrder
+ */
+ markColumnAsSortedBy(columnId, sortOrder) {
+ if (this._sortColumnCell)
+ this._sortColumnCell.classList.remove(
+ WebInspector.DataGrid.Order.Ascending, WebInspector.DataGrid.Order.Descending);
+ this._sortColumnCell = this._headerTableHeaders[columnId];
+ this._sortColumnCell.classList.add(sortOrder);
+ }
+
+ /**
+ * @param {string} columnId
+ * @return {!Element}
+ */
+ headerTableHeader(columnId) {
+ return this._headerTableHeaders[columnId];
+ }
+
+ /**
+ * @param {!Event} event
+ */
+ _mouseDownInDataTable(event) {
+ var target = /** @type {!Node} */ (event.target);
+ var gridNode = this.dataGridNodeFromNode(target);
+ if (!gridNode || !gridNode.selectable || gridNode.isEventWithinDisclosureTriangle(event))
+ return;
+
+ var columnId = this.columnIdFromNode(target);
+ if (columnId && this._columns[columnId].nonSelectable)
+ return;
+
+ if (event.metaKey) {
+ if (gridNode.selected)
+ gridNode.deselect();
+ else
+ gridNode.select();
+ } else
+ gridNode.select();
+ }
+
+ /**
+ * @param {?function(!WebInspector.ContextMenu)} callback
+ */
+ setHeaderContextMenuCallback(callback) {
+ this._headerContextMenuCallback = callback;
+ }
+
+ /**
+ * @param {?function(!WebInspector.ContextMenu, !WebInspector.DataGridNode)} callback
+ */
+ setRowContextMenuCallback(callback) {
+ this._rowContextMenuCallback = callback;
+ }
+
+ /**
+ * @param {!Event} event
+ */
+ _contextMenu(event) {
+ var contextMenu = new WebInspector.ContextMenu(event);
+ var target = /** @type {!Node} */ (event.target);
+
+ if (target.isSelfOrDescendant(this._headerTableBody)) {
+ if (this._headerContextMenuCallback)
+ this._headerContextMenuCallback(contextMenu);
+ return;
+ }
+
+ var gridNode = this.dataGridNodeFromNode(target);
+ if (this._refreshCallback && (!gridNode || gridNode !== this.creationNode))
+ contextMenu.appendItem(WebInspector.UIString('Refresh'), this._refreshCallback.bind(this));
+
+ if (gridNode && gridNode.selectable && !gridNode.isEventWithinDisclosureTriangle(event)) {
+ if (this._editCallback) {
+ if (gridNode === this.creationNode)
+ contextMenu.appendItem(WebInspector.UIString.capitalize('Add ^new'), this._startEditing.bind(this, target));
+ else {
+ var columnId = this.columnIdFromNode(target);
+ if (columnId && this._columns[columnId].editable)
+ contextMenu.appendItem(
+ WebInspector.UIString('Edit "%s"', this._columns[columnId].title),
+ this._startEditing.bind(this, target));
+ }
+ }
+ if (this._deleteCallback && gridNode !== this.creationNode)
+ contextMenu.appendItem(WebInspector.UIString.capitalize('Delete'), this._deleteCallback.bind(this, gridNode));
+ if (this._rowContextMenuCallback)
+ this._rowContextMenuCallback(contextMenu, gridNode);
+ }
+
+ contextMenu.show();
+ }
+
+ /**
+ * @param {!Event} event
+ */
+ _clickInDataTable(event) {
+ var gridNode = this.dataGridNodeFromNode(/** @type {!Node} */ (event.target));
+ if (!gridNode || !gridNode.hasChildren || !gridNode.isEventWithinDisclosureTriangle(event))
+ return;
+
+ if (gridNode.expanded) {
+ if (event.altKey)
+ gridNode.collapseRecursively();
+ else
+ gridNode.collapse();
+ } else {
+ if (event.altKey)
+ gridNode.expandRecursively();
+ else
+ gridNode.expand();
+ }
+ }
+
+ /**
+ * @param {!WebInspector.DataGrid.ResizeMethod} method
+ */
+ setResizeMethod(method) {
+ this._resizeMethod = method;
+ }
+
+ /**
+ * @param {!Event} event
+ * @return {boolean}
+ */
+ _startResizerDragging(event) {
+ this._currentResizer = event.target;
+ return true;
+ }
+
+ _endResizerDragging() {
+ this._currentResizer = null;
+ this._saveColumnWeights();
+ this.dispatchEventToListeners(WebInspector.DataGrid.Events.ColumnsResized);
+ }
+
+ /**
+ * @param {!Event} event
+ */
+ _resizerDragging(event) {
+ var resizer = this._currentResizer;
+ if (!resizer)
+ return;
+
+ // Constrain the dragpoint to be within the containing div of the
+ // datagrid.
+ var dragPoint = event.clientX - this.element.totalOffsetLeft();
+ var firstRowCells = this._headerTableBody.rows[0].cells;
+ var leftEdgeOfPreviousColumn = 0;
+ // Constrain the dragpoint to be within the space made up by the
+ // column directly to the left and the column directly to the right.
+ var leftCellIndex = resizer.__index;
+ var rightCellIndex = leftCellIndex + 1;
+ for (var i = 0; i < leftCellIndex; i++)
+ leftEdgeOfPreviousColumn += firstRowCells[i].offsetWidth;
+
+ // Differences for other resize methods
+ if (this._resizeMethod === WebInspector.DataGrid.ResizeMethod.Last) {
+ rightCellIndex = this._resizers.length;
+ } else if (this._resizeMethod === WebInspector.DataGrid.ResizeMethod.First) {
+ leftEdgeOfPreviousColumn += firstRowCells[leftCellIndex].offsetWidth - firstRowCells[0].offsetWidth;
+ leftCellIndex = 0;
+ }
+
+ var rightEdgeOfNextColumn =
+ leftEdgeOfPreviousColumn + firstRowCells[leftCellIndex].offsetWidth + firstRowCells[rightCellIndex].offsetWidth;
+
+ // Give each column some padding so that they don't disappear.
+ var leftMinimum = leftEdgeOfPreviousColumn + WebInspector.DataGrid.ColumnResizePadding;
+ var rightMaximum = rightEdgeOfNextColumn - WebInspector.DataGrid.ColumnResizePadding;
+ if (leftMinimum > rightMaximum)
+ return;
+
+ dragPoint = Number.constrain(dragPoint, leftMinimum, rightMaximum);
+
+ var position = (dragPoint - WebInspector.DataGrid.CenterResizerOverBorderAdjustment);
+ resizer.__position = position;
+ resizer.style.left = position + 'px';
+
+ this._setPreferredWidth(leftCellIndex, dragPoint - leftEdgeOfPreviousColumn);
+ this._setPreferredWidth(rightCellIndex, rightEdgeOfNextColumn - dragPoint);
+
+ var leftColumn = this._visibleColumnsArray[leftCellIndex];
+ var rightColumn = this._visibleColumnsArray[rightCellIndex];
+ if (leftColumn.weight || rightColumn.weight) {
+ var sumOfWeights = leftColumn.weight + rightColumn.weight;
+ var delta = rightEdgeOfNextColumn - leftEdgeOfPreviousColumn;
+ leftColumn.weight = (dragPoint - leftEdgeOfPreviousColumn) * sumOfWeights / delta;
+ rightColumn.weight = (rightEdgeOfNextColumn - dragPoint) * sumOfWeights / delta;
+ }
+
+ this._positionResizers();
+ event.preventDefault();
+ this.dispatchEventToListeners(WebInspector.DataGrid.Events.ColumnsResized);
+ }
+
+ /**
+ * @param {number} columnIndex
+ * @param {number} width
+ */
+ _setPreferredWidth(columnIndex, width) {
+ var pxWidth = width + 'px';
+ this._headerTableColumnGroup.children[columnIndex][WebInspector.DataGrid._preferredWidthSymbol] = width;
+ this._headerTableColumnGroup.children[columnIndex].style.width = pxWidth;
+ this._dataTableColumnGroup.children[columnIndex].style.width = pxWidth;
+ }
+
+ /**
+ * @param {string} columnId
+ * @return {number}
+ */
+ columnOffset(columnId) {
+ if (!this.element.offsetWidth)
+ return 0;
+ for (var i = 1; i < this._visibleColumnsArray.length; ++i) {
+ if (columnId === this._visibleColumnsArray[i].id) {
+ if (this._resizers[i - 1])
+ return this._resizers[i - 1].__position;
+ }
+ }
+ return 0;
+ }
+
+ /**
+ * @return {!WebInspector.DataGridWidget}
+ */
+ asWidget() {
+ if (!this._dataGridWidget)
+ this._dataGridWidget = new WebInspector.DataGridWidget(this);
+ return this._dataGridWidget;
+ }
};
// Keep in sync with .data-grid col.corner style rule.
@@ -147,1115 +1167,48 @@ WebInspector.DataGrid.ColumnDescriptor;
/** @enum {symbol} */
WebInspector.DataGrid.Events = {
- SelectedNode: Symbol("SelectedNode"),
- DeselectedNode: Symbol("DeselectedNode"),
- SortingChanged: Symbol("SortingChanged"),
- ColumnsResized: Symbol("ColumnsResized"),
- PaddingChanged: Symbol("PaddingChanged")
+ SelectedNode: Symbol('SelectedNode'),
+ DeselectedNode: Symbol('DeselectedNode'),
+ SortingChanged: Symbol('SortingChanged'),
+ ColumnsResized: Symbol('ColumnsResized'),
+ PaddingChanged: Symbol('PaddingChanged')
};
/** @enum {string} */
WebInspector.DataGrid.Order = {
- Ascending: "sort-ascending",
- Descending: "sort-descending"
+ Ascending: 'sort-ascending',
+ Descending: 'sort-descending'
};
/** @enum {string} */
WebInspector.DataGrid.Align = {
- Center: "center",
- Right: "right"
+ Center: 'center',
+ Right: 'right'
};
-WebInspector.DataGrid._preferredWidthSymbol = Symbol("preferredWidth");
-WebInspector.DataGrid._columnIdSymbol = Symbol("columnId");
-
-WebInspector.DataGrid.prototype = {
- /**
- * @return {!Element}
- */
- headerTableBody: function()
- {
- return this._headerTableBody;
- },
-
- /**
- * @param {!WebInspector.DataGrid.ColumnDescriptor} column
- * @param {number=} position
- */
- _innerAddColumn: function(column, position)
- {
- var columnId = column.id;
- if (columnId in this._columns)
- this._innerRemoveColumn(columnId);
-
- if (position === undefined)
- position = this._columnsArray.length;
-
- this._columnsArray.splice(position, 0, column);
- this._columns[columnId] = column;
- if (column.disclosure)
- this.disclosureColumnId = columnId;
-
- var cell = createElement("th");
- cell.className = columnId + "-column";
- cell[WebInspector.DataGrid._columnIdSymbol] = columnId;
- this._headerTableHeaders[columnId] = cell;
-
- var div = createElement("div");
- if (column.titleDOMFragment)
- div.appendChild(column.titleDOMFragment);
- else
- div.textContent = column.title;
- cell.appendChild(div);
-
- if (column.sort) {
- cell.classList.add(column.sort);
- this._sortColumnCell = cell;
- }
-
- if (column.sortable) {
- cell.addEventListener("click", this._clickInHeaderCell.bind(this), false);
- cell.classList.add("sortable");
- cell.createChild("div", "sort-order-icon-container").createChild("div", "sort-order-icon");
- }
- },
-
- /**
- * @param {!WebInspector.DataGrid.ColumnDescriptor} column
- * @param {number=} position
- */
- addColumn: function(column, position)
- {
- this._innerAddColumn(column, position);
- },
-
- /**
- * @param {string} columnId
- */
- _innerRemoveColumn: function(columnId)
- {
- var column = this._columns[columnId];
- if (!column)
- return;
- delete this._columns[columnId];
- var index = this._columnsArray.findIndex(columnConfig => columnConfig.id === columnId);
- this._columnsArray.splice(index, 1);
- var cell = this._headerTableHeaders[columnId];
- if (cell.parentElement)
- cell.parentElement.removeChild(cell);
- delete this._headerTableHeaders[columnId];
- },
-
- /**
- * @param {string} columnId
- */
- removeColumn: function(columnId)
- {
- this._innerRemoveColumn(columnId);
- },
-
- /**
- * @param {string} cellClass
- */
- setCellClass: function(cellClass)
- {
- this._cellClass = cellClass;
- },
-
- _refreshHeader: function()
- {
- this._headerTableColumnGroup.removeChildren();
- this._dataTableColumnGroup.removeChildren();
- this._headerRow.removeChildren();
- this._topFillerRow.removeChildren();
- this._bottomFillerRow.removeChildren();
-
- for (var i = 0; i < this._visibleColumnsArray.length; ++i) {
- var column = this._visibleColumnsArray[i];
- var columnId = column.id;
- var headerColumn = this._headerTableColumnGroup.createChild("col");
- var dataColumn = this._dataTableColumnGroup.createChild("col");
- if (column.width) {
- headerColumn.style.width = column.width;
- dataColumn.style.width = column.width;
- }
- this._headerRow.appendChild(this._headerTableHeaders[columnId]);
- this._topFillerRow.createChild("td", "top-filler-td");
- this._bottomFillerRow.createChild("td", "bottom-filler-td")[WebInspector.DataGrid._columnIdSymbol] = columnId;
- }
-
- this._headerRow.createChild("th", "corner");
- this._topFillerRow.createChild("td", "corner").classList.add("top-filler-td");
- this._bottomFillerRow.createChild("td", "corner").classList.add("bottom-filler-td");
- this._headerTableColumnGroup.createChild("col", "corner");
- this._dataTableColumnGroup.createChild("col", "corner");
- },
-
- /**
- * @param {number} top
- * @param {number} bottom
- * @protected
- */
- setVerticalPadding: function(top, bottom)
- {
- this._topFillerRow.style.height = top + "px";
- if (top || bottom)
- this._bottomFillerRow.style.height = bottom + "px";
- else
- this._bottomFillerRow.style.height = "auto";
- this.dispatchEventToListeners(WebInspector.DataGrid.Events.PaddingChanged);
- },
-
- /**
- * @param {!WebInspector.DataGridNode} rootNode
- * @protected
- */
- setRootNode: function(rootNode)
- {
- if (this._rootNode) {
- this._rootNode.removeChildren();
- this._rootNode.dataGrid = null;
- this._rootNode._isRoot = false;
- }
- /** @type {!WebInspector.DataGridNode} */
- this._rootNode = rootNode;
- rootNode._isRoot = true;
- rootNode.hasChildren = false;
- rootNode._expanded = true;
- rootNode._revealed = true;
- rootNode.selectable = false;
- rootNode.dataGrid = this;
- },
-
- /**
- * @return {!WebInspector.DataGridNode}
- */
- rootNode: function()
- {
- return this._rootNode;
- },
-
- /**
- * @param {!Event} event
- */
- _ondblclick: function(event)
- {
- if (this._editing || this._editingNode)
- return;
-
- var columnId = this.columnIdFromNode(/** @type {!Node} */ (event.target));
- if (!columnId || !this._columns[columnId].editable)
- return;
- this._startEditing(/** @type {!Node} */ (event.target));
- },
-
- /**
- * @param {!WebInspector.DataGridNode} node
- * @param {number} cellIndex
- */
- _startEditingColumnOfDataGridNode: function(node, cellIndex)
- {
- this._editing = true;
- /** @type {?WebInspector.DataGridNode} */
- this._editingNode = node;
- this._editingNode.select();
-
- var element = this._editingNode._element.children[cellIndex];
- WebInspector.InplaceEditor.startEditing(element, this._startEditingConfig(element));
- element.getComponentSelection().setBaseAndExtent(element, 0, element, 1);
- },
-
- /**
- * @param {!Node} target
- */
- _startEditing: function(target)
- {
- var element = /** @type {?Element} */ (target.enclosingNodeOrSelfWithNodeName("td"));
- if (!element)
- return;
-
- this._editingNode = this.dataGridNodeFromNode(target);
- if (!this._editingNode) {
- if (!this.creationNode)
- return;
- this._editingNode = this.creationNode;
- }
-
- // Force editing the 1st column when editing the creation node
- if (this._editingNode.isCreationNode) {
- this._startEditingColumnOfDataGridNode(this._editingNode, this._nextEditableColumn(-1));
- return;
- }
-
- this._editing = true;
- WebInspector.InplaceEditor.startEditing(element, this._startEditingConfig(element));
-
- element.getComponentSelection().setBaseAndExtent(element, 0, element, 1);
- },
-
- renderInline: function()
- {
- this.element.classList.add("inline");
- this._cornerWidth = 0;
- this._inline = true;
- this.updateWidths();
- },
-
- /**
- * @param {!Element} element
- * @return {!WebInspector.InplaceEditor.Config}
- */
- _startEditingConfig: function(element)
- {
- return new WebInspector.InplaceEditor.Config(this._editingCommitted.bind(this), this._editingCancelled.bind(this), element.textContent);
- },
-
- /**
- * @param {!Element} element
- * @param {string} newText
- * @param {string} oldText
- * @param {string|undefined} context
- * @param {string} moveDirection
- */
- _editingCommitted: function(element, newText, oldText, context, moveDirection)
- {
- var columnId = this.columnIdFromNode(element);
- if (!columnId) {
- this._editingCancelled(element);
- return;
- }
- var column = this._columns[columnId];
- var cellIndex = this._visibleColumnsArray.indexOf(column);
- var textBeforeEditing = /** @type {string} */ (this._editingNode.data[columnId]);
- var currentEditingNode = this._editingNode;
-
- /**
- * @param {boolean} wasChange
- * @this {WebInspector.DataGrid}
- */
- function moveToNextIfNeeded(wasChange)
- {
- if (!moveDirection)
- return;
-
- if (moveDirection === "forward") {
- var firstEditableColumn = this._nextEditableColumn(-1);
- if (currentEditingNode.isCreationNode && cellIndex === firstEditableColumn && !wasChange)
- return;
-
- var nextEditableColumn = this._nextEditableColumn(cellIndex);
- if (nextEditableColumn !== -1) {
- this._startEditingColumnOfDataGridNode(currentEditingNode, nextEditableColumn);
- return;
- }
-
- var nextDataGridNode = currentEditingNode.traverseNextNode(true, null, true);
- if (nextDataGridNode) {
- this._startEditingColumnOfDataGridNode(nextDataGridNode, firstEditableColumn);
- return;
- }
- if (currentEditingNode.isCreationNode && wasChange) {
- this.addCreationNode(false);
- this._startEditingColumnOfDataGridNode(this.creationNode, firstEditableColumn);
- return;
- }
- return;
- }
-
- if (moveDirection === "backward") {
- var prevEditableColumn = this._nextEditableColumn(cellIndex, true);
- if (prevEditableColumn !== -1) {
- this._startEditingColumnOfDataGridNode(currentEditingNode, prevEditableColumn);
- return;
- }
-
- var lastEditableColumn = this._nextEditableColumn(this._visibleColumnsArray.length, true);
- var nextDataGridNode = currentEditingNode.traversePreviousNode(true, true);
- if (nextDataGridNode)
- this._startEditingColumnOfDataGridNode(nextDataGridNode, lastEditableColumn);
- return;
- }
- }
-
- if (textBeforeEditing === newText) {
- this._editingCancelled(element);
- moveToNextIfNeeded.call(this, false);
- return;
- }
-
- // Update the text in the datagrid that we typed
- this._editingNode.data[columnId] = newText;
-
- // Make the callback - expects an editing node (table row), the column number that is being edited,
- // the text that used to be there, and the new text.
- this._editCallback(this._editingNode, columnId, textBeforeEditing, newText);
-
- if (this._editingNode.isCreationNode)
- this.addCreationNode(false);
-
- this._editingCancelled(element);
- moveToNextIfNeeded.call(this, true);
- },
-
- /**
- * @param {!Element} element
- */
- _editingCancelled: function(element)
- {
- this._editing = false;
- this._editingNode = null;
- },
-
- /**
- * @param {number} cellIndex
- * @param {boolean=} moveBackward
- * @return {number}
- */
- _nextEditableColumn: function(cellIndex, moveBackward)
- {
- var increment = moveBackward ? -1 : 1;
- var columns = this._visibleColumnsArray;
- for (var i = cellIndex + increment; (i >= 0) && (i < columns.length); i += increment) {
- if (columns[i].editable)
- return i;
- }
- return -1;
- },
-
- /**
- * @return {?string}
- */
- sortColumnId: function()
- {
- if (!this._sortColumnCell)
- return null;
- return this._sortColumnCell[WebInspector.DataGrid._columnIdSymbol];
- },
-
- /**
- * @return {?string}
- */
- sortOrder: function()
- {
- if (!this._sortColumnCell || this._sortColumnCell.classList.contains(WebInspector.DataGrid.Order.Ascending))
- return WebInspector.DataGrid.Order.Ascending;
- if (this._sortColumnCell.classList.contains(WebInspector.DataGrid.Order.Descending))
- return WebInspector.DataGrid.Order.Descending;
- return null;
- },
-
- /**
- * @return {boolean}
- */
- isSortOrderAscending: function()
- {
- return !this._sortColumnCell || this._sortColumnCell.classList.contains(WebInspector.DataGrid.Order.Ascending);
- },
-
- /**
- * @param {!Array.<number>} widths
- * @param {number} minPercent
- * @param {number=} maxPercent
- * @return {!Array.<number>}
- */
- _autoSizeWidths: function(widths, minPercent, maxPercent)
- {
- if (minPercent)
- minPercent = Math.min(minPercent, Math.floor(100 / widths.length));
- var totalWidth = 0;
- for (var i = 0; i < widths.length; ++i)
- totalWidth += widths[i];
- var totalPercentWidth = 0;
- for (var i = 0; i < widths.length; ++i) {
- var width = Math.round(100 * widths[i] / totalWidth);
- if (minPercent && width < minPercent)
- width = minPercent;
- else if (maxPercent && width > maxPercent)
- width = maxPercent;
- totalPercentWidth += width;
- widths[i] = width;
- }
- var recoupPercent = totalPercentWidth - 100;
-
- while (minPercent && recoupPercent > 0) {
- for (var i = 0; i < widths.length; ++i) {
- if (widths[i] > minPercent) {
- --widths[i];
- --recoupPercent;
- if (!recoupPercent)
- break;
- }
- }
- }
-
- while (maxPercent && recoupPercent < 0) {
- for (var i = 0; i < widths.length; ++i) {
- if (widths[i] < maxPercent) {
- ++widths[i];
- ++recoupPercent;
- if (!recoupPercent)
- break;
- }
- }
- }
-
- return widths;
- },
-
- /**
- * @param {number} minPercent
- * @param {number=} maxPercent
- * @param {number=} maxDescentLevel
- */
- autoSizeColumns: function(minPercent, maxPercent, maxDescentLevel)
- {
- var widths = [];
- for (var i = 0; i < this._columnsArray.length; ++i)
- widths.push((this._columnsArray[i].title || "").length);
-
- maxDescentLevel = maxDescentLevel || 0;
- var children = this._enumerateChildren(this._rootNode, [], maxDescentLevel + 1);
- for (var i = 0; i < children.length; ++i) {
- var node = children[i];
- for (var j = 0; j < this._columnsArray.length; ++j) {
- var text = node.data[this._columnsArray[j].id];
- if (text.length > widths[j])
- widths[j] = text.length;
- }
- }
-
- widths = this._autoSizeWidths(widths, minPercent, maxPercent);
-
- for (var i = 0; i < this._columnsArray.length; ++i)
- this._columnsArray[i].weight = widths[i];
- this._columnWidthsInitialized = false;
- this.updateWidths();
- },
-
- /**
- * @param {!WebInspector.DataGridNode} rootNode
- * @param {!Array<!WebInspector.DataGridNode>} result
- * @param {number} maxLevel
- * @return {!Array<!WebInspector.DataGridNode>}
- */
- _enumerateChildren: function(rootNode, result, maxLevel)
- {
- if (!rootNode._isRoot)
- result.push(rootNode);
- if (!maxLevel)
- return [];
- for (var i = 0; i < rootNode.children.length; ++i)
- this._enumerateChildren(rootNode.children[i], result, maxLevel - 1);
- return result;
- },
-
- onResize: function()
- {
- this.updateWidths();
- },
-
- // Updates the widths of the table, including the positions of the column
- // resizers.
- //
- // IMPORTANT: This function MUST be called once after the element of the
- // DataGrid is attached to its parent element and every subsequent time the
- // width of the parent element is changed in order to make it possible to
- // resize the columns.
- //
- // If this function is not called after the DataGrid is attached to its
- // parent element, then the DataGrid's columns will not be resizable.
- updateWidths: function()
- {
- // Do not attempt to use offsetes if we're not attached to the document tree yet.
- if (!this._columnWidthsInitialized && this.element.offsetWidth) {
- // Give all the columns initial widths now so that during a resize,
- // when the two columns that get resized get a percent value for
- // their widths, all the other columns already have percent values
- // for their widths.
- var headerTableColumns = this._headerTableColumnGroup.children;
-
- // Use container size to avoid changes of table width caused by change of column widths.
- var tableWidth = this.element.offsetWidth - this._cornerWidth;
- var cells = this._headerTableBody.rows[0].cells;
- var numColumns = cells.length - 1; // Do not process corner column.
- for (var i = 0; i < numColumns; i++) {
- var column = this._visibleColumnsArray[i];
- if (!column.weight)
- column.weight = 100 * cells[i].offsetWidth / tableWidth;
- }
- this._columnWidthsInitialized = true;
- }
- this._applyColumnWeights();
- },
-
- /**
- * @param {string} name
- */
- setName: function(name)
- {
- this._columnWeightsSetting = WebInspector.settings.createSetting("dataGrid-" + name + "-columnWeights", {});
- this._loadColumnWeights();
- },
-
- _loadColumnWeights: function()
- {
- if (!this._columnWeightsSetting)
- return;
- var weights = this._columnWeightsSetting.get();
- for (var i = 0; i < this._columnsArray.length; ++i) {
- var column = this._columnsArray[i];
- var weight = weights[column.id];
- if (weight)
- column.weight = weight;
- }
- this._applyColumnWeights();
- },
-
- _saveColumnWeights: function()
- {
- if (!this._columnWeightsSetting)
- return;
- var weights = {};
- for (var i = 0; i < this._columnsArray.length; ++i) {
- var column = this._columnsArray[i];
- weights[column.id] = column.weight;
- }
- this._columnWeightsSetting.set(weights);
- },
-
- wasShown: function()
- {
- this._loadColumnWeights();
- },
-
- willHide: function()
- {
- },
-
- _applyColumnWeights: function()
- {
- var tableWidth = this.element.offsetWidth - this._cornerWidth;
- if (tableWidth <= 0)
- return;
-
- var sumOfWeights = 0.0;
- var fixedColumnWidths = [];
- for (var i = 0; i < this._visibleColumnsArray.length; ++i) {
- var column = this._visibleColumnsArray[i];
- if (column.fixedWidth) {
- var width = this._headerTableColumnGroup.children[i][WebInspector.DataGrid._preferredWidthSymbol] || this._headerTableBody.rows[0].cells[i].offsetWidth;
- fixedColumnWidths[i] = width;
- tableWidth -= width;
- } else {
- sumOfWeights += this._visibleColumnsArray[i].weight;
- }
- }
- var sum = 0;
- var lastOffset = 0;
-
- for (var i = 0; i < this._visibleColumnsArray.length; ++i) {
- var column = this._visibleColumnsArray[i];
- var width;
- if (column.fixedWidth) {
- width = fixedColumnWidths[i];
- } else {
- sum += column.weight;
- var offset = (sum * tableWidth / sumOfWeights) | 0;
- width = offset - lastOffset;
- lastOffset = offset;
- }
- this._setPreferredWidth(i, width);
- }
-
- this._positionResizers();
- this.dispatchEventToListeners(WebInspector.DataGrid.Events.ColumnsResized);
- },
-
- /**
- * @param {!Object.<string, boolean>} columnsVisibility
- */
- setColumnsVisiblity: function(columnsVisibility)
- {
- this._visibleColumnsArray = [];
- for (var i = 0; i < this._columnsArray.length; ++i) {
- var column = this._columnsArray[i];
- if (columnsVisibility[column.id])
- this._visibleColumnsArray.push(column);
- }
- this._refreshHeader();
- this._applyColumnWeights();
- var nodes = this._enumerateChildren(this.rootNode(), [], -1);
- for (var i = 0; i < nodes.length; ++i)
- nodes[i].refresh();
- },
-
- get scrollContainer()
- {
- return this._scrollContainer;
- },
-
- _positionResizers: function()
- {
- var headerTableColumns = this._headerTableColumnGroup.children;
- var numColumns = headerTableColumns.length - 1; // Do not process corner column.
- var left = [];
- var resizers = this._resizers;
-
- while (resizers.length > numColumns - 1)
- resizers.pop().remove();
-
- for (var i = 0; i < numColumns - 1; i++) {
- // Get the width of the cell in the first (and only) row of the
- // header table in order to determine the width of the column, since
- // it is not possible to query a column for its width.
- left[i] = (left[i - 1] || 0) + this._headerTableBody.rows[0].cells[i].offsetWidth;
- }
-
- // Make n - 1 resizers for n columns.
- for (var i = 0; i < numColumns - 1; i++) {
- var resizer = resizers[i];
- if (!resizer) {
- // This is the first call to updateWidth, so the resizers need
- // to be created.
- resizer = createElement("div");
- resizer.__index = i;
- resizer.classList.add("data-grid-resizer");
- // This resizer is associated with the column to its right.
- WebInspector.installDragHandle(resizer, this._startResizerDragging.bind(this), this._resizerDragging.bind(this), this._endResizerDragging.bind(this), "col-resize");
- this.element.appendChild(resizer);
- resizers.push(resizer);
- }
- if (resizer.__position !== left[i]) {
- resizer.__position = left[i];
- resizer.style.left = left[i] + "px";
- }
- }
- },
-
- addCreationNode: function(hasChildren)
- {
- if (this.creationNode)
- this.creationNode.makeNormal();
-
- var emptyData = {};
- for (var column in this._columns)
- emptyData[column] = null;
- this.creationNode = new WebInspector.CreationDataGridNode(emptyData, hasChildren);
- this.rootNode().appendChild(this.creationNode);
- },
-
- /**
- * @param {!Event} event
- */
- _keyDown: function(event)
- {
- if (!this.selectedNode || event.shiftKey || event.metaKey || event.ctrlKey || this._editing)
- return;
-
- var handled = false;
- var nextSelectedNode;
- if (event.key === "ArrowUp" && !event.altKey) {
- nextSelectedNode = this.selectedNode.traversePreviousNode(true);
- while (nextSelectedNode && !nextSelectedNode.selectable)
- nextSelectedNode = nextSelectedNode.traversePreviousNode(true);
- handled = nextSelectedNode ? true : false;
- } else if (event.key === "ArrowDown" && !event.altKey) {
- nextSelectedNode = this.selectedNode.traverseNextNode(true);
- while (nextSelectedNode && !nextSelectedNode.selectable)
- nextSelectedNode = nextSelectedNode.traverseNextNode(true);
- handled = nextSelectedNode ? true : false;
- } else if (event.key === "ArrowLeft") {
- if (this.selectedNode.expanded) {
- if (event.altKey)
- this.selectedNode.collapseRecursively();
- else
- this.selectedNode.collapse();
- handled = true;
- } else if (this.selectedNode.parent && !this.selectedNode.parent._isRoot) {
- handled = true;
- if (this.selectedNode.parent.selectable) {
- nextSelectedNode = this.selectedNode.parent;
- handled = nextSelectedNode ? true : false;
- } else if (this.selectedNode.parent)
- this.selectedNode.parent.collapse();
- }
- } else if (event.key === "ArrowRight") {
- if (!this.selectedNode.revealed) {
- this.selectedNode.reveal();
- handled = true;
- } else if (this.selectedNode.hasChildren) {
- handled = true;
- if (this.selectedNode.expanded) {
- nextSelectedNode = this.selectedNode.children[0];
- handled = nextSelectedNode ? true : false;
- } else {
- if (event.altKey)
- this.selectedNode.expandRecursively();
- else
- this.selectedNode.expand();
- }
- }
- } else if (event.keyCode === 8 || event.keyCode === 46) {
- if (this._deleteCallback) {
- handled = true;
- this._deleteCallback(this.selectedNode);
- }
- } else if (isEnterKey(event)) {
- if (this._editCallback) {
- handled = true;
- this._startEditing(this.selectedNode._element.children[this._nextEditableColumn(-1)]);
- }
- }
-
- if (nextSelectedNode) {
- nextSelectedNode.reveal();
- nextSelectedNode.select();
- }
- if (handled)
- event.consume(true);
- },
-
- /**
- * @param {?WebInspector.DataGridNode} root
- * @param {boolean} onlyAffectsSubtree
- */
- updateSelectionBeforeRemoval: function(root, onlyAffectsSubtree)
- {
- var ancestor = this.selectedNode;
- while (ancestor && ancestor !== root)
- ancestor = ancestor.parent;
- // Selection is not in the subtree being deleted.
- if (!ancestor)
- return;
-
- var nextSelectedNode;
- // Skip subtree being deleted when looking for the next selectable node.
- for (ancestor = root; ancestor && !ancestor.nextSibling; ancestor = ancestor.parent) { }
- if (ancestor)
- nextSelectedNode = ancestor.nextSibling;
- while (nextSelectedNode && !nextSelectedNode.selectable)
- nextSelectedNode = nextSelectedNode.traverseNextNode(true);
-
- if (!nextSelectedNode || nextSelectedNode.isCreationNode) {
- nextSelectedNode = root.traversePreviousNode(true);
- while (nextSelectedNode && !nextSelectedNode.selectable)
- nextSelectedNode = nextSelectedNode.traversePreviousNode(true);
- }
- if (nextSelectedNode) {
- nextSelectedNode.reveal();
- nextSelectedNode.select();
- } else {
- this.selectedNode.deselect();
- }
- },
-
- /**
- * @param {!Node} target
- * @return {?WebInspector.DataGridNode}
- */
- dataGridNodeFromNode: function(target)
- {
- var rowElement = target.enclosingNodeOrSelfWithNodeName("tr");
- return rowElement && rowElement._dataGridNode;
- },
-
- /**
- * @param {!Node} target
- * @return {?string}
- */
- columnIdFromNode: function(target)
- {
- var cellElement = target.enclosingNodeOrSelfWithNodeName("td");
- return cellElement && cellElement[WebInspector.DataGrid._columnIdSymbol];
- },
-
- /**
- * @param {!Event} event
- */
- _clickInHeaderCell: function(event)
- {
- var cell = event.target.enclosingNodeOrSelfWithNodeName("th");
- if (!cell || (cell[WebInspector.DataGrid._columnIdSymbol] === undefined) || !cell.classList.contains("sortable"))
- return;
-
- var sortOrder = WebInspector.DataGrid.Order.Ascending;
- if ((cell === this._sortColumnCell) && this.isSortOrderAscending())
- sortOrder = WebInspector.DataGrid.Order.Descending;
-
- if (this._sortColumnCell)
- this._sortColumnCell.classList.remove(WebInspector.DataGrid.Order.Ascending, WebInspector.DataGrid.Order.Descending);
- this._sortColumnCell = cell;
-
- cell.classList.add(sortOrder);
-
- this.dispatchEventToListeners(WebInspector.DataGrid.Events.SortingChanged);
- },
-
- /**
- * @param {string} columnId
- * @param {!WebInspector.DataGrid.Order} sortOrder
- */
- markColumnAsSortedBy: function(columnId, sortOrder)
- {
- if (this._sortColumnCell)
- this._sortColumnCell.classList.remove(WebInspector.DataGrid.Order.Ascending, WebInspector.DataGrid.Order.Descending);
- this._sortColumnCell = this._headerTableHeaders[columnId];
- this._sortColumnCell.classList.add(sortOrder);
- },
-
- /**
- * @param {string} columnId
- * @return {!Element}
- */
- headerTableHeader: function(columnId)
- {
- return this._headerTableHeaders[columnId];
- },
-
- /**
- * @param {!Event} event
- */
- _mouseDownInDataTable: function(event)
- {
- var target = /** @type {!Node} */ (event.target);
- var gridNode = this.dataGridNodeFromNode(target);
- if (!gridNode || !gridNode.selectable || gridNode.isEventWithinDisclosureTriangle(event))
- return;
-
- var columnId = this.columnIdFromNode(target);
- if (columnId && this._columns[columnId].nonSelectable)
- return;
-
- if (event.metaKey) {
- if (gridNode.selected)
- gridNode.deselect();
- else
- gridNode.select();
- } else
- gridNode.select();
- },
-
- /**
- * @param {?function(!WebInspector.ContextMenu)} callback
- */
- setHeaderContextMenuCallback: function(callback)
- {
- this._headerContextMenuCallback = callback;
- },
-
- /**
- * @param {?function(!WebInspector.ContextMenu, !WebInspector.DataGridNode)} callback
- */
- setRowContextMenuCallback: function(callback)
- {
- this._rowContextMenuCallback = callback;
- },
-
- /**
- * @param {!Event} event
- */
- _contextMenu: function(event)
- {
- var contextMenu = new WebInspector.ContextMenu(event);
- var target = /** @type {!Node} */ (event.target);
-
- if (target.isSelfOrDescendant(this._headerTableBody)) {
- if (this._headerContextMenuCallback)
- this._headerContextMenuCallback(contextMenu);
- return;
- }
-
- var gridNode = this.dataGridNodeFromNode(target);
- if (this._refreshCallback && (!gridNode || gridNode !== this.creationNode))
- contextMenu.appendItem(WebInspector.UIString("Refresh"), this._refreshCallback.bind(this));
-
- if (gridNode && gridNode.selectable && !gridNode.isEventWithinDisclosureTriangle(event)) {
- if (this._editCallback) {
- if (gridNode === this.creationNode)
- contextMenu.appendItem(WebInspector.UIString.capitalize("Add ^new"), this._startEditing.bind(this, target));
- else {
- var columnId = this.columnIdFromNode(target);
- if (columnId && this._columns[columnId].editable)
- contextMenu.appendItem(WebInspector.UIString("Edit \"%s\"", this._columns[columnId].title), this._startEditing.bind(this, target));
- }
- }
- if (this._deleteCallback && gridNode !== this.creationNode)
- contextMenu.appendItem(WebInspector.UIString.capitalize("Delete"), this._deleteCallback.bind(this, gridNode));
- if (this._rowContextMenuCallback)
- this._rowContextMenuCallback(contextMenu, gridNode);
- }
-
- contextMenu.show();
- },
-
- /**
- * @param {!Event} event
- */
- _clickInDataTable: function(event)
- {
- var gridNode = this.dataGridNodeFromNode(/** @type {!Node} */ (event.target));
- if (!gridNode || !gridNode.hasChildren || !gridNode.isEventWithinDisclosureTriangle(event))
- return;
-
- if (gridNode.expanded) {
- if (event.altKey)
- gridNode.collapseRecursively();
- else
- gridNode.collapse();
- } else {
- if (event.altKey)
- gridNode.expandRecursively();
- else
- gridNode.expand();
- }
- },
-
- /**
- * @param {!WebInspector.DataGrid.ResizeMethod} method
- */
- setResizeMethod: function(method)
- {
- this._resizeMethod = method;
- },
-
- /**
- * @param {!Event} event
- * @return {boolean}
- */
- _startResizerDragging: function(event)
- {
- this._currentResizer = event.target;
- return true;
- },
-
- _endResizerDragging: function()
- {
- this._currentResizer = null;
- this._saveColumnWeights();
- this.dispatchEventToListeners(WebInspector.DataGrid.Events.ColumnsResized);
- },
-
- /**
- * @param {!Event} event
- */
- _resizerDragging: function(event)
- {
- var resizer = this._currentResizer;
- if (!resizer)
- return;
-
- // Constrain the dragpoint to be within the containing div of the
- // datagrid.
- var dragPoint = event.clientX - this.element.totalOffsetLeft();
- var firstRowCells = this._headerTableBody.rows[0].cells;
- var leftEdgeOfPreviousColumn = 0;
- // Constrain the dragpoint to be within the space made up by the
- // column directly to the left and the column directly to the right.
- var leftCellIndex = resizer.__index;
- var rightCellIndex = leftCellIndex + 1;
- for (var i = 0; i < leftCellIndex; i++)
- leftEdgeOfPreviousColumn += firstRowCells[i].offsetWidth;
-
- // Differences for other resize methods
- if (this._resizeMethod === WebInspector.DataGrid.ResizeMethod.Last) {
- rightCellIndex = this._resizers.length;
- } else if (this._resizeMethod === WebInspector.DataGrid.ResizeMethod.First) {
- leftEdgeOfPreviousColumn += firstRowCells[leftCellIndex].offsetWidth - firstRowCells[0].offsetWidth;
- leftCellIndex = 0;
- }
-
- var rightEdgeOfNextColumn = leftEdgeOfPreviousColumn + firstRowCells[leftCellIndex].offsetWidth + firstRowCells[rightCellIndex].offsetWidth;
+WebInspector.DataGrid._preferredWidthSymbol = Symbol('preferredWidth');
+WebInspector.DataGrid._columnIdSymbol = Symbol('columnId');
- // Give each column some padding so that they don't disappear.
- var leftMinimum = leftEdgeOfPreviousColumn + this.ColumnResizePadding;
- var rightMaximum = rightEdgeOfNextColumn - this.ColumnResizePadding;
- if (leftMinimum > rightMaximum)
- return;
-
- dragPoint = Number.constrain(dragPoint, leftMinimum, rightMaximum);
-
- var position = (dragPoint - this.CenterResizerOverBorderAdjustment);
- resizer.__position = position;
- resizer.style.left = position + "px";
-
- this._setPreferredWidth(leftCellIndex, dragPoint - leftEdgeOfPreviousColumn);
- this._setPreferredWidth(rightCellIndex, rightEdgeOfNextColumn - dragPoint);
-
- var leftColumn = this._visibleColumnsArray[leftCellIndex];
- var rightColumn = this._visibleColumnsArray[rightCellIndex];
- if (leftColumn.weight || rightColumn.weight) {
- var sumOfWeights = leftColumn.weight + rightColumn.weight;
- var delta = rightEdgeOfNextColumn - leftEdgeOfPreviousColumn;
- leftColumn.weight = (dragPoint - leftEdgeOfPreviousColumn) * sumOfWeights / delta;
- rightColumn.weight = (rightEdgeOfNextColumn - dragPoint) * sumOfWeights / delta;
- }
-
- this._positionResizers();
- event.preventDefault();
- this.dispatchEventToListeners(WebInspector.DataGrid.Events.ColumnsResized);
- },
-
- /**
- * @param {number} columnIndex
- * @param {number} width
- */
- _setPreferredWidth: function(columnIndex, width)
- {
- var pxWidth = width + "px";
- this._headerTableColumnGroup.children[columnIndex][WebInspector.DataGrid._preferredWidthSymbol] = width;
- this._headerTableColumnGroup.children[columnIndex].style.width = pxWidth;
- this._dataTableColumnGroup.children[columnIndex].style.width = pxWidth;
- },
-
- /**
- * @param {string} columnId
- * @return {number}
- */
- columnOffset: function(columnId)
- {
- if (!this.element.offsetWidth)
- return 0;
- for (var i = 1; i < this._visibleColumnsArray.length; ++i) {
- if (columnId === this._visibleColumnsArray[i].id) {
- if (this._resizers[i - 1])
- return this._resizers[i - 1].__position;
- }
- }
- return 0;
- },
-
- /**
- * @return {!WebInspector.DataGridWidget}
- */
- asWidget: function()
- {
- if (!this._dataGridWidget)
- this._dataGridWidget = new WebInspector.DataGridWidget(this);
- return this._dataGridWidget;
- },
-
- ColumnResizePadding: 24,
-
- CenterResizerOverBorderAdjustment: 3,
-
- __proto__: WebInspector.Object.prototype
-};
+WebInspector.DataGrid.ColumnResizePadding = 24;
+WebInspector.DataGrid.CenterResizerOverBorderAdjustment = 3;
/** @enum {string} */
WebInspector.DataGrid.ResizeMethod = {
- Nearest: "nearest",
- First: "first",
- Last: "last"
+ Nearest: 'nearest',
+ First: 'first',
+ Last: 'last'
};
/**
- * @constructor
- * @extends {WebInspector.Object}
- * @param {?Object.<string, *>=} data
- * @param {boolean=} hasChildren
+ * @unrestricted
*/
-WebInspector.DataGridNode = function(data, hasChildren)
-{
+WebInspector.DataGridNode = class extends WebInspector.Object {
+ /**
+ * @param {?Object.<string, *>=} data
+ * @param {boolean=} hasChildren
+ */
+ constructor(data, hasChildren) {
+ super();
/** @type {?Element} */
this._element = null;
/** @type {boolean} */
@@ -1288,752 +1241,711 @@ WebInspector.DataGridNode = function(data, hasChildren)
this.nextSibling = null;
/** @type {number} */
this.disclosureToggleWidth = 10;
-};
-WebInspector.DataGridNode.prototype = {
/** @type {boolean} */
- selectable: true,
+ this.selectable = true;
/** @type {boolean} */
- _isRoot: false,
-
- /**
- * @return {!Element}
- */
- element: function()
- {
- if (!this._element) {
- this.createElement();
- this.createCells();
- }
- return /** @type {!Element} */ (this._element);
- },
-
- /**
- * @protected
- */
- createElement: function()
- {
- this._element = createElement("tr");
- this._element._dataGridNode = this;
-
- if (this.hasChildren)
- this._element.classList.add("parent");
- if (this.expanded)
- this._element.classList.add("expanded");
- if (this.selected)
- this._element.classList.add("selected");
- if (this.revealed)
- this._element.classList.add("revealed");
- },
-
- /**
- * @protected
- */
- createCells: function()
- {
- this._element.removeChildren();
- var columnsArray = this.dataGrid._visibleColumnsArray;
- for (var i = 0; i < columnsArray.length; ++i)
- this._element.appendChild(this.createCell(columnsArray[i].id));
- this._element.appendChild(this._createTDWithClass("corner"));
- },
-
- /**
- * @return {!Object.<string, *>}
- */
- get data()
- {
- return this._data;
- },
-
- set data(x)
- {
- this._data = x || {};
- this.refresh();
- },
-
- /**
- * @return {boolean}
- */
- get revealed()
- {
- if (this._revealed !== undefined)
- return this._revealed;
-
- var currentAncestor = this.parent;
- while (currentAncestor && !currentAncestor._isRoot) {
- if (!currentAncestor.expanded) {
- this._revealed = false;
- return false;
- }
-
- currentAncestor = currentAncestor.parent;
- }
-
- this._revealed = true;
- return true;
- },
-
- set revealed(x)
- {
- if (this._revealed === x)
- return;
-
- this._revealed = x;
-
- if (this._element)
- this._element.classList.toggle("revealed", this._revealed);
-
- for (var i = 0; i < this.children.length; ++i)
- this.children[i].revealed = x && this.expanded;
- },
-
- /**
- * @return {boolean}
- */
- get hasChildren()
- {
- return this._hasChildren;
- },
-
- set hasChildren(x)
- {
- if (this._hasChildren === x)
- return;
-
- this._hasChildren = x;
-
- if (!this._element)
- return;
-
- this._element.classList.toggle("parent", this._hasChildren);
- this._element.classList.toggle("expanded", this._hasChildren && this.expanded);
- },
-
- /**
- * @return {number}
- */
- get depth()
- {
- if (this._depth !== undefined)
- return this._depth;
- if (this.parent && !this.parent._isRoot)
- this._depth = this.parent.depth + 1;
- else
- this._depth = 0;
- return this._depth;
- },
-
- /**
- * @return {number}
- */
- get leftPadding()
- {
- return this.depth * this.dataGrid.indentWidth;
- },
-
- /**
- * @return {boolean}
- */
- get shouldRefreshChildren()
- {
- return this._shouldRefreshChildren;
- },
-
- set shouldRefreshChildren(x)
- {
- this._shouldRefreshChildren = x;
- if (x && this.expanded)
- this.expand();
- },
-
- /**
- * @return {boolean}
- */
- get selected()
- {
- return this._selected;
- },
-
- set selected(x)
- {
- if (x)
- this.select();
- else
- this.deselect();
- },
-
- /**
- * @return {boolean}
- */
- get expanded()
- {
- return this._expanded;
- },
-
- set expanded(x)
- {
- if (x)
- this.expand();
- else
- this.collapse();
- },
-
- refresh: function()
- {
- if (!this.dataGrid)
- this._element = null;
- if (!this._element)
- return;
- this.createCells();
- },
-
- /**
- * @param {string} className
- * @return {!Element}
- */
- _createTDWithClass: function(className)
- {
- var cell = createElementWithClass("td", className);
- var cellClass = this.dataGrid._cellClass;
- if (cellClass)
- cell.classList.add(cellClass);
- return cell;
- },
-
- /**
- * @param {string} columnId
- * @return {!Element}
- */
- createTD: function(columnId)
- {
- var cell = this._createTDWithClass(columnId + "-column");
- cell[WebInspector.DataGrid._columnIdSymbol] = columnId;
-
- var alignment = this.dataGrid._columns[columnId].align;
- if (alignment)
- cell.classList.add(alignment);
-
- if (columnId === this.dataGrid.disclosureColumnId) {
- cell.classList.add("disclosure");
- if (this.leftPadding)
- cell.style.setProperty("padding-left", this.leftPadding + "px");
- }
-
- return cell;
- },
-
- /**
- * @param {string} columnId
- * @return {!Element}
- */
- createCell: function(columnId)
- {
- var cell = this.createTD(columnId);
+ this._isRoot = false;
+ }
+
+ /**
+ * @return {!Element}
+ */
+ element() {
+ if (!this._element) {
+ this.createElement();
+ this.createCells();
+ }
+ return /** @type {!Element} */ (this._element);
+ }
+
+ /**
+ * @protected
+ */
+ createElement() {
+ this._element = createElement('tr');
+ this._element._dataGridNode = this;
+
+ if (this.hasChildren)
+ this._element.classList.add('parent');
+ if (this.expanded)
+ this._element.classList.add('expanded');
+ if (this.selected)
+ this._element.classList.add('selected');
+ if (this.revealed)
+ this._element.classList.add('revealed');
+ }
+
+ /**
+ * @protected
+ */
+ createCells() {
+ this._element.removeChildren();
+ var columnsArray = this.dataGrid._visibleColumnsArray;
+ for (var i = 0; i < columnsArray.length; ++i)
+ this._element.appendChild(this.createCell(columnsArray[i].id));
+ this._element.appendChild(this._createTDWithClass('corner'));
+ }
+
+ /**
+ * @return {!Object.<string, *>}
+ */
+ get data() {
+ return this._data;
+ }
+
+ /**
+ * @param {!Object.<string, *>} x
+ */
+ set data(x) {
+ this._data = x || {};
+ this.refresh();
+ }
+
+ /**
+ * @return {boolean}
+ */
+ get revealed() {
+ if (this._revealed !== undefined)
+ return this._revealed;
+
+ var currentAncestor = this.parent;
+ while (currentAncestor && !currentAncestor._isRoot) {
+ if (!currentAncestor.expanded) {
+ this._revealed = false;
+ return false;
+ }
+
+ currentAncestor = currentAncestor.parent;
+ }
+
+ this._revealed = true;
+ return true;
+ }
+
+ /**
+ * @param {boolean} x
+ */
+ set revealed(x) {
+ if (this._revealed === x)
+ return;
+
+ this._revealed = x;
+
+ if (this._element)
+ this._element.classList.toggle('revealed', this._revealed);
+
+ for (var i = 0; i < this.children.length; ++i)
+ this.children[i].revealed = x && this.expanded;
+ }
+
+ /**
+ * @return {boolean}
+ */
+ get hasChildren() {
+ return this._hasChildren;
+ }
+
+ /**
+ * @param {boolean} x
+ */
+ set hasChildren(x) {
+ if (this._hasChildren === x)
+ return;
+
+ this._hasChildren = x;
+
+ if (!this._element)
+ return;
+
+ this._element.classList.toggle('parent', this._hasChildren);
+ this._element.classList.toggle('expanded', this._hasChildren && this.expanded);
+ }
+
+ /**
+ * @return {number}
+ */
+ get depth() {
+ if (this._depth !== undefined)
+ return this._depth;
+ if (this.parent && !this.parent._isRoot)
+ this._depth = this.parent.depth + 1;
+ else
+ this._depth = 0;
+ return this._depth;
+ }
+
+ /**
+ * @return {number}
+ */
+ get leftPadding() {
+ return this.depth * this.dataGrid.indentWidth;
+ }
+
+ /**
+ * @return {boolean}
+ */
+ get shouldRefreshChildren() {
+ return this._shouldRefreshChildren;
+ }
+
+ /**
+ * @param {boolean} x
+ */
+ set shouldRefreshChildren(x) {
+ this._shouldRefreshChildren = x;
+ if (x && this.expanded)
+ this.expand();
+ }
+
+ /**
+ * @return {boolean}
+ */
+ get selected() {
+ return this._selected;
+ }
+
+ /**
+ * @param {boolean} x
+ */
+ set selected(x) {
+ if (x)
+ this.select();
+ else
+ this.deselect();
+ }
+
+ /**
+ * @return {boolean}
+ */
+ get expanded() {
+ return this._expanded;
+ }
+
+ /**
+ * @param {boolean} x
+ */
+ set expanded(x) {
+ if (x)
+ this.expand();
+ else
+ this.collapse();
+ }
+
+ refresh() {
+ if (!this.dataGrid)
+ this._element = null;
+ if (!this._element)
+ return;
+ this.createCells();
+ }
+
+ /**
+ * @param {string} className
+ * @return {!Element}
+ */
+ _createTDWithClass(className) {
+ var cell = createElementWithClass('td', className);
+ var cellClass = this.dataGrid._cellClass;
+ if (cellClass)
+ cell.classList.add(cellClass);
+ return cell;
+ }
+
+ /**
+ * @param {string} columnId
+ * @return {!Element}
+ */
+ createTD(columnId) {
+ var cell = this._createTDWithClass(columnId + '-column');
+ cell[WebInspector.DataGrid._columnIdSymbol] = columnId;
+
+ var alignment = this.dataGrid._columns[columnId].align;
+ if (alignment)
+ cell.classList.add(alignment);
+
+ if (columnId === this.dataGrid.disclosureColumnId) {
+ cell.classList.add('disclosure');
+ if (this.leftPadding)
+ cell.style.setProperty('padding-left', this.leftPadding + 'px');
+ }
+
+ return cell;
+ }
+
+ /**
+ * @param {string} columnId
+ * @return {!Element}
+ */
+ createCell(columnId) {
+ var cell = this.createTD(columnId);
+
+ var data = this.data[columnId];
+ if (data instanceof Node) {
+ cell.appendChild(data);
+ } else {
+ cell.textContent = data;
+ if (this.dataGrid._columns[columnId].longText)
+ cell.title = data;
+ }
+
+ return cell;
+ }
+
+ /**
+ * @return {number}
+ */
+ nodeSelfHeight() {
+ return 16;
+ }
+
+ /**
+ * @param {!WebInspector.DataGridNode} child
+ */
+ appendChild(child) {
+ this.insertChild(child, this.children.length);
+ }
+
+ /**
+ * @param {!WebInspector.DataGridNode} child
+ * @param {number} index
+ */
+ insertChild(child, index) {
+ if (!child)
+ throw 'insertChild: Node can\'t be undefined or null.';
+ 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();
+
+ this.children.splice(index, 0, child);
+ this.hasChildren = true;
+
+ child.parent = this;
+ child.dataGrid = this.dataGrid;
+ child.recalculateSiblings(index);
+
+ child._depth = undefined;
+ child._revealed = undefined;
+ child._attached = false;
+ child._shouldRefreshChildren = true;
+
+ var current = child.children[0];
+ while (current) {
+ current.dataGrid = this.dataGrid;
+ current._depth = undefined;
+ current._revealed = undefined;
+ current._attached = false;
+ current._shouldRefreshChildren = true;
+ current = current.traverseNextNode(false, child, true);
+ }
+
+ if (this.expanded)
+ child._attach();
+ if (!this.revealed)
+ child.revealed = false;
+ }
+
+ remove() {
+ if (this.parent)
+ this.parent.removeChild(this);
+ }
+
+ /**
+ * @param {!WebInspector.DataGridNode} child
+ */
+ removeChild(child) {
+ if (!child)
+ throw 'removeChild: Node can\'t be undefined or null.';
+ if (child.parent !== this)
+ throw 'removeChild: Node is not a child of this node.';
+
+ if (this.dataGrid)
+ this.dataGrid.updateSelectionBeforeRemoval(child, false);
+ child._detach();
+
+ this.children.remove(child, true);
+
+ if (child.previousSibling)
+ child.previousSibling.nextSibling = child.nextSibling;
+ if (child.nextSibling)
+ child.nextSibling.previousSibling = child.previousSibling;
+
+ child.dataGrid = null;
+ child.parent = null;
+ child.nextSibling = null;
+ child.previousSibling = null;
+
+ if (this.children.length <= 0)
+ this.hasChildren = false;
+ }
+
+ removeChildren() {
+ if (this.dataGrid)
+ this.dataGrid.updateSelectionBeforeRemoval(this, true);
+ for (var i = 0; i < this.children.length; ++i) {
+ var child = this.children[i];
+ child._detach();
+ child.dataGrid = null;
+ child.parent = null;
+ child.nextSibling = null;
+ child.previousSibling = null;
+ }
- var data = this.data[columnId];
- if (data instanceof Node) {
- cell.appendChild(data);
- } else {
- cell.textContent = data;
- if (this.dataGrid._columns[columnId].longText)
- cell.title = data;
- }
-
- return cell;
- },
-
- /**
- * @return {number}
- */
- nodeSelfHeight: function()
- {
- return 16;
- },
-
- /**
- * @param {!WebInspector.DataGridNode} child
- */
- appendChild: function(child)
- {
- this.insertChild(child, this.children.length);
- },
+ this.children = [];
+ this.hasChildren = false;
+ }
+
+ /**
+ * @param {number} myIndex
+ */
+ recalculateSiblings(myIndex) {
+ if (!this.parent)
+ return;
+
+ var previousChild = this.parent.children[myIndex - 1] || null;
+ if (previousChild)
+ previousChild.nextSibling = this;
+ this.previousSibling = previousChild;
+
+ var nextChild = this.parent.children[myIndex + 1] || null;
+ if (nextChild)
+ nextChild.previousSibling = this;
+ this.nextSibling = nextChild;
+ }
+
+ collapse() {
+ if (this._isRoot)
+ return;
+ if (this._element)
+ this._element.classList.remove('expanded');
- /**
- * @param {!WebInspector.DataGridNode} child
- * @param {number} index
- */
- insertChild: function(child, index)
- {
- if (!child)
- throw "insertChild: Node can't be undefined or null.";
- 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;
- }
+ this._expanded = false;
- child.remove();
+ for (var i = 0; i < this.children.length; ++i)
+ this.children[i].revealed = false;
+ }
- this.children.splice(index, 0, child);
- this.hasChildren = true;
+ collapseRecursively() {
+ var item = this;
+ while (item) {
+ if (item.expanded)
+ item.collapse();
+ item = item.traverseNextNode(false, this, true);
+ }
+ }
- child.parent = this;
- child.dataGrid = this.dataGrid;
- child.recalculateSiblings(index);
+ populate() {
+ }
- child._depth = undefined;
- child._revealed = undefined;
- child._attached = false;
- child._shouldRefreshChildren = true;
+ expand() {
+ if (!this.hasChildren || this.expanded)
+ return;
+ if (this._isRoot)
+ return;
- var current = child.children[0];
- while (current) {
- current.dataGrid = this.dataGrid;
- current._depth = undefined;
- current._revealed = undefined;
- current._attached = false;
- current._shouldRefreshChildren = true;
- current = current.traverseNextNode(false, child, true);
- }
+ if (this.revealed && !this._shouldRefreshChildren)
+ for (var i = 0; i < this.children.length; ++i)
+ this.children[i].revealed = true;
- if (this.expanded)
- child._attach();
- if (!this.revealed)
- child.revealed = false;
- },
+ if (this._shouldRefreshChildren) {
+ for (var i = 0; i < this.children.length; ++i)
+ this.children[i]._detach();
- remove: function()
- {
- if (this.parent)
- this.parent.removeChild(this);
- },
+ this.populate();
- /**
- * @param {!WebInspector.DataGridNode} child
- */
- removeChild: function(child)
- {
- if (!child)
- throw "removeChild: Node can't be undefined or null.";
- if (child.parent !== this)
- throw "removeChild: Node is not a child of this node.";
-
- if (this.dataGrid)
- this.dataGrid.updateSelectionBeforeRemoval(child, false);
- child._detach();
-
- this.children.remove(child, true);
-
- if (child.previousSibling)
- child.previousSibling.nextSibling = child.nextSibling;
- if (child.nextSibling)
- child.nextSibling.previousSibling = child.previousSibling;
-
- child.dataGrid = null;
- child.parent = null;
- child.nextSibling = null;
- child.previousSibling = null;
-
- if (this.children.length <= 0)
- this.hasChildren = false;
- },
-
- removeChildren: function()
- {
- if (this.dataGrid)
- this.dataGrid.updateSelectionBeforeRemoval(this, true);
+ if (this._attached) {
for (var i = 0; i < this.children.length; ++i) {
- var child = this.children[i];
- child._detach();
- child.dataGrid = null;
- child.parent = null;
- child.nextSibling = null;
- child.previousSibling = null;
- }
-
- this.children = [];
- this.hasChildren = false;
- },
-
- /**
- * @param {number} myIndex
- */
- recalculateSiblings: function(myIndex)
- {
- if (!this.parent)
- return;
-
- var previousChild = this.parent.children[myIndex - 1] || null;
- if (previousChild)
- previousChild.nextSibling = this;
- this.previousSibling = previousChild;
-
- var nextChild = this.parent.children[myIndex + 1] || null;
- if (nextChild)
- nextChild.previousSibling = this;
- this.nextSibling = nextChild;
- },
-
- collapse: function()
- {
- if (this._isRoot)
- return;
- if (this._element)
- this._element.classList.remove("expanded");
-
- this._expanded = false;
-
- for (var i = 0; i < this.children.length; ++i)
- this.children[i].revealed = false;
- },
-
- collapseRecursively: function()
- {
- var item = this;
- while (item) {
- if (item.expanded)
- item.collapse();
- item = item.traverseNextNode(false, this, true);
+ var child = this.children[i];
+ if (this.revealed)
+ child.revealed = true;
+ child._attach();
}
- },
-
- populate: function() { },
-
- expand: function()
- {
- if (!this.hasChildren || this.expanded)
- return;
- if (this._isRoot)
- return;
-
- if (this.revealed && !this._shouldRefreshChildren)
- for (var i = 0; i < this.children.length; ++i)
- this.children[i].revealed = true;
-
- if (this._shouldRefreshChildren) {
- for (var i = 0; i < this.children.length; ++i)
- this.children[i]._detach();
-
- this.populate();
-
- if (this._attached) {
- for (var i = 0; i < this.children.length; ++i) {
- var child = this.children[i];
- if (this.revealed)
- child.revealed = true;
- child._attach();
- }
- }
-
- this._shouldRefreshChildren = false;
- }
-
- if (this._element)
- this._element.classList.add("expanded");
-
- this._expanded = true;
- },
-
- expandRecursively: function()
- {
- var item = this;
- while (item) {
- item.expand();
- item = item.traverseNextNode(false, this);
- }
- },
-
- reveal: function()
- {
- if (this._isRoot)
- return;
- var currentAncestor = this.parent;
- while (currentAncestor && !currentAncestor._isRoot) {
- if (!currentAncestor.expanded)
- currentAncestor.expand();
- currentAncestor = currentAncestor.parent;
- }
-
- this.element().scrollIntoViewIfNeeded(false);
- },
-
- /**
- * @param {boolean=} supressSelectedEvent
- */
- select: function(supressSelectedEvent)
- {
- if (!this.dataGrid || !this.selectable || this.selected)
- return;
-
- if (this.dataGrid.selectedNode)
- this.dataGrid.selectedNode.deselect();
-
- this._selected = true;
- this.dataGrid.selectedNode = this;
-
- if (this._element)
- this._element.classList.add("selected");
-
- if (!supressSelectedEvent)
- this.dataGrid.dispatchEventToListeners(WebInspector.DataGrid.Events.SelectedNode);
- },
-
- revealAndSelect: function()
- {
- if (this._isRoot)
- return;
- this.reveal();
- this.select();
- },
-
- /**
- * @param {boolean=} supressDeselectedEvent
- */
- deselect: function(supressDeselectedEvent)
- {
- if (!this.dataGrid || this.dataGrid.selectedNode !== this || !this.selected)
- return;
+ }
+
+ this._shouldRefreshChildren = false;
+ }
+
+ if (this._element)
+ this._element.classList.add('expanded');
+
+ this._expanded = true;
+ }
+
+ expandRecursively() {
+ var item = this;
+ while (item) {
+ item.expand();
+ item = item.traverseNextNode(false, this);
+ }
+ }
+
+ reveal() {
+ if (this._isRoot)
+ return;
+ var currentAncestor = this.parent;
+ while (currentAncestor && !currentAncestor._isRoot) {
+ if (!currentAncestor.expanded)
+ currentAncestor.expand();
+ currentAncestor = currentAncestor.parent;
+ }
+
+ this.element().scrollIntoViewIfNeeded(false);
+ }
+
+ /**
+ * @param {boolean=} supressSelectedEvent
+ */
+ select(supressSelectedEvent) {
+ if (!this.dataGrid || !this.selectable || this.selected)
+ return;
+
+ if (this.dataGrid.selectedNode)
+ this.dataGrid.selectedNode.deselect();
+
+ this._selected = true;
+ this.dataGrid.selectedNode = this;
+
+ if (this._element)
+ this._element.classList.add('selected');
+
+ if (!supressSelectedEvent)
+ this.dataGrid.dispatchEventToListeners(WebInspector.DataGrid.Events.SelectedNode);
+ }
+
+ revealAndSelect() {
+ if (this._isRoot)
+ return;
+ this.reveal();
+ this.select();
+ }
+
+ /**
+ * @param {boolean=} supressDeselectedEvent
+ */
+ deselect(supressDeselectedEvent) {
+ if (!this.dataGrid || this.dataGrid.selectedNode !== this || !this.selected)
+ return;
- this._selected = false;
- this.dataGrid.selectedNode = null;
-
- if (this._element)
- this._element.classList.remove("selected");
-
- if (!supressDeselectedEvent)
- this.dataGrid.dispatchEventToListeners(WebInspector.DataGrid.Events.DeselectedNode);
- },
-
- /**
- * @param {boolean} skipHidden
- * @param {?WebInspector.DataGridNode=} stayWithin
- * @param {boolean=} dontPopulate
- * @param {!Object=} info
- * @return {?WebInspector.DataGridNode}
- */
- traverseNextNode: function(skipHidden, stayWithin, dontPopulate, info)
- {
- if (!dontPopulate && this.hasChildren)
- this.populate();
-
- if (info)
- info.depthChange = 0;
-
- var node = (!skipHidden || this.revealed) ? this.children[0] : null;
- if (node && (!skipHidden || this.expanded)) {
- if (info)
- info.depthChange = 1;
- return node;
- }
-
- if (this === stayWithin)
- return null;
-
- node = (!skipHidden || this.revealed) ? this.nextSibling : null;
- if (node)
- return node;
-
- node = this;
- while (node && !node._isRoot && !((!skipHidden || node.revealed) ? node.nextSibling : null) && node.parent !== stayWithin) {
- if (info)
- info.depthChange -= 1;
- node = node.parent;
- }
-
- if (!node)
- return null;
-
- return (!skipHidden || node.revealed) ? node.nextSibling : null;
- },
-
- /**
- * @param {boolean} skipHidden
- * @param {boolean=} dontPopulate
- * @return {?WebInspector.DataGridNode}
- */
- traversePreviousNode: function(skipHidden, dontPopulate)
- {
- var node = (!skipHidden || this.revealed) ? this.previousSibling : null;
- if (!dontPopulate && node && node.hasChildren)
- node.populate();
-
- while (node && ((!skipHidden || (node.revealed && node.expanded)) ? node.children[node.children.length - 1] : null)) {
- if (!dontPopulate && node.hasChildren)
- node.populate();
- node = ((!skipHidden || (node.revealed && node.expanded)) ? node.children[node.children.length - 1] : null);
- }
-
- if (node)
- return node;
-
- if (!this.parent || this.parent._isRoot)
- return null;
-
- return this.parent;
- },
-
- /**
- * @param {!Event} event
- * @return {boolean}
- */
- isEventWithinDisclosureTriangle: function(event)
- {
- if (!this.hasChildren)
- return false;
- var cell = event.target.enclosingNodeOrSelfWithNodeName("td");
- if (!cell || !cell.classList.contains("disclosure"))
- return false;
-
- var left = cell.totalOffsetLeft() + this.leftPadding;
- return event.pageX >= left && event.pageX <= left + this.disclosureToggleWidth;
- },
-
- _attach: function()
- {
- if (!this.dataGrid || this._attached)
- return;
-
- this._attached = true;
-
- var previousNode = this.traversePreviousNode(true, true);
- var previousElement = previousNode ? previousNode.element() : this.dataGrid._topFillerRow;
- this.dataGrid.dataTableBody.insertBefore(this.element(), previousElement.nextSibling);
-
- if (this.expanded) {
- for (var i = 0; i < this.children.length; ++i)
- this.children[i]._attach();
- }
- },
-
- _detach: function()
- {
- if (!this._attached)
- return;
-
- this._attached = false;
+ this._selected = false;
+ this.dataGrid.selectedNode = null;
+
+ if (this._element)
+ this._element.classList.remove('selected');
+
+ if (!supressDeselectedEvent)
+ this.dataGrid.dispatchEventToListeners(WebInspector.DataGrid.Events.DeselectedNode);
+ }
+
+ /**
+ * @param {boolean} skipHidden
+ * @param {?WebInspector.DataGridNode=} stayWithin
+ * @param {boolean=} dontPopulate
+ * @param {!Object=} info
+ * @return {?WebInspector.DataGridNode}
+ */
+ traverseNextNode(skipHidden, stayWithin, dontPopulate, info) {
+ if (!dontPopulate && this.hasChildren)
+ this.populate();
+
+ if (info)
+ info.depthChange = 0;
+
+ var node = (!skipHidden || this.revealed) ? this.children[0] : null;
+ if (node && (!skipHidden || this.expanded)) {
+ if (info)
+ info.depthChange = 1;
+ return node;
+ }
+
+ if (this === stayWithin)
+ return null;
+
+ node = (!skipHidden || this.revealed) ? this.nextSibling : null;
+ if (node)
+ return node;
+
+ node = this;
+ while (node && !node._isRoot && !((!skipHidden || node.revealed) ? node.nextSibling : null) &&
+ node.parent !== stayWithin) {
+ if (info)
+ info.depthChange -= 1;
+ node = node.parent;
+ }
+
+ if (!node)
+ return null;
+
+ return (!skipHidden || node.revealed) ? node.nextSibling : null;
+ }
+
+ /**
+ * @param {boolean} skipHidden
+ * @param {boolean=} dontPopulate
+ * @return {?WebInspector.DataGridNode}
+ */
+ traversePreviousNode(skipHidden, dontPopulate) {
+ var node = (!skipHidden || this.revealed) ? this.previousSibling : null;
+ if (!dontPopulate && node && node.hasChildren)
+ node.populate();
+
+ while (node &&
+ ((!skipHidden || (node.revealed && node.expanded)) ? node.children[node.children.length - 1] : null)) {
+ if (!dontPopulate && node.hasChildren)
+ node.populate();
+ node = ((!skipHidden || (node.revealed && node.expanded)) ? node.children[node.children.length - 1] : null);
+ }
+
+ if (node)
+ return node;
+
+ if (!this.parent || this.parent._isRoot)
+ return null;
+
+ return this.parent;
+ }
+
+ /**
+ * @param {!Event} event
+ * @return {boolean}
+ */
+ isEventWithinDisclosureTriangle(event) {
+ if (!this.hasChildren)
+ return false;
+ var cell = event.target.enclosingNodeOrSelfWithNodeName('td');
+ if (!cell || !cell.classList.contains('disclosure'))
+ return false;
+
+ var left = cell.totalOffsetLeft() + this.leftPadding;
+ return event.pageX >= left && event.pageX <= left + this.disclosureToggleWidth;
+ }
+
+ _attach() {
+ if (!this.dataGrid || this._attached)
+ return;
+
+ this._attached = true;
+
+ var previousNode = this.traversePreviousNode(true, true);
+ var previousElement = previousNode ? previousNode.element() : this.dataGrid._topFillerRow;
+ this.dataGrid.dataTableBody.insertBefore(this.element(), previousElement.nextSibling);
+
+ if (this.expanded) {
+ for (var i = 0; i < this.children.length; ++i)
+ this.children[i]._attach();
+ }
+ }
+
+ _detach() {
+ if (!this._attached)
+ return;
- if (this._element)
- this._element.remove();
+ this._attached = false;
- for (var i = 0; i < this.children.length; ++i)
- this.children[i]._detach();
+ if (this._element)
+ this._element.remove();
- this.wasDetached();
- },
+ for (var i = 0; i < this.children.length; ++i)
+ this.children[i]._detach();
- wasDetached: function()
- {
- },
+ this.wasDetached();
+ }
- savePosition: function()
- {
- if (this._savedPosition)
- return;
+ wasDetached() {
+ }
- if (!this.parent)
- throw "savePosition: Node must have a parent.";
- this._savedPosition = {
- parent: this.parent,
- index: this.parent.children.indexOf(this)
- };
- },
+ savePosition() {
+ if (this._savedPosition)
+ return;
- restorePosition: function()
- {
- if (!this._savedPosition)
- return;
+ if (!this.parent)
+ throw 'savePosition: Node must have a parent.';
+ this._savedPosition = {parent: this.parent, index: this.parent.children.indexOf(this)};
+ }
- if (this.parent !== this._savedPosition.parent)
- this._savedPosition.parent.insertChild(this, this._savedPosition.index);
+ restorePosition() {
+ if (!this._savedPosition)
+ return;
- this._savedPosition = null;
- },
+ if (this.parent !== this._savedPosition.parent)
+ this._savedPosition.parent.insertChild(this, this._savedPosition.index);
- __proto__: WebInspector.Object.prototype
+ this._savedPosition = null;
+ }
};
/**
- * @constructor
- * @extends {WebInspector.DataGridNode}
+ * @unrestricted
*/
-WebInspector.CreationDataGridNode = function(data, hasChildren)
-{
- WebInspector.DataGridNode.call(this, data, hasChildren);
+WebInspector.CreationDataGridNode = class extends WebInspector.DataGridNode {
+ constructor(data, hasChildren) {
+ super(data, hasChildren);
/** @type {boolean} */
this.isCreationNode = true;
-};
+ }
-WebInspector.CreationDataGridNode.prototype = {
- makeNormal: function()
- {
- this.isCreationNode = false;
- },
-
- __proto__: WebInspector.DataGridNode.prototype
+ makeNormal() {
+ this.isCreationNode = false;
+ }
};
/**
- * @constructor
- * @extends {WebInspector.VBox}
- * @param {!WebInspector.DataGrid} dataGrid
+ * @unrestricted
*/
-WebInspector.DataGridWidget = function(dataGrid)
-{
- WebInspector.VBox.call(this);
+WebInspector.DataGridWidget = class extends WebInspector.VBox {
+ /**
+ * @param {!WebInspector.DataGrid} dataGrid
+ */
+ constructor(dataGrid) {
+ super();
this._dataGrid = dataGrid;
this.element.appendChild(dataGrid.element);
-};
-
-WebInspector.DataGridWidget.prototype = {
- /**
- * @override
- */
- wasShown: function()
- {
- this._dataGrid.wasShown();
- },
-
- /**
- * @override
- */
- willHide: function()
- {
- this._dataGrid.willHide();
- },
-
- /**
- * @override
- */
- onResize: function()
- {
- this._dataGrid.onResize();
- },
-
- /**
- * @override
- * @return {!Array.<!Element>}
- */
- elementsToRestoreScrollPositionsFor: function()
- {
- return [ this._dataGrid._scrollContainer ];
- },
-
- /**
- * @override
- */
- detachChildWidgets: function()
- {
- WebInspector.Widget.prototype.detachChildWidgets.call(this);
- for (var dataGrid of this._dataGrids)
- this.element.removeChild(dataGrid.element);
- this._dataGrids = [];
- },
-
- __proto__: WebInspector.VBox.prototype
+ }
+
+ /**
+ * @override
+ */
+ wasShown() {
+ this._dataGrid.wasShown();
+ }
+
+ /**
+ * @override
+ */
+ willHide() {
+ this._dataGrid.willHide();
+ }
+
+ /**
+ * @override
+ */
+ onResize() {
+ this._dataGrid.onResize();
+ }
+
+ /**
+ * @override
+ * @return {!Array.<!Element>}
+ */
+ elementsToRestoreScrollPositionsFor() {
+ return [this._dataGrid._scrollContainer];
+ }
+
+ /**
+ * @override
+ */
+ detachChildWidgets() {
+ super.detachChildWidgets();
+ for (var dataGrid of this._dataGrids)
+ this.element.removeChild(dataGrid.element);
+ this._dataGrids = [];
+ }
};

Powered by Google App Engine
This is Rietveld 408576698