15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/*
25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2008 Apple Inc. All Rights Reserved.
35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Redistribution and use in source and binary forms, with or without
55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modification, are permitted provided that the following conditions
65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * are met:
75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 1. Redistributions of source code must retain the above copyright
85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *        notice, this list of conditions and the following disclaimer.
95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 2. Redistributions in binary form must reproduce the above copyright
105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *        notice, this list of conditions and the following disclaimer in the
115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *        documentation and/or other materials provided with the distribution.
125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * PURPOSE ARE DISCLAIMED.         IN NO EVENT SHALL APPLE INC. OR
175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */
255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/**
275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * @constructor
285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * @extends {WebInspector.View}
29926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * @param {!Array.<!WebInspector.DataGrid.ColumnDescriptor>} columnsArray
30a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) * @param {function(!WebInspector.DataGridNode, string, string, string)=} editCallback
31a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) * @param {function(!WebInspector.DataGridNode)=} deleteCallback
3253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) * @param {function()=} refreshCallback
33a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) * @param {function(!WebInspector.ContextMenu, !WebInspector.DataGridNode)=} contextMenuCallback
345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */
3553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)WebInspector.DataGrid = function(columnsArray, editCallback, deleteCallback, refreshCallback, contextMenuCallback)
365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    WebInspector.View.call(this);
385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this.registerRequiredCSS("dataGrid.css");
395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
40d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    this.element.className = "data-grid"; // Override
415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this.element.tabIndex = 0;
425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this.element.addEventListener("keydown", this._keyDown.bind(this), false);
435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
44197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    var headerContainer = document.createElementWithClass("div", "header-container");
45c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    /** @type {!Element} */
46197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    this._headerTable = headerContainer.createChild("table", "header");
47c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    /** @type {!Object.<string, !Element>} */
485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this._headerTableHeaders = {};
495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
50c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    /** @type {!Element} */
51197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    this._scrollContainer = document.createElementWithClass("div", "data-container");
52c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    /** @type {!Element} */
53197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    this._dataTable = this._scrollContainer.createChild("table", "data");
545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this._dataTable.addEventListener("mousedown", this._mouseDownInDataTable.bind(this), true);
565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this._dataTable.addEventListener("click", this._clickInDataTable.bind(this), true);
575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this._dataTable.addEventListener("contextmenu", this._contextMenuInDataTable.bind(this), true);
595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // FIXME: Add a createCallback which is different from editCallback and has different
615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // behavior when creating a new node.
62926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (editCallback)
635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._dataTable.addEventListener("dblclick", this._ondblclick.bind(this), false);
64c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    /** @type {function(!WebInspector.DataGridNode, string, string, string)|undefined} */
65926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    this._editCallback = editCallback;
66c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    /** @type {function(!WebInspector.DataGridNode)|undefined} */
67926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    this._deleteCallback = deleteCallback;
68c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    /** @type {function()|undefined} */
69926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    this._refreshCallback = refreshCallback;
70c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    /** @type {function(!WebInspector.ContextMenu, !WebInspector.DataGridNode)|undefined} */
7153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    this._contextMenuCallback = contextMenuCallback;
725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
73197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    this.element.appendChild(headerContainer);
745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this.element.appendChild(this._scrollContainer);
755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
76c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    /** @type {!Element} */
77f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    this._headerRow = document.createElement("tr");
78c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    /** @type {!Element} */
79f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    this._headerTableColumnGroup = document.createElement("colgroup");
80c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    /** @type {!Element} */
81f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    this._dataTableColumnGroup = document.createElement("colgroup");
82926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
83c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    /** @type {!Element} */
84c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    this._topFillerRow = document.createElementWithClass("tr", "revealed");
85c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    /** @type {!Element} */
86c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    this._bottomFillerRow = document.createElementWithClass("tr", "revealed");
87c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    this.setVerticalPadding(0, 0);
885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
89c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    /** @type {!Array.<!WebInspector.DataGrid.ColumnDescriptor>} */
90926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    this._columnsArray = columnsArray;
91c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    /** @type {!Array.<!WebInspector.DataGrid.ColumnDescriptor>} */
92f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    this._visibleColumnsArray = columnsArray;
93c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    /** @type {!Object.<string, !WebInspector.DataGrid.ColumnDescriptor>} */
94f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    this._columns = {};
95926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
96e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    /** @type {?string} */
97e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    this._cellClass = null;
98e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)
99926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    for (var i = 0; i < columnsArray.length; ++i) {
100926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        var column = columnsArray[i];
101926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        var columnIdentifier = column.identifier = column.id || i;
102f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)        this._columns[columnIdentifier] = column;
1035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (column.disclosure)
1045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            this.disclosureColumnIdentifier = columnIdentifier;
1055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var cell = document.createElement("th");
1075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        cell.className = columnIdentifier + "-column";
1085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        cell.columnIdentifier = columnIdentifier;
1095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._headerTableHeaders[columnIdentifier] = cell;
1105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var div = document.createElement("div");
1125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (column.titleDOMFragment)
1135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            div.appendChild(column.titleDOMFragment);
1145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        else
1155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            div.textContent = column.title;
1165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        cell.appendChild(div);
1175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (column.sort) {
119e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)            cell.classList.add(column.sort);
1205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            this._sortColumnCell = cell;
1215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
1225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (column.sortable) {
1245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            cell.addEventListener("click", this._clickInHeaderCell.bind(this), false);
125a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)            cell.classList.add("sortable");
1265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
1275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this._headerTable.appendChild(this._headerTableColumnGroup);
130f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    this.headerTableBody.appendChild(this._headerRow);
1315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this._dataTable.appendChild(this._dataTableColumnGroup);
133197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    this.dataTableBody.appendChild(this._topFillerRow);
134197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    this.dataTableBody.appendChild(this._bottomFillerRow);
135f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)
136f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    this._refreshHeader();
1375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
138c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    /** @type {boolean} */
139c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    this._editing = false;
140c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    /** @type {?WebInspector.DataGridNode} */
1415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this.selectedNode = null;
142c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    /** @type {boolean} */
1435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this.expandNodesWhenArrowing = false;
1445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this.setRootNode(new WebInspector.DataGridNode());
145c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    /** @type {number} */
1465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this.indentWidth = 15;
147c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    /** @type {!Array.<!Element|{__index: number, __position: number}>} */
148f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    this._resizers = [];
149c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    /** @type {boolean} */
1505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this._columnWidthsInitialized = false;
151c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    /** @type {number} */
152f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    this._cornerWidth = WebInspector.DataGrid.CornerWidth;
153c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    /** @type {!WebInspector.DataGrid.ResizeMethod} */
154c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    this._resizeMethod = WebInspector.DataGrid.ResizeMethod.Nearest;
1555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
157f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)// Keep in sync with .data-grid col.corner style rule.
158f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)WebInspector.DataGrid.CornerWidth = 14;
159f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)
160a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)/** @typedef {!{id: ?string, editable: boolean, longText: ?boolean, sort: !WebInspector.DataGrid.Order, sortable: boolean, align: !WebInspector.DataGrid.Align}} */
161926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)WebInspector.DataGrid.ColumnDescriptor;
162926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
1635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebInspector.DataGrid.Events = {
1645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    SelectedNode: "SelectedNode",
165926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    DeselectedNode: "DeselectedNode",
166926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    SortingChanged: "SortingChanged",
167926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    ColumnsResized: "ColumnsResized"
168926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
169926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
170926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)/** @enum {string} */
171926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)WebInspector.DataGrid.Order = {
172e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    Ascending: "sort-ascending",
173e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    Descending: "sort-descending"
174926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
175926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
176926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)/** @enum {string} */
177926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)WebInspector.DataGrid.Align = {
178926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    Center: "center",
179926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    Right: "right"
1805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebInspector.DataGrid.prototype = {
183e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    /**
184e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)     * @param {string} cellClass
185e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)     */
186e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    setCellClass: function(cellClass)
187e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    {
188e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        this._cellClass = cellClass;
189e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    },
190e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)
191f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    _refreshHeader: function()
192f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    {
193f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)        this._headerTableColumnGroup.removeChildren();
194f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)        this._dataTableColumnGroup.removeChildren();
195f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)        this._headerRow.removeChildren();
196197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        this._topFillerRow.removeChildren();
197197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        this._bottomFillerRow.removeChildren();
198f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)
199f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)        for (var i = 0; i < this._visibleColumnsArray.length; ++i) {
200f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)            var column = this._visibleColumnsArray[i];
201f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)            var columnIdentifier = column.identifier;
202f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)            var headerColumn = this._headerTableColumnGroup.createChild("col");
203f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)            var dataColumn = this._dataTableColumnGroup.createChild("col");
204f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)            if (column.width) {
205f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)                headerColumn.style.width = column.width;
206f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)                dataColumn.style.width = column.width;
207f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)            }
208f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)            this._headerRow.appendChild(this._headerTableHeaders[columnIdentifier]);
209c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)            this._topFillerRow.createChild("td", "top-filler-td");
210c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)            this._bottomFillerRow.createChild("td", "bottom-filler-td");
211f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)        }
212f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)
213f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)        this._headerRow.createChild("th", "corner");
214c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        this._topFillerRow.createChild("td", "corner").classList.add("top-filler-td");
215c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        this._bottomFillerRow.createChild("td", "corner").classList.add("bottom-filler-td");
216f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)        this._headerTableColumnGroup.createChild("col", "corner");
217f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)        this._dataTableColumnGroup.createChild("col", "corner");
218f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    },
219f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)
220926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    /**
221197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch     * @param {number} top
222197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch     * @param {number} bottom
223197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch     * @protected
224197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch     */
225197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    setVerticalPadding: function(top, bottom)
226197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    {
227197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        this._topFillerRow.style.height = top + "px";
228c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        if (top || bottom)
229c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)            this._bottomFillerRow.style.height = bottom + "px";
230c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        else
231c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)            this._bottomFillerRow.style.height = "auto";
232197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    },
233197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
234197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    /**
235926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)     * @param {!WebInspector.DataGridNode} rootNode
236c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)     * @protected
237926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)     */
2385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    setRootNode: function(rootNode)
2395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
2405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (this._rootNode) {
2415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            this._rootNode.removeChildren();
2425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            this._rootNode.dataGrid = null;
2435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            this._rootNode._isRoot = false;
2445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
245926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        /** @type {!WebInspector.DataGridNode} */
2465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._rootNode = rootNode;
2475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        rootNode._isRoot = true;
2485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        rootNode.hasChildren = false;
2495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        rootNode._expanded = true;
2505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        rootNode._revealed = true;
2515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        rootNode.dataGrid = this;
2525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
2535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
254926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    /**
255926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)     * @return {!WebInspector.DataGridNode}
256926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)     */
2575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    rootNode: function()
2585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
2595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return this._rootNode;
2605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
2615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    _ondblclick: function(event)
2635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
2645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (this._editing || this._editingNode)
2655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return;
2665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
267926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        var columnIdentifier = this.columnIdentifierFromNode(event.target);
268f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)        if (!columnIdentifier || !this._columns[columnIdentifier].editable)
269926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            return;
2705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._startEditing(event.target);
2715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
2725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
273926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    /**
274926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)     * @param {!WebInspector.DataGridNode} node
275f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)     * @param {number} cellIndex
276926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)     */
277f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    _startEditingColumnOfDataGridNode: function(node, cellIndex)
2785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
2795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._editing = true;
2807242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        /** @type {?WebInspector.DataGridNode} */
2815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._editingNode = node;
2825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._editingNode.select();
2835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
284f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)        var element = this._editingNode._element.children[cellIndex];
28509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        WebInspector.InplaceEditor.startEditing(element, this._startEditingConfig(element));
2865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        window.getSelection().setBaseAndExtent(element, 0, element, 1);
2875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
2885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    _startEditing: function(target)
2905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
2915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var element = target.enclosingNodeOrSelfWithNodeName("td");
2925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!element)
2935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return;
2945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._editingNode = this.dataGridNodeFromNode(target);
2965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!this._editingNode) {
2975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (!this.creationNode)
2985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                return;
2995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            this._editingNode = this.creationNode;
3005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
3015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // Force editing the 1st column when editing the creation node
3035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (this._editingNode.isCreationNode)
304926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            return this._startEditingColumnOfDataGridNode(this._editingNode, this._nextEditableColumn(-1));
3055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._editing = true;
30709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        WebInspector.InplaceEditor.startEditing(element, this._startEditingConfig(element));
3085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        window.getSelection().setBaseAndExtent(element, 0, element, 1);
3105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
3115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
312926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    renderInline: function()
313926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
314a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        this.element.classList.add("inline");
315f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)        this._cornerWidth = 0;
316f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)        this.updateWidths();
317926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    },
3185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    _startEditingConfig: function(element)
3205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
32109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        return new WebInspector.InplaceEditor.Config(this._editingCommitted.bind(this), this._editingCancelled.bind(this), element.textContent);
3225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
3235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    _editingCommitted: function(element, newText, oldText, context, moveDirection)
3255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
326926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        var columnIdentifier = this.columnIdentifierFromNode(element);
327926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        if (!columnIdentifier) {
328926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            this._editingCancelled(element);
329926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            return;
330926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        }
331f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)        var column = this._columns[columnIdentifier];
332f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)        var cellIndex = this._visibleColumnsArray.indexOf(column);
3335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var textBeforeEditing = this._editingNode.data[columnIdentifier];
3345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var currentEditingNode = this._editingNode;
3355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
33609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        /**
33709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)         * @param {boolean} wasChange
33809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)         * @this {WebInspector.DataGrid}
33909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)         */
3405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        function moveToNextIfNeeded(wasChange) {
3415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (!moveDirection)
3425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                return;
3435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (moveDirection === "forward") {
345f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)                var firstEditableColumn = this._nextEditableColumn(-1);
346f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)                if (currentEditingNode.isCreationNode && cellIndex === firstEditableColumn && !wasChange)
3475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                    return;
3485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
349f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)                var nextEditableColumn = this._nextEditableColumn(cellIndex);
350926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)                if (nextEditableColumn !== -1)
351926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)                    return this._startEditingColumnOfDataGridNode(currentEditingNode, nextEditableColumn);
3525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                var nextDataGridNode = currentEditingNode.traverseNextNode(true, null, true);
3545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                if (nextDataGridNode)
355926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)                    return this._startEditingColumnOfDataGridNode(nextDataGridNode, firstEditableColumn);
3565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                if (currentEditingNode.isCreationNode && wasChange) {
3575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                    this.addCreationNode(false);
358926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)                    return this._startEditingColumnOfDataGridNode(this.creationNode, firstEditableColumn);
3595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                }
3605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                return;
3615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            }
3625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (moveDirection === "backward") {
364f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)                var prevEditableColumn = this._nextEditableColumn(cellIndex, true);
365926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)                if (prevEditableColumn !== -1)
366926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)                    return this._startEditingColumnOfDataGridNode(currentEditingNode, prevEditableColumn);
3675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
368f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)                var lastEditableColumn = this._nextEditableColumn(this._visibleColumnsArray.length, true);
369926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)                var nextDataGridNode = currentEditingNode.traversePreviousNode(true, true);
3705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                if (nextDataGridNode)
371926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)                    return this._startEditingColumnOfDataGridNode(nextDataGridNode, lastEditableColumn);
3725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                return;
3735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            }
3745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
3755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (textBeforeEditing == newText) {
3775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            this._editingCancelled(element);
3785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            moveToNextIfNeeded.call(this, false);
3795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return;
3805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
3815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // Update the text in the datagrid that we typed
3835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._editingNode.data[columnIdentifier] = newText;
3845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // Make the callback - expects an editing node (table row), the column number that is being edited,
3865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // the text that used to be there, and the new text.
3875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._editCallback(this._editingNode, columnIdentifier, textBeforeEditing, newText);
3885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (this._editingNode.isCreationNode)
3905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            this.addCreationNode(false);
3915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._editingCancelled(element);
3935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        moveToNextIfNeeded.call(this, true);
3945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
3955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    _editingCancelled: function(element)
3975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
398c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        this._editing = false;
3995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._editingNode = null;
4005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
4015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    /**
403f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)     * @param {number} cellIndex
404926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)     * @param {boolean=} moveBackward
405926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)     * @return {number}
406926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)     */
407f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    _nextEditableColumn: function(cellIndex, moveBackward)
408926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
409926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        var increment = moveBackward ? -1 : 1;
410f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)        var columns = this._visibleColumnsArray;
411f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)        for (var i = cellIndex + increment; (i >= 0) && (i < columns.length); i += increment) {
412926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            if (columns[i].editable)
413926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)                return i;
414926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        }
415926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return -1;
416926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    },
417926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
418926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    /**
4195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     * @return {?string}
4205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     */
421926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    sortColumnIdentifier: function()
4225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
4235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!this._sortColumnCell)
4245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return null;
4255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return this._sortColumnCell.columnIdentifier;
4265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
4275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    /**
4295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     * @return {?string}
4305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     */
431926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    sortOrder: function()
4325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
433e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        if (!this._sortColumnCell || this._sortColumnCell.classList.contains(WebInspector.DataGrid.Order.Ascending))
434926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            return WebInspector.DataGrid.Order.Ascending;
435e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        if (this._sortColumnCell.classList.contains(WebInspector.DataGrid.Order.Descending))
436926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            return WebInspector.DataGrid.Order.Descending;
4375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return null;
4385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
4395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
440926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    /**
441926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)     * @return {boolean}
442926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)     */
443926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    isSortOrderAscending: function()
444926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
445e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        return !this._sortColumnCell || this._sortColumnCell.classList.contains(WebInspector.DataGrid.Order.Ascending);
446926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    },
447926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
4485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    get headerTableBody()
4495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
4505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if ("_headerTableBody" in this)
4515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return this._headerTableBody;
4525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._headerTableBody = this._headerTable.getElementsByTagName("tbody")[0];
4545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!this._headerTableBody) {
4555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            this._headerTableBody = this.element.ownerDocument.createElement("tbody");
4565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            this._headerTable.insertBefore(this._headerTableBody, this._headerTable.tFoot);
4575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
4585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return this._headerTableBody;
4605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
4615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    get dataTableBody()
4635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
4645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if ("_dataTableBody" in this)
4655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return this._dataTableBody;
4665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._dataTableBody = this._dataTable.getElementsByTagName("tbody")[0];
4685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!this._dataTableBody) {
4695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            this._dataTableBody = this.element.ownerDocument.createElement("tbody");
4705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            this._dataTable.insertBefore(this._dataTableBody, this._dataTable.tFoot);
4715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
4725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return this._dataTableBody;
4745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
4755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    /**
477f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)     * @param {!Array.<number>} widths
4785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     * @param {number} minPercent
4795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     * @param {number=} maxPercent
480f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)     * @return {!Array.<number>}
4815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     */
4825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    _autoSizeWidths: function(widths, minPercent, maxPercent)
4835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
4845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (minPercent)
4855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            minPercent = Math.min(minPercent, Math.floor(100 / widths.length));
4865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var totalWidth = 0;
4875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        for (var i = 0; i < widths.length; ++i)
4885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            totalWidth += widths[i];
4895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var totalPercentWidth = 0;
4905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        for (var i = 0; i < widths.length; ++i) {
4915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            var width = Math.round(100 * widths[i] / totalWidth);
4925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (minPercent && width < minPercent)
4935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                width = minPercent;
4945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            else if (maxPercent && width > maxPercent)
4955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                width = maxPercent;
4965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            totalPercentWidth += width;
4975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            widths[i] = width;
4985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
4995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var recoupPercent = totalPercentWidth - 100;
5005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        while (minPercent && recoupPercent > 0) {
5025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            for (var i = 0; i < widths.length; ++i) {
5035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                if (widths[i] > minPercent) {
5045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                    --widths[i];
5055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                    --recoupPercent;
5065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                    if (!recoupPercent)
5075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        break;
5085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                }
5095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            }
5105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
5115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        while (maxPercent && recoupPercent < 0) {
5135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            for (var i = 0; i < widths.length; ++i) {
5145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                if (widths[i] < maxPercent) {
5155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                    ++widths[i];
5165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                    ++recoupPercent;
5175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                    if (!recoupPercent)
5185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        break;
5195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                }
5205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            }
5215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
5225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return widths;
5245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
5255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    /**
5275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     * @param {number} minPercent
5285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     * @param {number=} maxPercent
5295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     * @param {number=} maxDescentLevel
5305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     */
5315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    autoSizeColumns: function(minPercent, maxPercent, maxDescentLevel)
5325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
5335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var widths = [];
534926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        for (var i = 0; i < this._columnsArray.length; ++i)
535926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            widths.push((this._columnsArray[i].title || "").length);
5365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        maxDescentLevel = maxDescentLevel || 0;
5385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var children = this._enumerateChildren(this._rootNode, [], maxDescentLevel + 1);
5395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        for (var i = 0; i < children.length; ++i) {
5405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            var node = children[i];
541926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            for (var j = 0; j < this._columnsArray.length; ++j) {
542926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)                var text = node.data[this._columnsArray[j].identifier] || "";
5435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                if (text.length > widths[j])
5445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                    widths[j] = text.length;
5455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            }
5465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
5475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        widths = this._autoSizeWidths(widths, minPercent, maxPercent);
5495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
550926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        for (var i = 0; i < this._columnsArray.length; ++i)
551f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)            this._columnsArray[i].weight = widths[i];
5525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._columnWidthsInitialized = false;
5535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this.updateWidths();
5545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
5555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    _enumerateChildren: function(rootNode, result, maxLevel)
5575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
5585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!rootNode._isRoot)
5595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            result.push(rootNode);
5605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!maxLevel)
5615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return;
5625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        for (var i = 0; i < rootNode.children.length; ++i)
5635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            this._enumerateChildren(rootNode.children[i], result, maxLevel - 1);
5645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return result;
5655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
5665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    onResize: function()
5685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
5695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this.updateWidths();
5705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
5715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Updates the widths of the table, including the positions of the column
5735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // resizers.
5745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    //
5755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // IMPORTANT: This function MUST be called once after the element of the
5765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // DataGrid is attached to its parent element and every subsequent time the
5775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // width of the parent element is changed in order to make it possible to
5785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // resize the columns.
5795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    //
5805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // If this function is not called after the DataGrid is attached to its
5815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // parent element, then the DataGrid's columns will not be resizable.
5825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    updateWidths: function()
5835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
5845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var headerTableColumns = this._headerTableColumnGroup.children;
5855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
586f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)        // Use container size to avoid changes of table width caused by change of column widths.
587f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)        var tableWidth = this.element.offsetWidth - this._cornerWidth;
58853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        var numColumns = headerTableColumns.length - 1; // Do not process corner column.
5895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // Do not attempt to use offsetes if we're not attached to the document tree yet.
5915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!this._columnWidthsInitialized && this.element.offsetWidth) {
5925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            // Give all the columns initial widths now so that during a resize,
5935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            // when the two columns that get resized get a percent value for
5945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            // their widths, all the other columns already have percent values
5955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            // for their widths.
5965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            for (var i = 0; i < numColumns; i++) {
5975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                var columnWidth = this.headerTableBody.rows[0].cells[i].offsetWidth;
598f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)                var column = this._visibleColumnsArray[i];
599f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)                if (!column.weight)
600f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)                    column.weight = 100 * columnWidth / tableWidth;
6015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            }
6025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            this._columnWidthsInitialized = true;
6035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
604f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)        this._applyColumnWeights();
6055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
6065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
60753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    /**
60853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)     * @param {string} name
60953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)     */
61053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    setName: function(name)
61153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    {
61253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        this._columnWeightsSetting = WebInspector.settings.createSetting("dataGrid-" + name + "-columnWeights", {});
61353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        this._loadColumnWeights();
61453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    },
61553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
61653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    _loadColumnWeights: function()
61753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    {
61853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        if (!this._columnWeightsSetting)
61953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)            return;
62053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        var weights = this._columnWeightsSetting.get();
62153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        for (var i = 0; i < this._columnsArray.length; ++i) {
62253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)            var column = this._columnsArray[i];
62353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)            var weight = weights[column.identifier];
62453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)            if (weight)
62553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)                column.weight = weight;
62653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        }
627f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)        this._applyColumnWeights();
62853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    },
62953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
63053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    _saveColumnWeights: function()
63153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    {
63253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        if (!this._columnWeightsSetting)
63353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)            return;
63453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        var weights = {};
63553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        for (var i = 0; i < this._columnsArray.length; ++i) {
63653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)            var column = this._columnsArray[i];
63753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)            weights[column.identifier] = column.weight;
63853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        }
63953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        this._columnWeightsSetting.set(weights);
64053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    },
64153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
64253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    wasShown: function()
64353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    {
64453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)       this._loadColumnWeights();
64553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    },
64653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
647f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    _applyColumnWeights: function()
6485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
6495d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        var tableWidth = this.element.offsetWidth - this._cornerWidth;
6505d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        if (tableWidth <= 0)
6515d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)            return;
6525d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)
653926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        var sumOfWeights = 0.0;
654f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)        for (var i = 0; i < this._visibleColumnsArray.length; ++i)
655f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)            sumOfWeights += this._visibleColumnsArray[i].weight;
6565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
657f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)        var sum = 0;
658f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)        var lastOffset = 0;
659f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)
660f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)        for (var i = 0; i < this._visibleColumnsArray.length; ++i) {
661f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)            sum += this._visibleColumnsArray[i].weight;
662f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)            var offset = (sum * tableWidth / sumOfWeights) | 0;
663f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)            var width = (offset - lastOffset) + "px";
664926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            this._headerTableColumnGroup.children[i].style.width = width;
665926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            this._dataTableColumnGroup.children[i].style.width = width;
666f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)            lastOffset = offset;
6675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
6685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
669926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        this._positionResizers();
670926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        this.dispatchEventToListeners(WebInspector.DataGrid.Events.ColumnsResized);
6715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
6725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
673926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    /**
674f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)     * @param {!Object.<string, boolean>} columnsVisibility
675926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)     */
676f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    setColumnsVisiblity: function(columnsVisibility)
6775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
678f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)        this._visibleColumnsArray = [];
679f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)        for (var i = 0; i < this._columnsArray.length; ++i) {
680f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)            var column = this._columnsArray[i];
681f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)            if (columnsVisibility[column.identifier])
682f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)                this._visibleColumnsArray.push(column);
683f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)        }
684f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)        this._refreshHeader();
685f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)        this._applyColumnWeights();
686f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)        var nodes = this._enumerateChildren(this.rootNode(), [], -1);
687f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)        for (var i = 0; i < nodes.length; ++i)
688f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)            nodes[i].refresh();
6895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
6905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    get scrollContainer()
6925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
6935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return this._scrollContainer;
6945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
6955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    _positionResizers: function()
6975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
6985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var headerTableColumns = this._headerTableColumnGroup.children;
69953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        var numColumns = headerTableColumns.length - 1; // Do not process corner column.
70007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        var left = [];
701f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)        var resizers = this._resizers;
702f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)
703f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)        while (resizers.length > numColumns - 1)
704f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)            resizers.pop().remove();
7055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
70607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        for (var i = 0; i < numColumns - 1; i++) {
70707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch            // Get the width of the cell in the first (and only) row of the
70807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch            // header table in order to determine the width of the column, since
70907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch            // it is not possible to query a column for its width.
71007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch            left[i] = (left[i-1] || 0) + this.headerTableBody.rows[0].cells[i].offsetWidth;
71107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        }
71207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
7135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // Make n - 1 resizers for n columns.
7145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        for (var i = 0; i < numColumns - 1; i++) {
715c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)            var resizer = resizers[i];
7165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (!resizer) {
7175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                // This is the first call to updateWidth, so the resizers need
7185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                // to be created.
7195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                resizer = document.createElement("div");
720f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)                resizer.__index = i;
721a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)                resizer.classList.add("data-grid-resizer");
7225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                // This resizer is associated with the column to its right.
7235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                WebInspector.installDragHandle(resizer, this._startResizerDragging.bind(this), this._resizerDragging.bind(this), this._endResizerDragging.bind(this), "col-resize");
7245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                this.element.appendChild(resizer);
725f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)                resizers.push(resizer);
7265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            }
727f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)            if (resizer.__position !== left[i]) {
728f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)                resizer.__position = left[i];
729f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)                resizer.style.left = left[i] + "px";
7305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            }
7315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
7325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
7335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    addCreationNode: function(hasChildren)
7355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
7365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (this.creationNode)
7375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            this.creationNode.makeNormal();
7385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var emptyData = {};
740f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)        for (var column in this._columns)
741e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)            emptyData[column] = null;
7425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this.creationNode = new WebInspector.CreationDataGridNode(emptyData, hasChildren);
7435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this.rootNode().appendChild(this.creationNode);
7445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
7455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    _keyDown: function(event)
7475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
7485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!this.selectedNode || event.shiftKey || event.metaKey || event.ctrlKey || this._editing)
7495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return;
7505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var handled = false;
7525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var nextSelectedNode;
7535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (event.keyIdentifier === "Up" && !event.altKey) {
7545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            nextSelectedNode = this.selectedNode.traversePreviousNode(true);
7555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            while (nextSelectedNode && !nextSelectedNode.selectable)
7565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                nextSelectedNode = nextSelectedNode.traversePreviousNode(true);
7575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            handled = nextSelectedNode ? true : false;
7585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        } else if (event.keyIdentifier === "Down" && !event.altKey) {
7595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            nextSelectedNode = this.selectedNode.traverseNextNode(true);
7605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            while (nextSelectedNode && !nextSelectedNode.selectable)
7615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                nextSelectedNode = nextSelectedNode.traverseNextNode(true);
7625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            handled = nextSelectedNode ? true : false;
7635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        } else if (event.keyIdentifier === "Left") {
7645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (this.selectedNode.expanded) {
7655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                if (event.altKey)
7665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                    this.selectedNode.collapseRecursively();
7675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                else
7685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                    this.selectedNode.collapse();
7695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                handled = true;
7705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            } else if (this.selectedNode.parent && !this.selectedNode.parent._isRoot) {
7715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                handled = true;
7725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                if (this.selectedNode.parent.selectable) {
7735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                    nextSelectedNode = this.selectedNode.parent;
7745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                    handled = nextSelectedNode ? true : false;
7755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                } else if (this.selectedNode.parent)
7765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                    this.selectedNode.parent.collapse();
7775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            }
7785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        } else if (event.keyIdentifier === "Right") {
7795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (!this.selectedNode.revealed) {
7805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                this.selectedNode.reveal();
7815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                handled = true;
7825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            } else if (this.selectedNode.hasChildren) {
7835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                handled = true;
7845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                if (this.selectedNode.expanded) {
7855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                    nextSelectedNode = this.selectedNode.children[0];
7865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                    handled = nextSelectedNode ? true : false;
7875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                } else {
7885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                    if (event.altKey)
7895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        this.selectedNode.expandRecursively();
7905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                    else
7915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        this.selectedNode.expand();
7925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                }
7935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            }
7945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        } else if (event.keyCode === 8 || event.keyCode === 46) {
7955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (this._deleteCallback) {
7965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                handled = true;
7975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                this._deleteCallback(this.selectedNode);
798926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)                this.changeNodeAfterDeletion();
7995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            }
8005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        } else if (isEnterKey(event)) {
8015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (this._editCallback) {
8025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                handled = true;
803926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)                this._startEditing(this.selectedNode._element.children[this._nextEditableColumn(-1)]);
8045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            }
8055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
8065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (nextSelectedNode) {
8085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            nextSelectedNode.reveal();
8095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            nextSelectedNode.select();
8105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
8115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (handled)
8135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            event.consume(true);
8145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
8155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
816926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    changeNodeAfterDeletion: function()
817926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
818926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        var nextSelectedNode = this.selectedNode.traverseNextNode(true);
819926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        while (nextSelectedNode && !nextSelectedNode.selectable)
820926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            nextSelectedNode = nextSelectedNode.traverseNextNode(true);
821926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
822926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        if (!nextSelectedNode || nextSelectedNode.isCreationNode) {
823926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            nextSelectedNode = this.selectedNode.traversePreviousNode(true);
824926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            while (nextSelectedNode && !nextSelectedNode.selectable)
825926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)                nextSelectedNode = nextSelectedNode.traversePreviousNode(true);
826926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        }
827926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
828926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        if (nextSelectedNode) {
829926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            nextSelectedNode.reveal();
830926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            nextSelectedNode.select();
831926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        }
832926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    },
833926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
834926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    /**
835926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)     * @param {!Node} target
836926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)     * @return {?WebInspector.DataGridNode}
837926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)     */
8385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    dataGridNodeFromNode: function(target)
8395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
8405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var rowElement = target.enclosingNodeOrSelfWithNodeName("tr");
8415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return rowElement && rowElement._dataGridNode;
8425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
8435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
844926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    /**
845926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)     * @param {!Node} target
846926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)     * @return {?string}
847926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)     */
848926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    columnIdentifierFromNode: function(target)
8495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
850926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        var cellElement = target.enclosingNodeOrSelfWithNodeName("td");
851926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return cellElement && cellElement.columnIdentifier_;
8525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
8535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    _clickInHeaderCell: function(event)
8555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
8565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var cell = event.target.enclosingNodeOrSelfWithNodeName("th");
857c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        if (!cell || (cell.columnIdentifier === undefined) || !cell.classList.contains("sortable"))
8585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return;
8595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
860926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        var sortOrder = WebInspector.DataGrid.Order.Ascending;
861926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        if ((cell === this._sortColumnCell) && this.isSortOrderAscending())
862926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            sortOrder = WebInspector.DataGrid.Order.Descending;
8635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (this._sortColumnCell)
865e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)            this._sortColumnCell.classList.remove(WebInspector.DataGrid.Order.Ascending, WebInspector.DataGrid.Order.Descending);
8665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._sortColumnCell = cell;
8675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
868e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        cell.classList.add(sortOrder);
8695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
870926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        this.dispatchEventToListeners(WebInspector.DataGrid.Events.SortingChanged);
8715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
8725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
873926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    /**
874926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)     * @param {string} columnIdentifier
875926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)     * @param {!WebInspector.DataGrid.Order} sortOrder
876926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)     */
8775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    markColumnAsSortedBy: function(columnIdentifier, sortOrder)
8785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
8795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (this._sortColumnCell)
880e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)            this._sortColumnCell.classList.remove(WebInspector.DataGrid.Order.Ascending, WebInspector.DataGrid.Order.Descending);
8815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._sortColumnCell = this._headerTableHeaders[columnIdentifier];
882e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        this._sortColumnCell.classList.add(sortOrder);
8835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
8845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
88509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    /**
88609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)     * @param {string} columnIdentifier
88709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)     * @return {!Element}
88809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)     */
8895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    headerTableHeader: function(columnIdentifier)
8905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
8915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return this._headerTableHeaders[columnIdentifier];
8925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
8935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    _mouseDownInDataTable: function(event)
8955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
8965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var gridNode = this.dataGridNodeFromNode(event.target);
8975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!gridNode || !gridNode.selectable)
8985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return;
8995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (gridNode.isEventWithinDisclosureTriangle(event))
9015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return;
9025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (event.metaKey) {
9045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (gridNode.selected)
9055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                gridNode.deselect();
9065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            else
9075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                gridNode.select();
9085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        } else
9095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            gridNode.select();
9105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
9115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    _contextMenuInDataTable: function(event)
9135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
9145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var contextMenu = new WebInspector.ContextMenu(event);
9155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var gridNode = this.dataGridNodeFromNode(event.target);
9175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (this._refreshCallback && (!gridNode || gridNode !== this.creationNode))
9185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            contextMenu.appendItem(WebInspector.UIString("Refresh"), this._refreshCallback.bind(this));
9195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (gridNode && gridNode.selectable && !gridNode.isEventWithinDisclosureTriangle(event)) {
9215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (this._editCallback) {
9225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                if (gridNode === this.creationNode)
923926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)                    contextMenu.appendItem(WebInspector.UIString(WebInspector.useLowerCaseMenuTitles() ? "Add new" : "Add New"), this._startEditing.bind(this, event.target));
924926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)                else {
925926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)                    var columnIdentifier = this.columnIdentifierFromNode(event.target);
926f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)                    if (columnIdentifier && this._columns[columnIdentifier].editable)
927f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)                        contextMenu.appendItem(WebInspector.UIString("Edit \"%s\"", this._columns[columnIdentifier].title), this._startEditing.bind(this, event.target));
928926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)                }
9295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            }
9305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (this._deleteCallback && gridNode !== this.creationNode)
9315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                contextMenu.appendItem(WebInspector.UIString("Delete"), this._deleteCallback.bind(this, gridNode));
93253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)            if (this._contextMenuCallback)
93353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)                this._contextMenuCallback(contextMenu, gridNode);
9345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
9355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        contextMenu.show();
9375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
9385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    _clickInDataTable: function(event)
9405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
9415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var gridNode = this.dataGridNodeFromNode(event.target);
9425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!gridNode || !gridNode.hasChildren)
9435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return;
9445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!gridNode.isEventWithinDisclosureTriangle(event))
9465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return;
9475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (gridNode.expanded) {
9495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (event.altKey)
9505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                gridNode.collapseRecursively();
9515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            else
9525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                gridNode.collapse();
9535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        } else {
9545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (event.altKey)
9555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                gridNode.expandRecursively();
9565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            else
9575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                gridNode.expand();
9585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
9595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
9605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
961c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    /**
962c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)     * @param {!WebInspector.DataGrid.ResizeMethod} method
963c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)     */
964c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    setResizeMethod: function(method)
9655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
9665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._resizeMethod = method;
9675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
9685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    /**
9705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     * @return {boolean}
9715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     */
9725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    _startResizerDragging: function(event)
9735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
9745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._currentResizer = event.target;
975f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)        return true;
9765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
9775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    _resizerDragging: function(event)
9795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
9805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var resizer = this._currentResizer;
9815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!resizer)
9825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return;
9835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
984f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)        var tableWidth = this.element.offsetWidth; // Cache it early, before we invalidate layout.
985926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
9865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // Constrain the dragpoint to be within the containing div of the
9875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // datagrid.
9885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var dragPoint = event.clientX - this.element.totalOffsetLeft();
9895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var firstRowCells = this.headerTableBody.rows[0].cells;
9905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var leftEdgeOfPreviousColumn = 0;
991f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)        // Constrain the dragpoint to be within the space made up by the
992f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)        // column directly to the left and the column directly to the right.
993f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)        var leftCellIndex = resizer.__index;
994f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)        var rightCellIndex = leftCellIndex + 1;
9955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        for (var i = 0; i < leftCellIndex; i++)
9965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            leftEdgeOfPreviousColumn += firstRowCells[i].offsetWidth;
9975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // Differences for other resize methods
999c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        if (this._resizeMethod === WebInspector.DataGrid.ResizeMethod.Last) {
1000f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)            rightCellIndex = this._resizers.length;
1001c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        } else if (this._resizeMethod === WebInspector.DataGrid.ResizeMethod.First) {
10025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            leftEdgeOfPreviousColumn += firstRowCells[leftCellIndex].offsetWidth - firstRowCells[0].offsetWidth;
10035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            leftCellIndex = 0;
10045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
10055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var rightEdgeOfNextColumn = leftEdgeOfPreviousColumn + firstRowCells[leftCellIndex].offsetWidth + firstRowCells[rightCellIndex].offsetWidth;
10075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // Give each column some padding so that they don't disappear.
10095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var leftMinimum = leftEdgeOfPreviousColumn + this.ColumnResizePadding;
10105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var rightMaximum = rightEdgeOfNextColumn - this.ColumnResizePadding;
101153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        if (leftMinimum > rightMaximum)
101253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)            return;
10135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        dragPoint = Number.constrain(dragPoint, leftMinimum, rightMaximum);
10155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1016f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)        var position = (dragPoint - this.CenterResizerOverBorderAdjustment);
1017f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)        resizer.__position = position;
1018f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)        resizer.style.left = position + "px";
10195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1020f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)        var pxLeftColumn = (dragPoint - leftEdgeOfPreviousColumn) + "px";
1021f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)        this._headerTableColumnGroup.children[leftCellIndex].style.width = pxLeftColumn;
1022f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)        this._dataTableColumnGroup.children[leftCellIndex].style.width = pxLeftColumn;
10235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1024f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)        var pxRightColumn = (rightEdgeOfNextColumn - dragPoint) + "px";
1025f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)        this._headerTableColumnGroup.children[rightCellIndex].style.width = pxRightColumn;
1026f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)        this._dataTableColumnGroup.children[rightCellIndex].style.width = pxRightColumn;
10275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1028f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)        var leftColumn = this._visibleColumnsArray[leftCellIndex];
1029f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)        var rightColumn = this._visibleColumnsArray[rightCellIndex];
1030926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        if (leftColumn.weight || rightColumn.weight) {
1031926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            var sumOfWeights = leftColumn.weight + rightColumn.weight;
1032926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            var delta = rightEdgeOfNextColumn - leftEdgeOfPreviousColumn;
1033926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            leftColumn.weight = (dragPoint - leftEdgeOfPreviousColumn) * sumOfWeights / delta;
1034926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            rightColumn.weight = (rightEdgeOfNextColumn - dragPoint) * sumOfWeights / delta;
1035926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        }
1036926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
10375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._positionResizers();
10385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        event.preventDefault();
1039926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        this.dispatchEventToListeners(WebInspector.DataGrid.Events.ColumnsResized);
10405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
10415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1042f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    /**
1043f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)     * @param {string} columnId
1044f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)     * @return {number}
1045f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)     */
1046f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    columnOffset: function(columnId)
1047f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    {
10485d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        if (!this.element.offsetWidth)
10495d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)            return 0;
1050f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)        for (var i = 1; i < this._visibleColumnsArray.length; ++i) {
1051197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch            if (columnId === this._visibleColumnsArray[i].identifier) {
1052197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch                if (this._resizers[i - 1])
1053197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch                    return this._resizers[i - 1].__position;
1054197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch            }
1055f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)        }
1056f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)        return 0;
1057f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    },
1058f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)
10595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    _endResizerDragging: function(event)
10605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
10615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._currentResizer = null;
106253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        this._saveColumnWeights();
1063926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        this.dispatchEventToListeners(WebInspector.DataGrid.Events.ColumnsResized);
10645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
10655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
106653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    ColumnResizePadding: 24,
10675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    CenterResizerOverBorderAdjustment: 3,
10695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    __proto__: WebInspector.View.prototype
10715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
10725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1073c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)/** @enum {string} */
10745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebInspector.DataGrid.ResizeMethod = {
10755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Nearest: "nearest",
10765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    First: "first",
10775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Last: "last"
10785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
10795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/**
10815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * @constructor
10825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * @extends {WebInspector.Object}
1083a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) * @param {?Object.<string, *>=} data
10845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * @param {boolean=} hasChildren
10855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */
10865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebInspector.DataGridNode = function(data, hasChildren)
10875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1088c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    /** @type {?Element} */
1089c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    this._element = null;
1090c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    /** @type {boolean} */
10915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this._expanded = false;
1092c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    /** @type {boolean} */
10935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this._selected = false;
1094c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    /** @type {number|undefined} */
1095c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    this._depth;
1096c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    /** @type {boolean|undefined} */
1097c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    this._revealed;
1098c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    /** @type {boolean} */
1099c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    this._attached = false;
1100c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    /** @type {?{parent: !WebInspector.DataGridNode, index: number}} */
1101c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    this._savedPosition = null;
1102c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    /** @type {boolean} */
11035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this._shouldRefreshChildren = true;
1104e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    /** @type {!Object.<string, *>} */
11055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this._data = data || {};
1106e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    /** @type {boolean} */
11075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this.hasChildren = hasChildren || false;
1108e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    /** @type {!Array.<!WebInspector.DataGridNode>} */
11095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this.children = [];
1110c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    /** @type {?WebInspector.DataGrid} */
11115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this.dataGrid = null;
1112c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    /** @type {?WebInspector.DataGridNode} */
11135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this.parent = null;
1114a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    /** @type {?WebInspector.DataGridNode} */
11155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this.previousSibling = null;
1116a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    /** @type {?WebInspector.DataGridNode} */
11175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this.nextSibling = null;
1118c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    /** @type {number} */
11195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this.disclosureToggleWidth = 10;
11205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
11215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
11225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebInspector.DataGridNode.prototype = {
1123926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    /** @type {boolean} */
11245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    selectable: true,
11255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1126926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    /** @type {boolean} */
11275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    _isRoot: false,
11285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1129e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    /**
1130e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)     * @return {!Element}
1131e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)     */
1132e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    element: function()
11335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
1134e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        if (!this._element) {
1135e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)            this.createElement();
1136e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)            this.createCells();
1137e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        }
1138e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        return /** @type {!Element} */ (this._element);
1139e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    },
11405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1141e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    /**
1142e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)     * @protected
1143e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)     */
1144e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    createElement: function()
1145e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    {
11465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._element = document.createElement("tr");
11475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._element._dataGridNode = this;
11485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
11495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (this.hasChildren)
1150a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)            this._element.classList.add("parent");
11515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (this.expanded)
1152a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)            this._element.classList.add("expanded");
11535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (this.selected)
1154a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)            this._element.classList.add("selected");
11555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (this.revealed)
1156a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)            this._element.classList.add("revealed");
11575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
11585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1159197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    /**
1160197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch     * @protected
1161197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch     */
11625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    createCells: function()
11635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
1164197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        this._element.removeChildren();
1165f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)        var columnsArray = this.dataGrid._visibleColumnsArray;
1166e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        for (var i = 0; i < columnsArray.length; ++i)
1167e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)            this._element.appendChild(this.createCell(columnsArray[i].identifier));
1168e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        this._element.appendChild(this._createTDWithClass("corner"));
11695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
11705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
11715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    get data()
11725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
11735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return this._data;
11745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
11755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
11765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    set data(x)
11775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
11785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._data = x || {};
11795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this.refresh();
11805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
11815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
11825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    get revealed()
11835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
1184c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        if (this._revealed !== undefined)
11855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return this._revealed;
11865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
11875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var currentAncestor = this.parent;
11885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        while (currentAncestor && !currentAncestor._isRoot) {
11895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (!currentAncestor.expanded) {
11905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                this._revealed = false;
11915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                return false;
11925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            }
11935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
11945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            currentAncestor = currentAncestor.parent;
11955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
11965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
11975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._revealed = true;
11985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return true;
11995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
12005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
12015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    set hasChildren(x)
12025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
12035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (this._hasChildren === x)
12045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return;
12055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
12065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._hasChildren = x;
12075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
12085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!this._element)
12095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return;
12105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1211d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        this._element.classList.toggle("parent", this._hasChildren);
1212d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        this._element.classList.toggle("expanded", this._hasChildren && this.expanded);
12135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
12145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
12155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    get hasChildren()
12165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
12175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return this._hasChildren;
12185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
12195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
12205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    set revealed(x)
12215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
12225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (this._revealed === x)
12235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return;
12245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
12255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._revealed = x;
12265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1227926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        if (this._element)
1228d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            this._element.classList.toggle("revealed", this._revealed);
12295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
12305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        for (var i = 0; i < this.children.length; ++i)
12315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            this.children[i].revealed = x && this.expanded;
12325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
12335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1234c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    /**
1235c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)     * @return {number}
1236c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)     */
12375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    get depth()
12385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
1239c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        if (this._depth !== undefined)
12405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return this._depth;
12415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (this.parent && !this.parent._isRoot)
12425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            this._depth = this.parent.depth + 1;
12435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        else
12445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            this._depth = 0;
12455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return this._depth;
12465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
12475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
12485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    get leftPadding()
12495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
1250926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        if (typeof this._leftPadding === "number")
12515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return this._leftPadding;
1252926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
12535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._leftPadding = this.depth * this.dataGrid.indentWidth;
12545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return this._leftPadding;
12555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
12565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
12575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    get shouldRefreshChildren()
12585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
12595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return this._shouldRefreshChildren;
12605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
12615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
12625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    set shouldRefreshChildren(x)
12635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
12645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._shouldRefreshChildren = x;
12655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (x && this.expanded)
12665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            this.expand();
12675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
12685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
12695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    get selected()
12705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
12715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return this._selected;
12725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
12735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
12745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    set selected(x)
12755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
12765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (x)
12775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            this.select();
12785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        else
12795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            this.deselect();
12805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
12815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
12825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    get expanded()
12835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
12845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return this._expanded;
12855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
12865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1287e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    /**
1288e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)     * @param {boolean} x
1289e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)     */
12905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    set expanded(x)
12915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
12925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (x)
12935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            this.expand();
12945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        else
12955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            this.collapse();
12965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
12975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
12985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    refresh: function()
12995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
1300197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        if (!this.dataGrid)
1301c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)            this._element = null;
1302197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        if (!this._element)
13035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return;
13045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this.createCells();
13055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
13065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1307926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    /**
1308e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)     * @param {string} className
1309e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)     * @return {!Element}
1310e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)     */
1311e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    _createTDWithClass: function(className)
1312e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    {
1313e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        var cell = document.createElementWithClass("td", className);
1314e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        var cellClass = this.dataGrid._cellClass;
1315e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        if (cellClass)
1316e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)            cell.classList.add(cellClass);
1317e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        return cell;
1318e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    },
1319e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)
1320e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    /**
1321926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)     * @param {string} columnIdentifier
1322926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)     * @return {!Element}
1323926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)     */
1324926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    createTD: function(columnIdentifier)
13255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
1326e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        var cell = this._createTDWithClass(columnIdentifier + "-column");
1327926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        cell.columnIdentifier_ = columnIdentifier;
13285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1329f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)        var alignment = this.dataGrid._columns[columnIdentifier].align;
13305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (alignment)
1331a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)            cell.classList.add(alignment);
13325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1333926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return cell;
1334926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    },
1335926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
1336926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    /**
1337926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)     * @param {string} columnIdentifier
1338926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)     * @return {!Element}
1339926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)     */
1340926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    createCell: function(columnIdentifier)
1341926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
1342926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        var cell = this.createTD(columnIdentifier);
1343926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
13445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var data = this.data[columnIdentifier];
1345d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        if (data instanceof Node) {
1346d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)            cell.appendChild(data);
1347d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        } else {
1348d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)            cell.textContent = data;
1349f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)            if (this.dataGrid._columns[columnIdentifier].longText)
1350d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)                cell.title = data;
135153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        }
13525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
13535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (columnIdentifier === this.dataGrid.disclosureColumnIdentifier) {
1354a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)            cell.classList.add("disclosure");
13555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (this.leftPadding)
13565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                cell.style.setProperty("padding-left", this.leftPadding + "px");
13575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
13585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
13595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return cell;
13605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
13615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
13625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    /**
13635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     * @return {number}
13645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     */
1365d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    nodeSelfHeight: function()
13665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
1367d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return 16;
13685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
13695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
13705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    /**
1371a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)     * @param {!WebInspector.DataGridNode} child
13725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     */
13735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    appendChild: function(child)
13745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
13755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this.insertChild(child, this.children.length);
13765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
13775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
13785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    /**
1379a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)     * @param {!WebInspector.DataGridNode} child
13805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     * @param {number} index
13815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     */
13825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    insertChild: function(child, index)
13835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
13845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!child)
13855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            throw("insertChild: Node can't be undefined or null.");
13865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (child.parent === this)
13875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            throw("insertChild: Node is already a child of this node.");
13885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
13895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (child.parent)
13905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            child.parent.removeChild(child);
13915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
13925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this.children.splice(index, 0, child);
13935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this.hasChildren = true;
13945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
13955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        child.parent = this;
13965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        child.dataGrid = this.dataGrid;
1397c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        child.recalculateSiblings(index);
13985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1399c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        child._depth = undefined;
1400c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        child._revealed = undefined;
1401c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        child._attached = false;
14025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        child._shouldRefreshChildren = true;
14035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
14045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var current = child.children[0];
14055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        while (current) {
14065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            current.dataGrid = this.dataGrid;
1407c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)            current._depth = undefined;
1408c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)            current._revealed = undefined;
1409c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)            current._attached = false;
14105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            current._shouldRefreshChildren = true;
14115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            current = current.traverseNextNode(false, child, true);
14125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
14135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
14145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (this.expanded)
14155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            child._attach();
14165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!this.revealed)
14175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            child.revealed = false;
14185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
14195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
14205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    /**
1421a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)     * @param {!WebInspector.DataGridNode} child
14225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     */
14235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    removeChild: function(child)
14245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
14255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!child)
14265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            throw("removeChild: Node can't be undefined or null.");
14275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (child.parent !== this)
14285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            throw("removeChild: Node is not a child of this node.");
14295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
14305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        child.deselect();
14315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        child._detach();
14325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
14335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this.children.remove(child, true);
14345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
14355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (child.previousSibling)
14365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            child.previousSibling.nextSibling = child.nextSibling;
14375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (child.nextSibling)
14385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            child.nextSibling.previousSibling = child.previousSibling;
14395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
14405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        child.dataGrid = null;
14415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        child.parent = null;
14425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        child.nextSibling = null;
14435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        child.previousSibling = null;
14445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
14455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (this.children.length <= 0)
14465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            this.hasChildren = false;
14475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
14485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
14495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    removeChildren: function()
14505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
14515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        for (var i = 0; i < this.children.length; ++i) {
14525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            var child = this.children[i];
14535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            child.deselect();
14545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            child._detach();
14555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
14565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            child.dataGrid = null;
14575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            child.parent = null;
14585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            child.nextSibling = null;
14595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            child.previousSibling = null;
14605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
14615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
14625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this.children = [];
14635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this.hasChildren = false;
14645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
14655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1466e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    /**
1467e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)     * @param {number} myIndex
1468e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)     */
1469c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    recalculateSiblings: function(myIndex)
14705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
14715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!this.parent)
14725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return;
14735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1474323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)        var previousChild = this.parent.children[myIndex - 1] || null;
1475323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)        if (previousChild)
14765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            previousChild.nextSibling = this;
1477323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)        this.previousSibling = previousChild;
14785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1479323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)        var nextChild = this.parent.children[myIndex + 1] || null;
1480323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)        if (nextChild)
14815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            nextChild.previousSibling = this;
1482323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)        this.nextSibling = nextChild;
14835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
14845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
14855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    collapse: function()
14865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
14875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (this._isRoot)
14885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return;
14895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (this._element)
1490a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)            this._element.classList.remove("expanded");
14915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
14925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._expanded = false;
14935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
14945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        for (var i = 0; i < this.children.length; ++i)
14955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            this.children[i].revealed = false;
14965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
14975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
14985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    collapseRecursively: function()
14995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
15005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var item = this;
15015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        while (item) {
15025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (item.expanded)
15035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                item.collapse();
15045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            item = item.traverseNextNode(false, this, true);
15055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
15065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
15075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1508926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    populate: function() { },
1509926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
15105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    expand: function()
15115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
15125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!this.hasChildren || this.expanded)
15135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return;
15145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (this._isRoot)
15155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return;
15165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
15175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (this.revealed && !this._shouldRefreshChildren)
15185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            for (var i = 0; i < this.children.length; ++i)
15195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                this.children[i].revealed = true;
15205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
15215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (this._shouldRefreshChildren) {
15225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            for (var i = 0; i < this.children.length; ++i)
15235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                this.children[i]._detach();
15245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1525926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            this.populate();
15265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
15275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (this._attached) {
15285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                for (var i = 0; i < this.children.length; ++i) {
15295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                    var child = this.children[i];
15305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                    if (this.revealed)
15315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        child.revealed = true;
15325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                    child._attach();
15335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                }
15345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            }
15355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1536c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)            this._shouldRefreshChildren = false;
15375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
15385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
15395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (this._element)
1540a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)            this._element.classList.add("expanded");
15415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
15425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._expanded = true;
15435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
15445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
15455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    expandRecursively: function()
15465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
15475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var item = this;
15485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        while (item) {
15495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            item.expand();
15505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            item = item.traverseNextNode(false, this);
15515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
15525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
15535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
15545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    reveal: function()
15555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
15565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (this._isRoot)
15575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return;
15585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var currentAncestor = this.parent;
15595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        while (currentAncestor && !currentAncestor._isRoot) {
15605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (!currentAncestor.expanded)
15615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                currentAncestor.expand();
15625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            currentAncestor = currentAncestor.parent;
15635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
15645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1565e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        this.element().scrollIntoViewIfNeeded(false);
15665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
15675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
15685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    /**
15695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     * @param {boolean=} supressSelectedEvent
15705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     */
15715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    select: function(supressSelectedEvent)
15725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
15735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!this.dataGrid || !this.selectable || this.selected)
15745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return;
15755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
15765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (this.dataGrid.selectedNode)
15775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            this.dataGrid.selectedNode.deselect();
15785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
15795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._selected = true;
15805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this.dataGrid.selectedNode = this;
15815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
15825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (this._element)
1583a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)            this._element.classList.add("selected");
15845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1585926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        if (!supressSelectedEvent)
15865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            this.dataGrid.dispatchEventToListeners(WebInspector.DataGrid.Events.SelectedNode);
15875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
15885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
15895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    revealAndSelect: function()
15905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
15915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (this._isRoot)
15925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return;
15935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this.reveal();
15945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this.select();
15955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
15965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
15975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    /**
15985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     * @param {boolean=} supressDeselectedEvent
15995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     */
16005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    deselect: function(supressDeselectedEvent)
16015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
16025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!this.dataGrid || this.dataGrid.selectedNode !== this || !this.selected)
16035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return;
16045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
16055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._selected = false;
16065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this.dataGrid.selectedNode = null;
16075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
16085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (this._element)
1609a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)            this._element.classList.remove("selected");
16105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1611926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        if (!supressDeselectedEvent)
16125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            this.dataGrid.dispatchEventToListeners(WebInspector.DataGrid.Events.DeselectedNode);
16135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
16145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1615926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    /**
1616926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)     * @param {boolean} skipHidden
1617a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)     * @param {?WebInspector.DataGridNode=} stayWithin
1618926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)     * @param {boolean=} dontPopulate
1619a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)     * @param {!Object=} info
1620a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)     * @return {?WebInspector.DataGridNode}
1621926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)     */
16225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    traverseNextNode: function(skipHidden, stayWithin, dontPopulate, info)
16235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
16245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!dontPopulate && this.hasChildren)
1625926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            this.populate();
16265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
16275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (info)
16285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            info.depthChange = 0;
16295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
16305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var node = (!skipHidden || this.revealed) ? this.children[0] : null;
16315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (node && (!skipHidden || this.expanded)) {
16325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (info)
16335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                info.depthChange = 1;
16345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return node;
16355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
16365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
16375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (this === stayWithin)
16385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return null;
16395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
16405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        node = (!skipHidden || this.revealed) ? this.nextSibling : null;
16415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (node)
16425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return node;
16435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
16445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        node = this;
16455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        while (node && !node._isRoot && !((!skipHidden || node.revealed) ? node.nextSibling : null) && node.parent !== stayWithin) {
16465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (info)
16475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                info.depthChange -= 1;
16485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            node = node.parent;
16495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
16505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
16515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!node)
16525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return null;
16535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
16545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return (!skipHidden || node.revealed) ? node.nextSibling : null;
16555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
16565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1657926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    /**
1658926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)     * @param {boolean} skipHidden
1659926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)     * @param {boolean=} dontPopulate
1660a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)     * @return {?WebInspector.DataGridNode}
1661926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)     */
16625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    traversePreviousNode: function(skipHidden, dontPopulate)
16635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
16645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var node = (!skipHidden || this.revealed) ? this.previousSibling : null;
16655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!dontPopulate && node && node.hasChildren)
1666926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            node.populate();
16675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
16685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        while (node && ((!skipHidden || (node.revealed && node.expanded)) ? node.children[node.children.length - 1] : null)) {
16695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (!dontPopulate && node.hasChildren)
1670926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)                node.populate();
16715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            node = ((!skipHidden || (node.revealed && node.expanded)) ? node.children[node.children.length - 1] : null);
16725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
16735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
16745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (node)
16755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return node;
16765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
16775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!this.parent || this.parent._isRoot)
16785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return null;
16795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
16805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return this.parent;
16815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
16825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1683926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    /**
1684926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)     * @return {boolean}
1685926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)     */
16865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    isEventWithinDisclosureTriangle: function(event)
16875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
16885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!this.hasChildren)
16895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return false;
16905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var cell = event.target.enclosingNodeOrSelfWithNodeName("td");
1691a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        if (!cell.classList.contains("disclosure"))
16925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return false;
1693926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
16945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var left = cell.totalOffsetLeft() + this.leftPadding;
16955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return event.pageX >= left && event.pageX <= left + this.disclosureToggleWidth;
16965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
16975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
16985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    _attach: function()
16995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
17005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!this.dataGrid || this._attached)
17015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return;
17025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
17035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._attached = true;
17045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
17055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var nextNode = null;
17065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var previousNode = this.traversePreviousNode(true, true);
1707e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        var previousElement = previousNode ? previousNode.element() : this.dataGrid._topFillerRow;
1708e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        this.dataGrid.dataTableBody.insertBefore(this.element(), previousElement.nextSibling);
17095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
17105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (this.expanded)
17115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            for (var i = 0; i < this.children.length; ++i)
17125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                this.children[i]._attach();
17135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
17145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
17155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    _detach: function()
17165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
17175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!this._attached)
17185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return;
17195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
17205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._attached = false;
17215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1722591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        if (this._element)
1723591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch            this._element.remove();
17245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
17255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        for (var i = 0; i < this.children.length; ++i)
17265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            this.children[i]._detach();
17275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
17285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this.wasDetached();
17295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
17305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
17315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    wasDetached: function()
17325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
17335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
17345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
17355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    savePosition: function()
17365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
17375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (this._savedPosition)
17385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return;
17395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
17405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!this.parent)
17415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            throw("savePosition: Node must have a parent.");
17425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._savedPosition = {
17435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            parent: this.parent,
17445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            index: this.parent.children.indexOf(this)
17455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        };
17465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
17475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
17485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    restorePosition: function()
17495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
17505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!this._savedPosition)
17515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return;
17525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
17535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (this.parent !== this._savedPosition.parent)
17545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            this._savedPosition.parent.insertChild(this, this._savedPosition.index);
17555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1756c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        this._savedPosition = null;
17575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
17585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
17595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    __proto__: WebInspector.Object.prototype
17605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
17615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
17625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/**
17635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * @constructor
17645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * @extends {WebInspector.DataGridNode}
17655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */
17665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebInspector.CreationDataGridNode = function(data, hasChildren)
17675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
17685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    WebInspector.DataGridNode.call(this, data, hasChildren);
1769c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    /** @type {boolean} */
17705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this.isCreationNode = true;
17715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
17725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
17735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebInspector.CreationDataGridNode.prototype = {
17745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    makeNormal: function()
17755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
1776c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        this.isCreationNode = false;
17775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
17785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
17795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    __proto__: WebInspector.DataGridNode.prototype
17805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1781