| 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 b2ca69ba1535735f92c87107324d44ce508ef405..3b5f34bf7d85e0f2f98a8c1ae53885f857af44cd 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
|
| @@ -30,14 +30,14 @@
|
| * @param {function(!WebInspector.DataGridNode, string, string, string)=} editCallback
|
| * @param {function(!WebInspector.DataGridNode)=} deleteCallback
|
| * @param {function()=} refreshCallback
|
| - * @param {function(!WebInspector.ContextMenu, !WebInspector.DataGridNode)=} contextMenuCallback
|
| */
|
| -WebInspector.DataGrid = function(columnsArray, editCallback, deleteCallback, refreshCallback, contextMenuCallback)
|
| +WebInspector.DataGrid = function(columnsArray, editCallback, deleteCallback, refreshCallback)
|
| {
|
| 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);
|
|
|
| /** @type {function(!WebInspector.DataGridNode, string, string, string)|undefined} */
|
| this._editCallback = editCallback;
|
| @@ -45,8 +45,6 @@ WebInspector.DataGrid = function(columnsArray, editCallback, deleteCallback, ref
|
| this._deleteCallback = deleteCallback;
|
| /** @type {function()|undefined} */
|
| this._refreshCallback = refreshCallback;
|
| - /** @type {function(!WebInspector.ContextMenu, !WebInspector.DataGridNode)|undefined} */
|
| - this._contextMenuCallback = contextMenuCallback;
|
|
|
| var headerContainer = this.element.createChild("div", "header-container");
|
| /** @type {!Element} */
|
| @@ -64,7 +62,6 @@ WebInspector.DataGrid = function(columnsArray, editCallback, deleteCallback, ref
|
| 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("contextmenu", this._contextMenuInDataTable.bind(this), true);
|
|
|
| /** @type {boolean} */
|
| this._inline = false;
|
| @@ -120,6 +117,11 @@ WebInspector.DataGrid = function(columnsArray, editCallback, deleteCallback, ref
|
| this._cornerWidth = WebInspector.DataGrid.CornerWidth;
|
| /** @type {!WebInspector.DataGrid.ResizeMethod} */
|
| this._resizeMethod = WebInspector.DataGrid.ResizeMethod.Nearest;
|
| +
|
| + /** @type {?function(!WebInspector.ContextMenu)} */
|
| + this._headerContextMenuCallback = null;
|
| + /** @type {?function(!WebInspector.ContextMenu, !WebInspector.DataGridNode)} */
|
| + this._rowContextMenuCallback = null;
|
| };
|
|
|
| // Keep in sync with .data-grid col.corner style rule.
|
| @@ -333,15 +335,18 @@ WebInspector.DataGrid.prototype = {
|
| return this._rootNode;
|
| },
|
|
|
| + /**
|
| + * @param {!Event} event
|
| + */
|
| _ondblclick: function(event)
|
| {
|
| if (this._editing || this._editingNode)
|
| return;
|
|
|
| - var columnId = this.columnIdFromNode(event.target);
|
| + var columnId = this.columnIdFromNode(/** @type {!Node} */ (event.target));
|
| if (!columnId || !this._columns[columnId].editable)
|
| return;
|
| - this._startEditing(event.target);
|
| + this._startEditing(/** @type {!Node} */ (event.target));
|
| },
|
|
|
| /**
|
| @@ -360,9 +365,12 @@ WebInspector.DataGrid.prototype = {
|
| element.getComponentSelection().setBaseAndExtent(element, 0, element, 1);
|
| },
|
|
|
| + /**
|
| + * @param {!Node} target
|
| + */
|
| _startEditing: function(target)
|
| {
|
| - var element = target.enclosingNodeOrSelfWithNodeName("td");
|
| + var element = /** @type {?Element} */ (target.enclosingNodeOrSelfWithNodeName("td"));
|
| if (!element)
|
| return;
|
|
|
| @@ -374,8 +382,10 @@ WebInspector.DataGrid.prototype = {
|
| }
|
|
|
| // Force editing the 1st column when editing the creation node
|
| - if (this._editingNode.isCreationNode)
|
| - return this._startEditingColumnOfDataGridNode(this._editingNode, this._nextEditableColumn(-1));
|
| + if (this._editingNode.isCreationNode) {
|
| + this._startEditingColumnOfDataGridNode(this._editingNode, this._nextEditableColumn(-1));
|
| + return;
|
| + }
|
|
|
| this._editing = true;
|
| WebInspector.InplaceEditor.startEditing(element, this._startEditingConfig(element));
|
| @@ -391,11 +401,22 @@ WebInspector.DataGrid.prototype = {
|
| 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);
|
| @@ -405,7 +426,7 @@ WebInspector.DataGrid.prototype = {
|
| }
|
| var column = this._columns[columnId];
|
| var cellIndex = this._visibleColumnsArray.indexOf(column);
|
| - var textBeforeEditing = this._editingNode.data[columnId];
|
| + var textBeforeEditing = /** @type {string} */ (this._editingNode.data[columnId]);
|
| var currentEditingNode = this._editingNode;
|
|
|
| /**
|
| @@ -423,28 +444,35 @@ WebInspector.DataGrid.prototype = {
|
| return;
|
|
|
| var nextEditableColumn = this._nextEditableColumn(cellIndex);
|
| - if (nextEditableColumn !== -1)
|
| - return this._startEditingColumnOfDataGridNode(currentEditingNode, nextEditableColumn);
|
| + if (nextEditableColumn !== -1) {
|
| + this._startEditingColumnOfDataGridNode(currentEditingNode, nextEditableColumn);
|
| + return;
|
| + }
|
|
|
| var nextDataGridNode = currentEditingNode.traverseNextNode(true, null, true);
|
| - if (nextDataGridNode)
|
| - return this._startEditingColumnOfDataGridNode(nextDataGridNode, firstEditableColumn);
|
| + if (nextDataGridNode) {
|
| + this._startEditingColumnOfDataGridNode(nextDataGridNode, firstEditableColumn);
|
| + return;
|
| + }
|
| if (currentEditingNode.isCreationNode && wasChange) {
|
| this.addCreationNode(false);
|
| - return this._startEditingColumnOfDataGridNode(this.creationNode, firstEditableColumn);
|
| + this._startEditingColumnOfDataGridNode(this.creationNode, firstEditableColumn);
|
| + return;
|
| }
|
| return;
|
| }
|
|
|
| if (moveDirection === "backward") {
|
| var prevEditableColumn = this._nextEditableColumn(cellIndex, true);
|
| - if (prevEditableColumn !== -1)
|
| - return this._startEditingColumnOfDataGridNode(currentEditingNode, prevEditableColumn);
|
| + if (prevEditableColumn !== -1) {
|
| + this._startEditingColumnOfDataGridNode(currentEditingNode, prevEditableColumn);
|
| + return;
|
| + }
|
|
|
| var lastEditableColumn = this._nextEditableColumn(this._visibleColumnsArray.length, true);
|
| var nextDataGridNode = currentEditingNode.traversePreviousNode(true, true);
|
| if (nextDataGridNode)
|
| - return this._startEditingColumnOfDataGridNode(nextDataGridNode, lastEditableColumn);
|
| + this._startEditingColumnOfDataGridNode(nextDataGridNode, lastEditableColumn);
|
| return;
|
| }
|
| }
|
| @@ -469,6 +497,9 @@ WebInspector.DataGrid.prototype = {
|
| moveToNextIfNeeded.call(this, true);
|
| },
|
|
|
| + /**
|
| + * @param {!Element} element
|
| + */
|
| _editingCancelled: function(element)
|
| {
|
| this._editing = false;
|
| @@ -601,12 +632,18 @@ WebInspector.DataGrid.prototype = {
|
| 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;
|
| + return [];
|
| for (var i = 0; i < rootNode.children.length; ++i)
|
| this._enumerateChildren(rootNode.children[i], result, maxLevel - 1);
|
| return result;
|
| @@ -807,6 +844,9 @@ WebInspector.DataGrid.prototype = {
|
| this.rootNode().appendChild(this.creationNode);
|
| },
|
|
|
| + /**
|
| + * @param {!Event} event
|
| + */
|
| _keyDown: function(event)
|
| {
|
| if (!this.selectedNode || event.shiftKey || event.metaKey || event.ctrlKey || this._editing)
|
| @@ -929,6 +969,9 @@ WebInspector.DataGrid.prototype = {
|
| return cellElement && cellElement[WebInspector.DataGrid._columnIdSymbol];
|
| },
|
|
|
| + /**
|
| + * @param {!Event} event
|
| + */
|
| _clickInHeaderCell: function(event)
|
| {
|
| var cell = event.target.enclosingNodeOrSelfWithNodeName("th");
|
| @@ -969,16 +1012,17 @@ WebInspector.DataGrid.prototype = {
|
| return this._headerTableHeaders[columnId];
|
| },
|
|
|
| + /**
|
| + * @param {!Event} event
|
| + */
|
| _mouseDownInDataTable: function(event)
|
| {
|
| - var gridNode = this.dataGridNodeFromNode(event.target);
|
| - if (!gridNode || !gridNode.selectable)
|
| - return;
|
| -
|
| - if (gridNode.isEventWithinDisclosureTriangle(event))
|
| + var target = /** @type {!Node} */ (event.target);
|
| + var gridNode = this.dataGridNodeFromNode(target);
|
| + if (!gridNode || !gridNode.selectable || gridNode.isEventWithinDisclosureTriangle(event))
|
| return;
|
|
|
| - var columnId = this.columnIdFromNode(event.target);
|
| + var columnId = this.columnIdFromNode(target);
|
| if (columnId && this._columns[columnId].nonSelectable)
|
| return;
|
|
|
| @@ -991,40 +1035,66 @@ WebInspector.DataGrid.prototype = {
|
| gridNode.select();
|
| },
|
|
|
| - _contextMenuInDataTable: function(event)
|
| + /**
|
| + * @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(event.target);
|
| + 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, event.target));
|
| + contextMenu.appendItem(WebInspector.UIString.capitalize("Add ^new"), this._startEditing.bind(this, target));
|
| else {
|
| - var columnId = this.columnIdFromNode(event.target);
|
| + 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, event.target));
|
| + 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._contextMenuCallback)
|
| - this._contextMenuCallback(contextMenu, gridNode);
|
| + if (this._rowContextMenuCallback)
|
| + this._rowContextMenuCallback(contextMenu, gridNode);
|
| }
|
|
|
| contextMenu.show();
|
| },
|
|
|
| + /**
|
| + * @param {!Event} event
|
| + */
|
| _clickInDataTable: function(event)
|
| {
|
| - var gridNode = this.dataGridNodeFromNode(event.target);
|
| - if (!gridNode || !gridNode.hasChildren)
|
| - return;
|
| -
|
| - if (!gridNode.isEventWithinDisclosureTriangle(event))
|
| + var gridNode = this.dataGridNodeFromNode(/** @type {!Node} */ (event.target));
|
| + if (!gridNode || !gridNode.hasChildren || !gridNode.isEventWithinDisclosureTriangle(event))
|
| return;
|
|
|
| if (gridNode.expanded) {
|
| @@ -1049,6 +1119,7 @@ WebInspector.DataGrid.prototype = {
|
| },
|
|
|
| /**
|
| + * @param {!Event} event
|
| * @return {boolean}
|
| */
|
| _startResizerDragging: function(event)
|
| @@ -1057,6 +1128,16 @@ WebInspector.DataGrid.prototype = {
|
| 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;
|
| @@ -1143,13 +1224,6 @@ WebInspector.DataGrid.prototype = {
|
| return 0;
|
| },
|
|
|
| - _endResizerDragging: function(event)
|
| - {
|
| - this._currentResizer = null;
|
| - this._saveColumnWeights();
|
| - this.dispatchEventToListeners(WebInspector.DataGrid.Events.ColumnsResized);
|
| - },
|
| -
|
| /**
|
| * @return {!WebInspector.DataGridWidget}
|
| */
|
| @@ -1265,6 +1339,9 @@ WebInspector.DataGridNode.prototype = {
|
| this._element.appendChild(this._createTDWithClass("corner"));
|
| },
|
|
|
| + /**
|
| + * @return {!Object.<string, *>}
|
| + */
|
| get data()
|
| {
|
| return this._data;
|
| @@ -1276,6 +1353,9 @@ WebInspector.DataGridNode.prototype = {
|
| this.refresh();
|
| },
|
|
|
| + /**
|
| + * @return {boolean}
|
| + */
|
| get revealed()
|
| {
|
| if (this._revealed !== undefined)
|
| @@ -1295,37 +1375,40 @@ WebInspector.DataGridNode.prototype = {
|
| return true;
|
| },
|
|
|
| - set hasChildren(x)
|
| + set revealed(x)
|
| {
|
| - if (this._hasChildren === x)
|
| + if (this._revealed === x)
|
| return;
|
|
|
| - this._hasChildren = x;
|
| + this._revealed = x;
|
|
|
| - if (!this._element)
|
| - return;
|
| + if (this._element)
|
| + this._element.classList.toggle("revealed", this._revealed);
|
|
|
| - this._element.classList.toggle("parent", this._hasChildren);
|
| - this._element.classList.toggle("expanded", this._hasChildren && this.expanded);
|
| + for (var i = 0; i < this.children.length; ++i)
|
| + this.children[i].revealed = x && this.expanded;
|
| },
|
|
|
| + /**
|
| + * @return {boolean}
|
| + */
|
| get hasChildren()
|
| {
|
| return this._hasChildren;
|
| },
|
|
|
| - set revealed(x)
|
| + set hasChildren(x)
|
| {
|
| - if (this._revealed === x)
|
| + if (this._hasChildren === x)
|
| return;
|
|
|
| - this._revealed = x;
|
| + this._hasChildren = x;
|
|
|
| - if (this._element)
|
| - this._element.classList.toggle("revealed", this._revealed);
|
| + if (!this._element)
|
| + return;
|
|
|
| - for (var i = 0; i < this.children.length; ++i)
|
| - this.children[i].revealed = x && this.expanded;
|
| + this._element.classList.toggle("parent", this._hasChildren);
|
| + this._element.classList.toggle("expanded", this._hasChildren && this.expanded);
|
| },
|
|
|
| /**
|
| @@ -1342,11 +1425,17 @@ WebInspector.DataGridNode.prototype = {
|
| return this._depth;
|
| },
|
|
|
| + /**
|
| + * @return {number}
|
| + */
|
| get leftPadding()
|
| {
|
| return this.depth * this.dataGrid.indentWidth;
|
| },
|
|
|
| + /**
|
| + * @return {boolean}
|
| + */
|
| get shouldRefreshChildren()
|
| {
|
| return this._shouldRefreshChildren;
|
| @@ -1359,6 +1448,9 @@ WebInspector.DataGridNode.prototype = {
|
| this.expand();
|
| },
|
|
|
| + /**
|
| + * @return {boolean}
|
| + */
|
| get selected()
|
| {
|
| return this._selected;
|
| @@ -1372,14 +1464,14 @@ WebInspector.DataGridNode.prototype = {
|
| this.deselect();
|
| },
|
|
|
| + /**
|
| + * @return {boolean}
|
| + */
|
| get expanded()
|
| {
|
| return this._expanded;
|
| },
|
|
|
| - /**
|
| - * @param {boolean} x
|
| - */
|
| set expanded(x)
|
| {
|
| if (x)
|
| @@ -1787,6 +1879,7 @@ WebInspector.DataGridNode.prototype = {
|
| },
|
|
|
| /**
|
| + * @param {!Event} event
|
| * @return {boolean}
|
| */
|
| isEventWithinDisclosureTriangle: function(event)
|
| @@ -1812,9 +1905,10 @@ WebInspector.DataGridNode.prototype = {
|
| var previousElement = previousNode ? previousNode.element() : this.dataGrid._topFillerRow;
|
| this.dataGrid.dataTableBody.insertBefore(this.element(), previousElement.nextSibling);
|
|
|
| - if (this.expanded)
|
| + if (this.expanded) {
|
| for (var i = 0; i < this.children.length; ++i)
|
| this.children[i]._attach();
|
| + }
|
| },
|
|
|
| _detach: function()
|
|
|