diff options
author | Ben Murdoch <benm@google.com> | 2010-10-22 13:02:20 +0100 |
---|---|---|
committer | Ben Murdoch <benm@google.com> | 2010-10-26 15:21:41 +0100 |
commit | a94275402997c11dd2e778633dacf4b7e630a35d (patch) | |
tree | e66f56c67e3b01f22c9c23cd932271ee9ac558ed /WebCore/inspector/front-end/DataGrid.js | |
parent | 09e26c78506587b3f5d930d7bc72a23287ffbec0 (diff) | |
download | external_webkit-a94275402997c11dd2e778633dacf4b7e630a35d.zip external_webkit-a94275402997c11dd2e778633dacf4b7e630a35d.tar.gz external_webkit-a94275402997c11dd2e778633dacf4b7e630a35d.tar.bz2 |
Merge WebKit at r70209: Initial merge by Git
Change-Id: Id23a68efa36e9d1126bcce0b137872db00892c8e
Diffstat (limited to 'WebCore/inspector/front-end/DataGrid.js')
-rw-r--r-- | WebCore/inspector/front-end/DataGrid.js | 212 |
1 files changed, 171 insertions, 41 deletions
diff --git a/WebCore/inspector/front-end/DataGrid.js b/WebCore/inspector/front-end/DataGrid.js index f68fe48..3007497 100644 --- a/WebCore/inspector/front-end/DataGrid.js +++ b/WebCore/inspector/front-end/DataGrid.js @@ -32,6 +32,7 @@ WebInspector.DataGrid = function(columns, editCallback, deleteCallback) this._headerTable = document.createElement("table"); this._headerTable.className = "header"; + this._headerTableHeaders = {}; this._dataTable = document.createElement("table"); this._dataTable.className = "data"; @@ -77,9 +78,13 @@ WebInspector.DataGrid = function(columns, editCallback, deleteCallback) var cell = document.createElement("th"); cell.className = columnIdentifier + "-column"; cell.columnIdentifier = columnIdentifier; + this._headerTableHeaders[columnIdentifier] = cell; var div = document.createElement("div"); - div.textContent = column.title; + if (column.titleDOMFragment) + div.appendChild(column.titleDOMFragment); + else + div.textContent = column.title; cell.appendChild(div); if (column.sort) { @@ -113,16 +118,27 @@ WebInspector.DataGrid = function(columns, editCallback, deleteCallback) var fillerRow = document.createElement("tr"); fillerRow.className = "filler"; - for (var i = 0; i < this._columnCount; ++i) { + for (var columnIdentifier in columns) { + var column = columns[columnIdentifier]; var cell = document.createElement("td"); + cell.className = columnIdentifier + "-column"; fillerRow.appendChild(cell); } - + this._dataTableColumnGroup = columnGroup.cloneNode(true); this._dataTable.appendChild(this._dataTableColumnGroup); this.dataTableBody.appendChild(fillerRow); this.columns = columns || {}; + this._columnsArray = []; + for (var columnIdentifier in columns) { + columns[columnIdentifier].ordinal = this._columnsArray.length; + this._columnsArray.push(columns[columnIdentifier]); + } + + for (var i = 0; i < this._columnsArray.length; ++i) + this._columnsArray[i].bodyElement = this._dataTableColumnGroup.children[i]; + this.children = []; this.selectedNode = null; this.expandNodesWhenArrowing = false; @@ -134,7 +150,7 @@ WebInspector.DataGrid = function(columns, editCallback, deleteCallback) this.dataGrid = this; this.indentWidth = 15; this.resizers = []; - this.columnWidthsInitialized = false; + this._columnWidthsInitialized = false; } WebInspector.DataGrid.prototype = { @@ -351,7 +367,7 @@ WebInspector.DataGrid.prototype = { for (var columnIdentifier in columns) columns[columnIdentifier].element.style.width = widths[columnIdentifier] + "%"; - this.columnWidthsInitialized = false; + this._columnWidthsInitialized = false; this.updateWidths(); }, @@ -369,11 +385,10 @@ WebInspector.DataGrid.prototype = { { var headerTableColumns = this._headerTableColumnGroup.children; - var left = 0; var tableWidth = this._dataTable.offsetWidth; var numColumns = headerTableColumns.length; - if (!this.columnWidthsInitialized) { + if (!this._columnWidthsInitialized) { // 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 @@ -384,9 +399,86 @@ WebInspector.DataGrid.prototype = { this._headerTableColumnGroup.children[i].style.width = percentWidth; this._dataTableColumnGroup.children[i].style.width = percentWidth; } - this.columnWidthsInitialized = true; + this._columnWidthsInitialized = true; } - + this._positionResizers(); + this.dispatchEventToListeners("width changed"); + }, + + columnWidthsMap: function() + { + var result = {}; + for (var i = 0; i < this._columnsArray.length; ++i) { + var width = this._headerTableColumnGroup.children[i].style.width; + result[this._columnsArray[i].columnIdentifier] = parseFloat(width); + } + return result; + }, + + applyColumnWidthsMap: function(columnWidthsMap) + { + for (var columnIdentifier in this.columns) { + var column = this.columns[columnIdentifier]; + var width = (columnWidthsMap[columnIdentifier] || 0) + "%"; + this._headerTableColumnGroup.children[column.ordinal].style.width = width; + this._dataTableColumnGroup.children[column.ordinal].style.width = width; + } + + // Normalize widths + delete this._columnWidthsInitialized; + this.updateWidths(); + }, + + isColumnVisible: function(columnIdentifier) + { + var column = this.columns[columnIdentifier]; + var columnElement = column.element; + return !columnElement.hidden; + }, + + showColumn: function(columnIdentifier) + { + var column = this.columns[columnIdentifier]; + var columnElement = column.element; + if (!columnElement.hidden) + return; + + columnElement.hidden = false; + columnElement.removeStyleClass("hidden"); + + var columnBodyElement = column.bodyElement; + columnBodyElement.hidden = false; + columnBodyElement.removeStyleClass("hidden"); + }, + + hideColumn: function(columnIdentifier) + { + var column = this.columns[columnIdentifier]; + var columnElement = column.element; + if (columnElement.hidden) + return; + + var oldWidth = parseFloat(columnElement.style.width); + + columnElement.hidden = true; + columnElement.addStyleClass("hidden"); + columnElement.style.width = 0; + + var columnBodyElement = column.bodyElement; + columnBodyElement.hidden = true; + columnBodyElement.addStyleClass("hidden"); + columnBodyElement.style.width = 0; + + this._columnWidthsInitialized = false; + }, + + _positionResizers: function() + { + var headerTableColumns = this._headerTableColumnGroup.children; + var numColumns = headerTableColumns.length; + var left = 0; + var previousResizer = null; + // Make n - 1 resizers for n columns. for (var i = 0; i < numColumns - 1; i++) { var resizer = this.resizers[i]; @@ -397,7 +489,6 @@ WebInspector.DataGrid.prototype = { resizer = document.createElement("div"); resizer.addStyleClass("data-grid-resizer"); // This resizer is associated with the column to its right. - resizer.rightNeighboringColumnID = i + 1; resizer.addEventListener("mousedown", this._startResizerDragging.bind(this), false); this.element.appendChild(resizer); this.resizers[i] = resizer; @@ -407,10 +498,23 @@ WebInspector.DataGrid.prototype = { // header table in order to determine the width of the column, since // it is not possible to query a column for its width. left += this.headerTableBody.rows[0].cells[i].offsetWidth; - - resizer.style.left = left + "px"; + + var columnIsVisible = !this._headerTableColumnGroup.children[i].hidden; + if (columnIsVisible) { + resizer.style.removeProperty("display"); + resizer.style.left = left + "px"; + resizer.leftNeighboringColumnID = i; + if (previousResizer) + previousResizer.rightNeighboringColumnID = i; + previousResizer = resizer; + } else { + resizer.style.setProperty("display", "none"); + resizer.leftNeighboringColumnID = 0; + resizer.rightNeighboringColumnID = 0; + } } - this.dispatchEventToListeners("width changed"); + if (previousResizer) + previousResizer.rightNeighboringColumnID = numColumns - 1; }, addCreationNode: function(hasChildren) @@ -474,6 +578,7 @@ WebInspector.DataGrid.prototype = { throw("removeChild: Node is not a child of this node."); child.deselect(); + child._detach(); this.children.remove(child, true); @@ -534,17 +639,18 @@ WebInspector.DataGrid.prototype = { this.children = []; }, - sortNodes: function(comparator, descending) + sortNodes: function(comparator, reverseMode) { function comparatorWrapper(a, b) { + if (a._dataGridNode._data.summaryRow) + return 1; + if (b._dataGridNode._data.summaryRow) + return -1; + var aDataGirdNode = a._dataGridNode; var bDataGirdNode = b._dataGridNode; - if (!aDataGirdNode) - return 1; // Filler row. - if (!bDataGirdNode) - return -1; // Filler row. - return descending ? comparator(bDataGirdNode, aDataGirdNode) : comparator(aDataGirdNode, bDataGirdNode); + return reverseMode ? comparator(bDataGirdNode, aDataGirdNode) : comparator(aDataGirdNode, bDataGirdNode); } var tbody = this.dataTableBody; @@ -552,15 +658,27 @@ WebInspector.DataGrid.prototype = { tbodyParent.removeChild(tbody); var childNodes = tbody.childNodes; - var sortedNodes = Array.prototype.slice.call(childNodes); - sortedNodes.sort(comparatorWrapper.bind(this)); + var fillerRow = childNodes[childNodes.length - 1]; + + var sortedRows = Array.prototype.slice.call(childNodes, 0, childNodes.length - 1); + sortedRows.sort(comparatorWrapper); + var sortedRowsLength = sortedRows.length; - var sortedNodesLength = sortedNodes.length; tbody.removeChildren(); - for (var i = 0; i < sortedNodesLength; ++i) { - var node = sortedNodes[i]; - tbody.appendChild(node); + var previousSiblingNode = null; + for (var i = 0; i < sortedRowsLength; ++i) { + var row = sortedRows[i]; + var node = row._dataGridNode; + node.previousSibling = previousSiblingNode; + if (previousSiblingNode) + previousSiblingNode.nextSibling = node; + tbody.appendChild(row); + previousSiblingNode = node; } + if (previousSiblingNode) + previousSiblingNode.nextSibling = null; + + tbody.appendChild(fillerRow); tbodyParent.appendChild(tbody); }, @@ -673,13 +791,11 @@ WebInspector.DataGrid.prototype = { var sortOrder = this.sortOrder; - if (this._sortColumnCell) { - this._sortColumnCell.removeStyleClass("sort-ascending"); - this._sortColumnCell.removeStyleClass("sort-descending"); - } + if (this._sortColumnCell) + this._sortColumnCell.removeMatchingStyleClasses("sort-\\w+"); if (cell == this._sortColumnCell) { - if (sortOrder == "ascending") + if (sortOrder === "ascending") sortOrder = "descending"; else sortOrder = "ascending"; @@ -692,6 +808,19 @@ WebInspector.DataGrid.prototype = { this.dispatchEventToListeners("sorting changed"); }, + markColumnAsSortedBy: function(columnIdentifier, sortOrder) + { + if (this._sortColumnCell) + this._sortColumnCell.removeMatchingStyleClasses("sort-\\w+"); + this._sortColumnCell = this._headerTableHeaders[columnIdentifier]; + this._sortColumnCell.addStyleClass("sort-" + sortOrder); + }, + + headerTableHeader: function(columnIdentifier) + { + return this._headerTableHeaders[columnIdentifier]; + }, + _mouseDownInDataTable: function(event) { var gridNode = this.dataGridNodeFromNode(event.target); @@ -778,27 +907,28 @@ WebInspector.DataGrid.prototype = { // column directly to the left and the column directly to the right. var leftEdgeOfPreviousColumn = 0; var firstRowCells = this.headerTableBody.rows[0].cells; - for (var i = 0; i < resizer.rightNeighboringColumnID - 1; i++) + for (var i = 0; i < resizer.leftNeighboringColumnID; i++) leftEdgeOfPreviousColumn += firstRowCells[i].offsetWidth; - var rightEdgeOfNextColumn = leftEdgeOfPreviousColumn + firstRowCells[resizer.rightNeighboringColumnID - 1].offsetWidth + firstRowCells[resizer.rightNeighboringColumnID].offsetWidth; - - // Give each column some padding so that they don't disappear. + var rightEdgeOfNextColumn = leftEdgeOfPreviousColumn + firstRowCells[resizer.leftNeighboringColumnID].offsetWidth + firstRowCells[resizer.rightNeighboringColumnID].offsetWidth; + + // Give each column some padding so that they don't disappear. var leftMinimum = leftEdgeOfPreviousColumn + this.ColumnResizePadding; var rightMaximum = rightEdgeOfNextColumn - this.ColumnResizePadding; - + dragPoint = Number.constrain(dragPoint, leftMinimum, rightMaximum); - + resizer.style.left = (dragPoint - this.CenterResizerOverBorderAdjustment) + "px"; - + var percentLeftColumn = (((dragPoint - leftEdgeOfPreviousColumn) / this._dataTable.offsetWidth) * 100) + "%"; - this._headerTableColumnGroup.children[resizer.rightNeighboringColumnID - 1].style.width = percentLeftColumn; - this._dataTableColumnGroup.children[resizer.rightNeighboringColumnID - 1].style.width = percentLeftColumn; - + this._headerTableColumnGroup.children[resizer.leftNeighboringColumnID].style.width = percentLeftColumn; + this._dataTableColumnGroup.children[resizer.leftNeighboringColumnID].style.width = percentLeftColumn; + var percentRightColumn = (((rightEdgeOfNextColumn - dragPoint) / this._dataTable.offsetWidth) * 100) + "%"; this._headerTableColumnGroup.children[resizer.rightNeighboringColumnID].style.width = percentRightColumn; this._dataTableColumnGroup.children[resizer.rightNeighboringColumnID].style.width = percentRightColumn; - + + this._positionResizers(); event.preventDefault(); this.dispatchEventToListeners("width changed"); }, |