Title: [139452] trunk/Source/WebCore
Revision
139452
Author
[email protected]
Date
2013-01-11 09:09:21 -0800 (Fri, 11 Jan 2013)

Log Message

Web Inspector: [Resources] Make grid columns set configurable.
https://bugs.webkit.org/show_bug.cgi?id=105739

Patch by Eugene Klyuchnikov <[email protected]> on 2013-01-11
Reviewed by Pavel Feldman.

Added context menu on grid header to hide/show grid columns.
Hidden columns set is persisted.

* inspector/front-end/DataGrid.js:
Fixed show/hide behavior, introduced weight control.
* inspector/front-end/NetworkPanel.js:
Added member to track visibility of columns in detailerd mode. Added
context menu for grid header.

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (139451 => 139452)


--- trunk/Source/WebCore/ChangeLog	2013-01-11 17:08:45 UTC (rev 139451)
+++ trunk/Source/WebCore/ChangeLog	2013-01-11 17:09:21 UTC (rev 139452)
@@ -1,3 +1,19 @@
+2013-01-11  Eugene Klyuchnikov  <[email protected]>
+
+        Web Inspector: [Resources] Make grid columns set configurable.
+        https://bugs.webkit.org/show_bug.cgi?id=105739
+
+        Reviewed by Pavel Feldman.
+
+        Added context menu on grid header to hide/show grid columns.
+        Hidden columns set is persisted.
+
+        * inspector/front-end/DataGrid.js:
+        Fixed show/hide behavior, introduced weight control.
+        * inspector/front-end/NetworkPanel.js:
+        Added member to track visibility of columns in detailerd mode. Added
+        context menu for grid header.
+
 2013-01-11  Andras Becsi  <[email protected]>
 
         [Qt] Fix the build if libxslt is not available but libxml2 is

Modified: trunk/Source/WebCore/inspector/front-end/DataGrid.js (139451 => 139452)


--- trunk/Source/WebCore/inspector/front-end/DataGrid.js	2013-01-11 17:08:45 UTC (rev 139451)
+++ trunk/Source/WebCore/inspector/front-end/DataGrid.js	2013-01-11 17:09:21 UTC (rev 139452)
@@ -588,73 +588,50 @@
         this.dispatchEventToListeners("width changed");
     },
 
