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

Side by Side Diff: third_party/WebKit/Source/devtools/front_end/ui_lazy/DataGrid.js

Issue 2445923002: [Devtools] Cleanup DataGrid.js (Closed)
Patch Set: changes Created 4 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « third_party/WebKit/Source/devtools/front_end/network/NetworkLogViewColumns.js ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2008 Apple Inc. All Rights Reserved. 2 * Copyright (C) 2008 Apple Inc. All Rights Reserved.
3 * 3 *
4 * Redistribution and use in source and binary forms, with or without 4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions 5 * modification, are permitted provided that the following conditions
6 * are met: 6 * are met:
7 * 1. Redistributions of source code must retain the above copyright 7 * 1. Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer. 8 * notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright 9 * 2. Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the 10 * notice, this list of conditions and the following disclaimer in the
(...skipping 21 matching lines...) Expand all
32 * @param {function()=} refreshCallback 32 * @param {function()=} refreshCallback
33 * @param {function(!WebInspector.ContextMenu, !WebInspector.DataGridNode)=} con textMenuCallback 33 * @param {function(!WebInspector.ContextMenu, !WebInspector.DataGridNode)=} con textMenuCallback
34 */ 34 */
35 WebInspector.DataGrid = function(columnsArray, editCallback, deleteCallback, ref reshCallback, contextMenuCallback) 35 WebInspector.DataGrid = function(columnsArray, editCallback, deleteCallback, ref reshCallback, contextMenuCallback)
36 { 36 {
37 this.element = createElementWithClass("div", "data-grid"); 37 this.element = createElementWithClass("div", "data-grid");
38 WebInspector.appendStyle(this.element, "ui_lazy/dataGrid.css"); 38 WebInspector.appendStyle(this.element, "ui_lazy/dataGrid.css");
39 this.element.tabIndex = 0; 39 this.element.tabIndex = 0;
40 this.element.addEventListener("keydown", this._keyDown.bind(this), false); 40 this.element.addEventListener("keydown", this._keyDown.bind(this), false);
41 41
42 var headerContainer = createElementWithClass("div", "header-container");
43 /** @type {!Element} */
44 this._headerTable = headerContainer.createChild("table", "header");
45 /** @type {!Object.<string, !Element>} */
46 this._headerTableHeaders = {};
47
48 /** @type {!Element} */
49 this._scrollContainer = createElementWithClass("div", "data-container");
50 /** @type {!Element} */
51 this._dataTable = this._scrollContainer.createChild("table", "data");
52
53 this._dataTable.addEventListener("mousedown", this._mouseDownInDataTable.bin d(this));
54 this._dataTable.addEventListener("click", this._clickInDataTable.bind(this), true);
55
56 this._dataTable.addEventListener("contextmenu", this._contextMenuInDataTable .bind(this), true);
57
58 // FIXME: Add a createCallback which is different from editCallback and has different
59 // behavior when creating a new node.
60 if (editCallback)
61 this._dataTable.addEventListener("dblclick", this._ondblclick.bind(this) , false);
62 /** @type {function(!WebInspector.DataGridNode, string, string, string)|unde fined} */ 42 /** @type {function(!WebInspector.DataGridNode, string, string, string)|unde fined} */
63 this._editCallback = editCallback; 43 this._editCallback = editCallback;
64 /** @type {function(!WebInspector.DataGridNode)|undefined} */ 44 /** @type {function(!WebInspector.DataGridNode)|undefined} */
65 this._deleteCallback = deleteCallback; 45 this._deleteCallback = deleteCallback;
66 /** @type {function()|undefined} */ 46 /** @type {function()|undefined} */
67 this._refreshCallback = refreshCallback; 47 this._refreshCallback = refreshCallback;
68 /** @type {function(!WebInspector.ContextMenu, !WebInspector.DataGridNode)|u ndefined} */ 48 /** @type {function(!WebInspector.ContextMenu, !WebInspector.DataGridNode)|u ndefined} */
69 this._contextMenuCallback = contextMenuCallback; 49 this._contextMenuCallback = contextMenuCallback;
70 50
71 this.element.appendChild(headerContainer); 51 var headerContainer = this.element.createChild("div", "header-container");
72 this.element.appendChild(this._scrollContainer); 52 /** @type {!Element} */
53 this._headerTable = headerContainer.createChild("table", "header");
54 /** @type {!Object.<string, !Element>} */
55 this._headerTableHeaders = {};
56 /** @type {!Element} */
57 this._scrollContainer = this.element.createChild("div", "data-container");
58 /** @type {!Element} */
59 this._dataTable = this._scrollContainer.createChild("table", "data");
73 60
74 /** @type {!Element} */ 61 // FIXME: Add a createCallback which is different from editCallback and has different
75 this._headerRow = createElement("tr"); 62 // behavior when creating a new node.
76 /** @type {!Element} */ 63 if (editCallback)
77 this._headerTableColumnGroup = createElement("colgroup"); 64 this._dataTable.addEventListener("dblclick", this._ondblclick.bind(this) , false);
78 /** @type {!Element} */ 65 this._dataTable.addEventListener("mousedown", this._mouseDownInDataTable.bin d(this));
79 this._dataTableColumnGroup = createElement("colgroup"); 66 this._dataTable.addEventListener("click", this._clickInDataTable.bind(this), true);
80 67 this._dataTable.addEventListener("contextmenu", this._contextMenuInDataTable .bind(this), true);
81 /** @type {!Element} */
82 this._topFillerRow = createElementWithClass("tr", "data-grid-filler-row reve aled");
83 /** @type {!Element} */
84 this._bottomFillerRow = createElementWithClass("tr", "data-grid-filler-row r evealed");
85 this.setVerticalPadding(0, 0);
86 68
87 /** @type {boolean} */ 69 /** @type {boolean} */
88 this._inline = false; 70 this._inline = false;
89 71
90 /** @type {!Array.<!WebInspector.DataGrid.ColumnDescriptor>} */ 72 /** @type {!Array.<!WebInspector.DataGrid.ColumnDescriptor>} */
91 this._columnsArray = []; 73 this._columnsArray = [];
92 /** @type {!Object.<string, !WebInspector.DataGrid.ColumnDescriptor>} */ 74 /** @type {!Object.<string, !WebInspector.DataGrid.ColumnDescriptor>} */
93 this._columns = {}; 75 this._columns = {};
94 /** @type {!Array.<!WebInspector.DataGrid.ColumnDescriptor>} */ 76 /** @type {!Array.<!WebInspector.DataGrid.ColumnDescriptor>} */
95 this._visibleColumnsArray = columnsArray; 77 this._visibleColumnsArray = columnsArray;
96 78
97 columnsArray.forEach(column => this._innerAddColumn(column)); 79 columnsArray.forEach(column => this._innerAddColumn(column));
98 80
99 /** @type {?string} */ 81 /** @type {?string} */
100 this._cellClass = null; 82 this._cellClass = null;
101 83
102 this._headerTable.appendChild(this._headerTableColumnGroup); 84 /** @type {!Element} */
103 this.headerTableBody.appendChild(this._headerRow); 85 this._headerTableColumnGroup = this._headerTable.createChild("colgroup");
86 /** @type {!Element} */
87 this._headerTableBody = this._headerTable.createChild("tbody");
88 /** @type {!Element} */
89 this._headerRow = this._headerTableBody.createChild("tr");
104 90
105 this._dataTable.appendChild(this._dataTableColumnGroup); 91 /** @type {!Element} */
106 this.dataTableBody.appendChild(this._topFillerRow); 92 this._dataTableColumnGroup = this._dataTable.createChild("colgroup");
107 this.dataTableBody.appendChild(this._bottomFillerRow); 93 /**
94 * @protected
95 * @type {!Element}
96 */
97 this.dataTableBody = this._dataTable.createChild("tbody");
98 /** @type {!Element} */
99 this._topFillerRow = this.dataTableBody.createChild("tr", "data-grid-filler- row revealed");
100 /** @type {!Element} */
101 this._bottomFillerRow = this.dataTableBody.createChild("tr", "data-grid-fill er-row revealed");
108 102
103 this.setVerticalPadding(0, 0);
109 this._refreshHeader(); 104 this._refreshHeader();
110 105
111 /** @type {boolean} */ 106 /** @type {boolean} */
112 this._editing = false; 107 this._editing = false;
113 /** @type {?WebInspector.DataGridNode} */ 108 /** @type {?WebInspector.DataGridNode} */
114 this.selectedNode = null; 109 this.selectedNode = null;
115 /** @type {boolean} */ 110 /** @type {boolean} */
116 this.expandNodesWhenArrowing = false; 111 this.expandNodesWhenArrowing = false;
117 this.setRootNode(new WebInspector.DataGridNode()); 112 this.setRootNode(new WebInspector.DataGridNode());
118 /** @type {number} */ 113 /** @type {number} */
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
167 /** @enum {string} */ 162 /** @enum {string} */
168 WebInspector.DataGrid.Align = { 163 WebInspector.DataGrid.Align = {
169 Center: "center", 164 Center: "center",
170 Right: "right" 165 Right: "right"
171 } 166 }
172 167
173 WebInspector.DataGrid._preferredWidthSymbol = Symbol("preferredWidth"); 168 WebInspector.DataGrid._preferredWidthSymbol = Symbol("preferredWidth");
174 169
175 WebInspector.DataGrid.prototype = { 170 WebInspector.DataGrid.prototype = {
176 /** 171 /**
172 * @return {!Element}
173 */
174 headerTableBody: function()
175 {
176 return this._headerTableBody;
177 },
178
179 /**
177 * @param {!WebInspector.DataGrid.ColumnDescriptor} column 180 * @param {!WebInspector.DataGrid.ColumnDescriptor} column
178 * @param {number=} position 181 * @param {number=} position
179 */ 182 */
180 _innerAddColumn: function(column, position) 183 _innerAddColumn: function(column, position)
181 { 184 {
182 var columnIdentifier = column.identifier = column.id || String(Object.ke ys(this._columns).length); 185 var columnIdentifier = column.identifier = column.id || String(Object.ke ys(this._columns).length);
183 if (columnIdentifier in this._columns) 186 if (columnIdentifier in this._columns)
184 this._innerRemoveColumn(columnIdentifier); 187 this._innerRemoveColumn(columnIdentifier);
185 188
186 if (position === undefined) 189 if (position === undefined)
(...skipping 324 matching lines...) Expand 10 before | Expand all | Expand 10 after
511 }, 514 },
512 515
513 /** 516 /**
514 * @return {boolean} 517 * @return {boolean}
515 */ 518 */
516 isSortOrderAscending: function() 519 isSortOrderAscending: function()
517 { 520 {
518 return !this._sortColumnCell || this._sortColumnCell.classList.contains( WebInspector.DataGrid.Order.Ascending); 521 return !this._sortColumnCell || this._sortColumnCell.classList.contains( WebInspector.DataGrid.Order.Ascending);
519 }, 522 },
520 523
521 get headerTableBody()
522 {
523 if ("_headerTableBody" in this)
524 return this._headerTableBody;
525
526 this._headerTableBody = this._headerTable.getElementsByTagName("tbody")[ 0];
527 if (!this._headerTableBody) {
528 this._headerTableBody = this.element.ownerDocument.createElement("tb ody");
529 this._headerTable.insertBefore(this._headerTableBody, this._headerTa ble.tFoot);
530 }
531
532 return this._headerTableBody;
533 },
534
535 get dataTableBody()
536 {
537 if ("_dataTableBody" in this)
538 return this._dataTableBody;
539
540 this._dataTableBody = this._dataTable.getElementsByTagName("tbody")[0];
541 if (!this._dataTableBody) {
542 this._dataTableBody = this.element.ownerDocument.createElement("tbod y");
543 this._dataTable.insertBefore(this._dataTableBody, this._dataTable.tF oot);
544 }
545
546 return this._dataTableBody;
547 },
548
549 /** 524 /**
550 * @param {!Array.<number>} widths 525 * @param {!Array.<number>} widths
551 * @param {number} minPercent 526 * @param {number} minPercent
552 * @param {number=} maxPercent 527 * @param {number=} maxPercent
553 * @return {!Array.<number>} 528 * @return {!Array.<number>}
554 */ 529 */
555 _autoSizeWidths: function(widths, minPercent, maxPercent) 530 _autoSizeWidths: function(widths, minPercent, maxPercent)
556 { 531 {
557 if (minPercent) 532 if (minPercent)
558 minPercent = Math.min(minPercent, Math.floor(100 / widths.length)); 533 minPercent = Math.min(minPercent, Math.floor(100 / widths.length));
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after
647 // 622 //
648 // IMPORTANT: This function MUST be called once after the element of the 623 // IMPORTANT: This function MUST be called once after the element of the
649 // DataGrid is attached to its parent element and every subsequent time the 624 // DataGrid is attached to its parent element and every subsequent time the
650 // width of the parent element is changed in order to make it possible to 625 // width of the parent element is changed in order to make it possible to
651 // resize the columns. 626 // resize the columns.
652 // 627 //
653 // If this function is not called after the DataGrid is attached to its 628 // If this function is not called after the DataGrid is attached to its
654 // parent element, then the DataGrid's columns will not be resizable. 629 // parent element, then the DataGrid's columns will not be resizable.
655 updateWidths: function() 630 updateWidths: function()
656 { 631 {
657 var headerTableColumns = this._headerTableColumnGroup.children;
658
659 // Use container size to avoid changes of table width caused by change o f column widths.
660 var tableWidth = this.element.offsetWidth - this._cornerWidth;
661 var numColumns = headerTableColumns.length - 1; // Do not process corner column.
662
663 // Do not attempt to use offsetes if we're not attached to the document tree yet. 632 // Do not attempt to use offsetes if we're not attached to the document tree yet.
664 if (!this._columnWidthsInitialized && this.element.offsetWidth) { 633 if (!this._columnWidthsInitialized && this.element.offsetWidth) {
665 // Give all the columns initial widths now so that during a resize, 634 // Give all the columns initial widths now so that during a resize,
666 // when the two columns that get resized get a percent value for 635 // when the two columns that get resized get a percent value for
667 // their widths, all the other columns already have percent values 636 // their widths, all the other columns already have percent values
668 // for their widths. 637 // for their widths.
638 var headerTableColumns = this._headerTableColumnGroup.children;
639
640 // Use container size to avoid changes of table width caused by chan ge of column widths.
641 var tableWidth = this.element.offsetWidth - this._cornerWidth;
642 var cells = this._headerTableBody.rows[0].cells;
643 var numColumns = cells.length - 1; // Do not process corner column.
669 for (var i = 0; i < numColumns; i++) { 644 for (var i = 0; i < numColumns; i++) {
670 var columnWidth = this.headerTableBody.rows[0].cells[i].offsetWi dth;
671 var column = this._visibleColumnsArray[i]; 645 var column = this._visibleColumnsArray[i];
672 if (!column.weight) 646 if (!column.weight)
673 column.weight = 100 * columnWidth / tableWidth; 647 column.weight = 100 * cells[i].offsetWidth / tableWidth;
674 } 648 }
675 this._columnWidthsInitialized = true; 649 this._columnWidthsInitialized = true;
676 } 650 }
677 this._applyColumnWeights(); 651 this._applyColumnWeights();
678 }, 652 },
679 653
680 /** 654 /**
681 * @param {string} name 655 * @param {string} name
682 */ 656 */
683 setName: function(name) 657 setName: function(name)
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
725 { 699 {
726 var tableWidth = this.element.offsetWidth - this._cornerWidth; 700 var tableWidth = this.element.offsetWidth - this._cornerWidth;
727 if (tableWidth <= 0) 701 if (tableWidth <= 0)
728 return; 702 return;
729 703
730 var sumOfWeights = 0.0; 704 var sumOfWeights = 0.0;
731 var fixedColumnWidths = []; 705 var fixedColumnWidths = [];
732 for (var i = 0; i < this._visibleColumnsArray.length; ++i) { 706 for (var i = 0; i < this._visibleColumnsArray.length; ++i) {
733 var column = this._visibleColumnsArray[i]; 707 var column = this._visibleColumnsArray[i];
734 if (column.fixedWidth) { 708 if (column.fixedWidth) {
735 var width = this._headerTableColumnGroup.children[i][WebInspecto r.DataGrid._preferredWidthSymbol] || this.headerTableBody.rows[0].cells[i].offse tWidth; 709 var width = this._headerTableColumnGroup.children[i][WebInspecto r.DataGrid._preferredWidthSymbol] || this._headerTableBody.rows[0].cells[i].offs etWidth;
736 fixedColumnWidths[i] = width; 710 fixedColumnWidths[i] = width;
737 tableWidth -= width; 711 tableWidth -= width;
738 } else { 712 } else {
739 sumOfWeights += this._visibleColumnsArray[i].weight; 713 sumOfWeights += this._visibleColumnsArray[i].weight;
740 } 714 }
741 } 715 }
742 var sum = 0; 716 var sum = 0;
743 var lastOffset = 0; 717 var lastOffset = 0;
744 718
745 for (var i = 0; i < this._visibleColumnsArray.length; ++i) { 719 for (var i = 0; i < this._visibleColumnsArray.length; ++i) {
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
790 var left = []; 764 var left = [];
791 var resizers = this._resizers; 765 var resizers = this._resizers;
792 766
793 while (resizers.length > numColumns - 1) 767 while (resizers.length > numColumns - 1)
794 resizers.pop().remove(); 768 resizers.pop().remove();
795 769
796 for (var i = 0; i < numColumns - 1; i++) { 770 for (var i = 0; i < numColumns - 1; i++) {
797 // Get the width of the cell in the first (and only) row of the 771 // Get the width of the cell in the first (and only) row of the
798 // header table in order to determine the width of the column, since 772 // header table in order to determine the width of the column, since
799 // it is not possible to query a column for its width. 773 // it is not possible to query a column for its width.
800 left[i] = (left[i - 1] || 0) + this.headerTableBody.rows[0].cells[i] .offsetWidth; 774 left[i] = (left[i - 1] || 0) + this._headerTableBody.rows[0].cells[i ].offsetWidth;
801 } 775 }
802 776
803 // Make n - 1 resizers for n columns. 777 // Make n - 1 resizers for n columns.
804 for (var i = 0; i < numColumns - 1; i++) { 778 for (var i = 0; i < numColumns - 1; i++) {
805 var resizer = resizers[i]; 779 var resizer = resizers[i];
806 if (!resizer) { 780 if (!resizer) {
807 // This is the first call to updateWidth, so the resizers need 781 // This is the first call to updateWidth, so the resizers need
808 // to be created. 782 // to be created.
809 resizer = createElement("div"); 783 resizer = createElement("div");
810 resizer.__index = i; 784 resizer.__index = i;
(...skipping 274 matching lines...) Expand 10 before | Expand all | Expand 10 after
1085 1059
1086 _resizerDragging: function(event) 1060 _resizerDragging: function(event)
1087 { 1061 {
1088 var resizer = this._currentResizer; 1062 var resizer = this._currentResizer;
1089 if (!resizer) 1063 if (!resizer)
1090 return; 1064 return;
1091 1065
1092 // Constrain the dragpoint to be within the containing div of the 1066 // Constrain the dragpoint to be within the containing div of the
1093 // datagrid. 1067 // datagrid.
1094 var dragPoint = event.clientX - this.element.totalOffsetLeft(); 1068 var dragPoint = event.clientX - this.element.totalOffsetLeft();
1095 var firstRowCells = this.headerTableBody.rows[0].cells; 1069 var firstRowCells = this._headerTableBody.rows[0].cells;
1096 var leftEdgeOfPreviousColumn = 0; 1070 var leftEdgeOfPreviousColumn = 0;
1097 // Constrain the dragpoint to be within the space made up by the 1071 // Constrain the dragpoint to be within the space made up by the
1098 // column directly to the left and the column directly to the right. 1072 // column directly to the left and the column directly to the right.
1099 var leftCellIndex = resizer.__index; 1073 var leftCellIndex = resizer.__index;
1100 var rightCellIndex = leftCellIndex + 1; 1074 var rightCellIndex = leftCellIndex + 1;
1101 for (var i = 0; i < leftCellIndex; i++) 1075 for (var i = 0; i < leftCellIndex; i++)
1102 leftEdgeOfPreviousColumn += firstRowCells[i].offsetWidth; 1076 leftEdgeOfPreviousColumn += firstRowCells[i].offsetWidth;
1103 1077
1104 // Differences for other resize methods 1078 // Differences for other resize methods
1105 if (this._resizeMethod === WebInspector.DataGrid.ResizeMethod.Last) { 1079 if (this._resizeMethod === WebInspector.DataGrid.ResizeMethod.Last) {
(...skipping 856 matching lines...) Expand 10 before | Expand all | Expand 10 after
1962 detachChildWidgets: function() 1936 detachChildWidgets: function()
1963 { 1937 {
1964 WebInspector.Widget.prototype.detachChildWidgets.call(this); 1938 WebInspector.Widget.prototype.detachChildWidgets.call(this);
1965 for (var dataGrid of this._dataGrids) 1939 for (var dataGrid of this._dataGrids)
1966 this.element.removeChild(dataGrid.element); 1940 this.element.removeChild(dataGrid.element);
1967 this._dataGrids = []; 1941 this._dataGrids = [];
1968 }, 1942 },
1969 1943
1970 __proto__: WebInspector.VBox.prototype 1944 __proto__: WebInspector.VBox.prototype
1971 } 1945 }
OLDNEW
« no previous file with comments | « third_party/WebKit/Source/devtools/front_end/network/NetworkLogViewColumns.js ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698