-    columnWidthsMap: function()
+    applyColumnWeights: function()
     {
-        var result = {};
-        for (var i = 0; i < this._columnsArray.length; ++i) {
-            var width = this._headerTableColumnGroup.children[i].style.width;
-            result[this._columnsArray[i].columnIdentifier] = parseFloat(width);
+        var sumOfWeights = 0.0;
+        for (var columnIdentifier in this.columns) {
+            if (this.isColumnVisible(columnIdentifier))
+                sumOfWeights += this.columns[columnIdentifier].weight;
         }
-        return result;
-    },
+        var factor = 100 / sumOfWeights;
 
-    applyColumnWidthsMap: function(columnWidthsMap)
-    {
         for (var columnIdentifier in this.columns) {
             var column = this.columns[columnIdentifier];
-            var width = (columnWidthsMap[columnIdentifier] || 0) + "%";
+            var width = this.isColumnVisible(columnIdentifier) ? ((factor * column.weight) + "%"): "0%";
             this._headerTableColumnGroup.children[column.ordinal].style.width = width;
             this._dataTableColumnGroup.children[column.ordinal].style.width = width;
         }
 
-        // Normalize widths
-        delete this._columnWidthsInitialized;
-        this.updateWidths();
+        this._positionResizers();
+        this.dispatchEventToListeners("width changed");
     },
 
+    /**
+     * @param {string} columnIdentifier
+     */
     isColumnVisible: function(columnIdentifier)
     {
-        var column = this.columns[columnIdentifier];
-        var columnElement = column.element;
-        return !columnElement.hidden;
+        return !this.columns[columnIdentifier].hidden;
     },
 
-    showColumn: function(columnIdentifier)
+    /**
+     * @param {string} columnIdentifier
+     * @param {boolean} visible
+     */
+    setColumnVisible: function(columnIdentifier, visible)
     {
-        var column = this.columns[columnIdentifier];
-        var columnElement = column.element;
-        if (!columnElement.hidden)
+        if (visible === !this.columns[columnIdentifier].hidden)
             return;
 
-        columnElement.hidden = false;
-        columnElement.removeStyleClass("hidden");
-
-        var columnBodyElement = column.bodyElement;
-        columnBodyElement.hidden = false;
-        columnBodyElement.removeStyleClass("hidden");
+        this.columns[columnIdentifier].hidden = !visible;
+        if (visible)
+            this.element.removeStyleClass("hide-" + columnIdentifier + "-column");
+        else
+            this.element.addStyleClass("hide-" + columnIdentifier + "-column");
     },
 
-    hideColumn: function(columnIdentifier)
-    {
-        var column = this.columns[columnIdentifier];
-        var columnElement = column.element;
-        if (columnElement.hidden)
-            return;
-
-        var oldWidth = parseFloat(columnElement.style.width);
-
-        columnElement.hidden = true;
-        columnElement.addStyleClass("hidden");
-        columnElement.style.width = 0;
-
-        var columnBodyElement = column.bodyElement;
-        columnBodyElement.hidden = true;
-        columnBodyElement.addStyleClass("hidden");
-        columnBodyElement.style.width = 0;
-
-        this._columnWidthsInitialized = false;
-    },
-
     get scrollContainer()
     {
         return this._scrollContainer;
@@ -697,8 +674,7 @@
             // it is not possible to query a column for its width.
             left += this.headerTableBody.rows[0].cells[i].offsetWidth;
 
-            var columnIsVisible = !this._headerTableColumnGroup.children[i].hidden;
-            if (columnIsVisible) {
+            if (!this._columnsArray[i].hidden) {
                 resizer.style.removeProperty("display");
                 resizer.style.left = left + "px";
                 resizer.leftNeighboringColumnIndex = i;
@@ -1028,6 +1004,15 @@
         this._headerTableColumnGroup.children[rightCellIndex].style.width =  percentRightColumn;
         this._dataTableColumnGroup.children[rightCellIndex].style.width = percentRightColumn;
 
+        var leftColumn = this._columnsArray[leftCellIndex];
+        var rightColumn = this._columnsArray[rightCellIndex];
+        if (leftColumn.weight || rightColumn.weight) {
+            var sumOfWeights = leftColumn.weight + rightColumn.weight;
+            var delta = rightEdgeOfNextColumn - leftEdgeOfPreviousColumn;
+            leftColumn.weight = (dragPoint - leftEdgeOfPreviousColumn) * sumOfWeights / delta;
+            rightColumn.weight = (rightEdgeOfNextColumn - dragPoint) * sumOfWeights / delta;
+        }
+
         this._positionResizers();
         event.preventDefault();
         this.dispatchEventToListeners("width changed");

Modified: trunk/Source/WebCore/inspector/front-end/NetworkPanel.js (139451 => 139452)


--- trunk/Source/WebCore/inspector/front-end/NetworkPanel.js	2013-01-11 17:08:45 UTC (rev 139451)
+++ trunk/Source/WebCore/inspector/front-end/NetworkPanel.js	2013-01-11 17:09:21 UTC (rev 139452)
@@ -42,12 +42,14 @@
 /**
  * @constructor
  * @extends {WebInspector.View}
+ * @param {WebInspector.Setting} coulmnsVisibilitySetting
  */
-WebInspector.NetworkLogView = function()
+WebInspector.NetworkLogView = function(coulmnsVisibilitySetting)
 {
     WebInspector.View.call(this);
     this.registerRequiredCSS("networkLogView.css");
 
+    this._coulmnsVisibilitySetting = coulmnsVisibilitySetting;
     this._allowRequestSelection = false;
     this._requests = [];
     this._requestsById = {};
@@ -93,6 +95,8 @@
     WebInspector.networkLog.requests.forEach(this._appendRequest.bind(this));
 }
 
+WebInspector.NetworkLogView._defaultColumnsVisivility = {method: true, status: true, type: true, initiator: true, size: true, time: true};
+
 WebInspector.NetworkLogView.prototype = {
     _initializeView: function()
     {
@@ -156,39 +160,44 @@
         var columns = {name: {}, method: {}, status: {}, type: {}, initiator: {}, size: {}, time: {}, timeline: {}};
 
         columns.name.titleDOMFragment = this._makeHeaderFragment(WebInspector.UIString("Name"), WebInspector.UIString("Path"));
+        columns.name.name = WebInspector.UIString("Name");
         columns.name.sortable = true;
-        columns.name.width = "20%";
+        columns.name.weight = 20;
         columns.name.disclosure = true;
 
         columns.method.title = WebInspector.UIString("Method");
         columns.method.sortable = true;
-        columns.method.width = "6%";
+        columns.method.weight = 6;
 
         columns.status.titleDOMFragment = this._makeHeaderFragment(WebInspector.UIString("Status"), WebInspector.UIString("Text"));
+        columns.status.name = WebInspector.UIString("Status");
         columns.status.sortable = true;
-        columns.status.width = "6%";
+        columns.status.weight = 6;
 
         columns.type.title = WebInspector.UIString("Type");
         columns.type.sortable = true;
-        columns.type.width = "6%";
+        columns.type.weight = 6;
 
         columns.initiator.title = WebInspector.UIString("Initiator");
         columns.initiator.sortable = true;
-        columns.initiator.width = "10%";
+        columns.initiator.weight = 10;
 
         columns.size.titleDOMFragment = this._makeHeaderFragment(WebInspector.UIString("Size"), WebInspector.UIString("Content"));
+        columns.size.name = WebInspector.UIString("Size");
         columns.size.sortable = true;
-        columns.size.width = "6%";
+        columns.size.weight = 6;
         columns.size.aligned = "right";
 
         columns.time.titleDOMFragment = this._makeHeaderFragment(WebInspector.UIString("Time"), WebInspector.UIString("Latency"));
+        columns.time.name = WebInspector.UIString("Time");
         columns.time.sortable = true;
-        columns.time.width = "6%";
+        columns.time.weight = 6;
         columns.time.aligned = "right";
 
         columns.timeline.title = "";
+        columns.timeline.name = WebInspector.UIString("Timeline");
         columns.timeline.sortable = false;
-        columns.timeline.width = "40%";
+        columns.timeline.weight = 40;
         columns.timeline.sort = "ascending";
 
         this._dataGrid = new WebInspector.DataGrid(columns);
@@ -856,45 +865,16 @@
             this._dataGrid.selectedNode.selected = false;
 
         this.element.removeStyleClass("brief-mode");
-
-        this._dataGrid.showColumn("method");
-        this._dataGrid.showColumn("status");
-        this._dataGrid.showColumn("type");
-        this._dataGrid.showColumn("initiator");
-        this._dataGrid.showColumn("size");
-        this._dataGrid.showColumn("time");
-        this._dataGrid.showColumn("timeline");
-
-        var widths = {};
-        widths.name = 20;
-        widths.method = 6;
-        widths.status = 6;
-        widths.type = 6;
-        widths.initiator = 10;
-        widths.size = 6;
-        widths.time = 6;
-        widths.timeline = 40;
-
-        this._dataGrid.applyColumnWidthsMap(widths);
+        this._detailedMode = true;
+        this._updateColumns();
     },
 
     switchToBriefView: function()
     {
         this.element.addStyleClass("brief-mode");
         this._removeAllNodeHighlights();
-
-        this._dataGrid.hideColumn("method");
-        this._dataGrid.hideColumn("status");
-        this._dataGrid.hideColumn("type");
-        this._dataGrid.hideColumn("initiator");
-        this._dataGrid.hideColumn("size");
-        this._dataGrid.hideColumn("time");
-        this._dataGrid.hideColumn("timeline");
-
-        var widths = {};
-        widths.name = 100;
-        this._dataGrid.applyColumnWidthsMap(widths);
-
+        this._detailedMode = false;
+        this._updateColumns();
         this._popoverHelper.hidePopover();
     },
 
@@ -967,9 +947,44 @@
         return framesTable;
     },
 
+    _updateColumns: function()
+    {
+        var columnsVisibility = this._coulmnsVisibilitySetting.get();
+        var detailedMode = !!this._detailedMode;
+        for (var columnIdentifier in columnsVisibility) {
+            var visible = detailedMode && columnsVisibility[columnIdentifier];
+            this._dataGrid.setColumnVisible(columnIdentifier, visible);
+        }
+        this._dataGrid.setColumnVisible("timeline", detailedMode);
+        this._dataGrid.applyColumnWeights();
+    },
+
+    /**
+     * @param {string} columnIdentifier
+     */
+    _toggleColumnVisibility: function(columnIdentifier)
+    {
+        var columnsVisibility = this._coulmnsVisibilitySetting.get();
+        columnsVisibility[columnIdentifier] = !columnsVisibility[columnIdentifier];
+        this._coulmnsVisibilitySetting.set(columnsVisibility);
+
+        this._updateColumns();
+    },
+
     _contextMenu: function(event)
     {
         var contextMenu = new WebInspector.ContextMenu(event);
+
+        if (this._detailedMode && event.target.isSelfOrDescendant(this._dataGrid.headerTableBody)) {
+            var columnsVisibility = this._coulmnsVisibilitySetting.get();
+            for (var columnIdentifier in columnsVisibility) {
+                var column = this._dataGrid.columns[columnIdentifier];
+                contextMenu.appendCheckboxItem(column.name || column.title, this._toggleColumnVisibility.bind(this, columnIdentifier), !!columnsVisibility[columnIdentifier]);
+            }
+            contextMenu.show();
+            return;
+        }
+
         var gridNode = this._dataGrid.dataGridNodeFromNode(event.target);
         var request = gridNode && gridNode._request;
 
@@ -1323,11 +1338,20 @@
 {
     WebInspector.Panel.call(this, "network");
     this.registerRequiredCSS("networkPanel.css");
+    this._injectStyles();
 
     this.createSidebarView();
     this.splitView.hideMainElement();
 
-    this._networkLogView = new WebInspector.NetworkLogView();
+    var defaultColumnsVisibility = WebInspector.NetworkLogView._defaultColumnsVisivility;
+    var networkLogColumnsVisibilitySetting = WebInspector.settings.createSetting("networkLogColumnsVisibility", defaultColumnsVisibility);
+    var savedColumnsVisibility = networkLogColumnsVisibilitySetting.get();
+    var columnsVisibility = {};
+    for (var columnId in defaultColumnsVisibility)
+        columnsVisibility[columnId] = savedColumnsVisibility.hasOwnProperty(columnId) ? savedColumnsVisibility[columnId] : defaultColumnsVisibility[columnId];
+    networkLogColumnsVisibilitySetting.set(columnsVisibility);
+
+    this._networkLogView = new WebInspector.NetworkLogView(networkLogColumnsVisibilitySetting);
     this._networkLogView.show(this.sidebarElement);
 
     this._viewsContainerElement = this.splitView.mainElement;
@@ -1562,6 +1586,21 @@
         contextMenu.appendItem(WebInspector.UIString(WebInspector.useLowerCaseMenuTitles() ? "Reveal in network panel" : "Reveal in Network Panel"), reveal.bind(this));
     },
 
+    _injectStyles: function()
+    {
+        var style = document.createElement("style");
+        var rules = [];
+
+        var columns = WebInspector.NetworkLogView._defaultColumnsVisivility;
+        var columnSelectors = [];
+        for (var columnId in columns)
+            columnSelectors.push("#network-container .hide-" + columnId + "-column ." + columnId + "-column");
+        rules.push(columnSelectors.join(", ") + "{border-right: 0 none transparent;}");
+
+        style.textContent = rules.join("\n");
+        document.head.appendChild(style);
+    },
+
     __proto__: WebInspector.Panel.prototype
 }
 
_______________________________________________
webkit-changes mailing list
[email protected]
http://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to