@deephaven/grid 0.5.2-beta.0 → 0.6.1-demo.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (76) hide show
  1. package/dist/CellInputField.js +40 -88
  2. package/dist/CellInputField.js.map +1 -1
  3. package/dist/Grid.js +1449 -1484
  4. package/dist/Grid.js.map +1 -1
  5. package/dist/GridColorUtils.js +18 -51
  6. package/dist/GridColorUtils.js.map +1 -1
  7. package/dist/GridMetricCalculator.d.ts +8 -1
  8. package/dist/GridMetricCalculator.d.ts.map +1 -1
  9. package/dist/GridMetricCalculator.js +1031 -994
  10. package/dist/GridMetricCalculator.js.map +1 -1
  11. package/dist/GridModel.d.ts +4 -1
  12. package/dist/GridModel.d.ts.map +1 -1
  13. package/dist/GridModel.js +175 -286
  14. package/dist/GridModel.js.map +1 -1
  15. package/dist/GridMouseHandler.js +39 -59
  16. package/dist/GridMouseHandler.js.map +1 -1
  17. package/dist/GridRange.js +572 -630
  18. package/dist/GridRange.js.map +1 -1
  19. package/dist/GridRenderer.js +1650 -1564
  20. package/dist/GridRenderer.js.map +1 -1
  21. package/dist/GridTestUtils.js +15 -29
  22. package/dist/GridTestUtils.js.map +1 -1
  23. package/dist/GridUtils.js +679 -717
  24. package/dist/GridUtils.js.map +1 -1
  25. package/dist/KeyHandler.js +6 -18
  26. package/dist/KeyHandler.js.map +1 -1
  27. package/dist/MockGridModel.js +105 -210
  28. package/dist/MockGridModel.js.map +1 -1
  29. package/dist/MockTreeGridModel.js +113 -183
  30. package/dist/MockTreeGridModel.js.map +1 -1
  31. package/dist/errors/PasteError.js +5 -44
  32. package/dist/errors/PasteError.js.map +1 -1
  33. package/dist/errors/index.js +1 -1
  34. package/dist/errors/index.js.map +1 -1
  35. package/dist/index.js +15 -15
  36. package/dist/index.js.map +1 -1
  37. package/dist/key-handlers/EditKeyHandler.js +42 -75
  38. package/dist/key-handlers/EditKeyHandler.js.map +1 -1
  39. package/dist/key-handlers/PasteKeyHandler.js +42 -78
  40. package/dist/key-handlers/PasteKeyHandler.js.map +1 -1
  41. package/dist/key-handlers/SelectionKeyHandler.d.ts.map +1 -1
  42. package/dist/key-handlers/SelectionKeyHandler.js +239 -229
  43. package/dist/key-handlers/SelectionKeyHandler.js.map +1 -1
  44. package/dist/key-handlers/TreeKeyHandler.js +42 -72
  45. package/dist/key-handlers/TreeKeyHandler.js.map +1 -1
  46. package/dist/key-handlers/index.js +4 -4
  47. package/dist/key-handlers/index.js.map +1 -1
  48. package/dist/memoizeClear.js +1 -1
  49. package/dist/memoizeClear.js.map +1 -1
  50. package/dist/mouse-handlers/EditMouseHandler.js +18 -50
  51. package/dist/mouse-handlers/EditMouseHandler.js.map +1 -1
  52. package/dist/mouse-handlers/GridColumnMoveMouseHandler.d.ts.map +1 -1
  53. package/dist/mouse-handlers/GridColumnMoveMouseHandler.js +141 -163
  54. package/dist/mouse-handlers/GridColumnMoveMouseHandler.js.map +1 -1
  55. package/dist/mouse-handlers/GridColumnSeparatorMouseHandler.js +47 -86
  56. package/dist/mouse-handlers/GridColumnSeparatorMouseHandler.js.map +1 -1
  57. package/dist/mouse-handlers/GridHorizontalScrollBarMouseHandler.js +145 -171
  58. package/dist/mouse-handlers/GridHorizontalScrollBarMouseHandler.js.map +1 -1
  59. package/dist/mouse-handlers/GridRowMoveMouseHandler.js +125 -147
  60. package/dist/mouse-handlers/GridRowMoveMouseHandler.js.map +1 -1
  61. package/dist/mouse-handlers/GridRowSeparatorMouseHandler.js +47 -86
  62. package/dist/mouse-handlers/GridRowSeparatorMouseHandler.js.map +1 -1
  63. package/dist/mouse-handlers/GridRowTreeMouseHandler.js +46 -76
  64. package/dist/mouse-handlers/GridRowTreeMouseHandler.js.map +1 -1
  65. package/dist/mouse-handlers/GridScrollBarCornerMouseHandler.js +31 -62
  66. package/dist/mouse-handlers/GridScrollBarCornerMouseHandler.js.map +1 -1
  67. package/dist/mouse-handlers/GridSelectionMouseHandler.js +200 -222
  68. package/dist/mouse-handlers/GridSelectionMouseHandler.js.map +1 -1
  69. package/dist/mouse-handlers/GridSeparatorMouseHandler.js +206 -253
  70. package/dist/mouse-handlers/GridSeparatorMouseHandler.js.map +1 -1
  71. package/dist/mouse-handlers/GridVerticalScrollBarMouseHandler.js +146 -172
  72. package/dist/mouse-handlers/GridVerticalScrollBarMouseHandler.js.map +1 -1
  73. package/dist/mouse-handlers/index.js +10 -10
  74. package/dist/mouse-handlers/index.js.map +1 -1
  75. package/dist/tsconfig.tsbuildinfo +1 -1
  76. package/package.json +6 -10
@@ -1,26 +1,8 @@
1
- function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
2
-
3
- function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
4
-
5
- function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
6
-
7
- function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
8
-
9
- function _iterableToArrayLimit(arr, i) { if (typeof Symbol === "undefined" || !(Symbol.iterator in Object(arr))) return; var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
10
-
11
- function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
12
-
13
- function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
14
-
15
- function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
16
-
17
- function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
18
-
19
1
  function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
20
2
 
21
- import memoizeClear from './memoizeClear';
22
- import GridUtils from './GridUtils';
23
- import GridColorUtils from './GridColorUtils';
3
+ import memoizeClear from "./memoizeClear.js";
4
+ import GridUtils from "./GridUtils.js";
5
+ import GridColorUtils from "./GridColorUtils.js";
24
6
  /* eslint react/destructuring-assignment: "off" */
25
7
 
26
8
  /* eslint class-methods-use-this: "off" */
@@ -33,1826 +15,1930 @@ import GridColorUtils from './GridColorUtils';
33
15
  * your own methods to customize drawing of the grid (eg. Draw icons or special features)
34
16
  */
35
17
 
36
- var GridRenderer = /*#__PURE__*/function () {
37
- function GridRenderer() {
38
- _classCallCheck(this, GridRenderer);
39
-
40
- _defineProperty(this, "getCachedTruncatedString", memoizeClear(function (context, text, width, fontWidth) {
41
- return GridRenderer.truncateToWidth(context, text, width, fontWidth);
42
- }, {
18
+ class GridRenderer {
19
+ constructor() {
20
+ _defineProperty(this, "getCachedTruncatedString", memoizeClear((context, text, width, fontWidth) => GridRenderer.truncateToWidth(context, text, width, fontWidth), {
43
21
  max: 10000
44
22
  }));
45
23
 
46
- _defineProperty(this, "getCachedBackgroundColors", memoizeClear(function (backgroundColors, maxDepth) {
47
- return backgroundColors.split(' ').map(function (color) {
48
- var colors = [];
24
+ _defineProperty(this, "getCachedBackgroundColors", memoizeClear((backgroundColors, maxDepth) => backgroundColors.split(' ').map(color => {
25
+ var colors = [];
49
26
 
50
- for (var i = 0; i < maxDepth; i += 1) {
51
- colors.push(GridColorUtils.darkenForDepth(color, i, maxDepth));
52
- }
27
+ for (var i = 0; i < maxDepth; i += 1) {
28
+ colors.push(GridColorUtils.darkenForDepth(color, i, maxDepth));
29
+ }
53
30
 
54
- return colors;
55
- });
56
- }, {
31
+ return colors;
32
+ }), {
57
33
  max: 1000
58
34
  }));
59
35
 
60
- _defineProperty(this, "getCachedColorWithAlpha", memoizeClear(function (color, alpha) {
61
- return GridColorUtils.colorWithAlpha(color, alpha);
62
- }, {
36
+ _defineProperty(this, "getCachedColorWithAlpha", memoizeClear((color, alpha) => GridColorUtils.colorWithAlpha(color, alpha), {
63
37
  max: 1000
64
38
  }));
65
39
  }
66
40
 
67
- _createClass(GridRenderer, [{
68
- key: "drawCanvas",
69
- value:
70
- /**
71
- *
72
- * @param {CanvasRenderingContext2D} context The context to draw the grid in
73
- * @param {GridState} state State of the grid, { left, top, mouseX, mouseY, selectedRanges, theme, model, metrics }
74
- */
75
- function drawCanvas(state) {
76
- var context = state.context;
77
- context.save();
78
- this.configureContext(context, state);
79
- this.drawBackground(context, state);
80
- this.drawGrid(context, state);
81
- this.drawHeaders(context, state);
82
- this.drawFooters(context, state);
83
- this.drawDraggingColumn(context, state);
84
- this.drawDraggingRow(context, state);
85
- this.drawScrollBars(context, state);
86
- context.restore();
41
+ /**
42
+ * Truncate a string and add ellipses if necessary
43
+ * @param {string} str The string to truncate
44
+ * @param {number} len The length to truncate the string to. If longer than the actual string, just returns the string
45
+ */
46
+ static truncate(str, len) {
47
+ if (len < str.length) {
48
+ // eslint-disable-next-line prefer-template
49
+ return str.substr(0, len) + '…';
87
50
  }
88
- }, {
89
- key: "configureContext",
90
- value: function configureContext(context, state) {
91
- var theme = state.theme;
92
- context.font = theme.font;
93
- context.textBaseline = 'middle';
94
- context.lineCap = 'butt';
95
- }
96
- }, {
97
- key: "drawBackground",
98
- value: function drawBackground(context, state) {
99
- var theme = state.theme,
100
- metrics = state.metrics;
101
- var width = metrics.width,
102
- height = metrics.height;
103
- context.fillStyle = theme.backgroundColor;
104
- context.fillRect(0, 0, width, height);
105
- }
106
- }, {
107
- key: "drawGrid",
108
- value: function drawGrid(context, state) {
109
- var metrics = state.metrics,
110
- draggingRow = state.draggingRow,
111
- draggingColumn = state.draggingColumn;
112
- var gridX = metrics.gridX,
113
- gridY = metrics.gridY;
114
- context.translate(gridX, gridY);
115
- this.drawGridBackground(context, state, draggingRow == null && draggingColumn == null);
116
- this.drawCellContents(context, state);
117
- this.drawFloatingRows(context, state);
118
- this.drawFloatingColumns(context, state);
119
- context.translate(-gridX, -gridY);
120
- }
121
- }, {
122
- key: "drawFloatingRows",
123
- value: function drawFloatingRows(context, state) {
124
- var metrics = state.metrics,
125
- theme = state.theme;
126
- var draggingRow = metrics.draggingRow,
127
- draggingColumn = metrics.draggingColumn,
128
- floatingTopRowCount = metrics.floatingTopRowCount,
129
- floatingBottomRowCount = metrics.floatingBottomRowCount,
130
- floatingRows = metrics.floatingRows,
131
- rowCount = metrics.rowCount,
132
- visibleColumns = metrics.visibleColumns,
133
- visibleRowYs = metrics.visibleRowYs,
134
- visibleRowHeights = metrics.visibleRowHeights;
135
-
136
- if (floatingRows.length === 0) {
137
- return;
138
- }
139
-
140
- if (theme.floatingRowBackgroundColors) {
141
- this.drawRowStripesForRows(context, state, floatingRows, theme.floatingRowBackgroundColors);
142
- }
143
-
144
- if (draggingRow == null && draggingColumn == null) {
145
- this.drawFloatingMouseRowHover(context, state);
146
- }
147
-
148
- this.drawGridLinesForItems(context, state, visibleColumns, floatingRows, theme.floatingGridColumnColor, theme.floatingGridRowColor);
149
- this.drawCellBackgroundsForItems(context, state, visibleColumns, floatingRows);
150
- this.drawFloatingBorders(context, state); // Draw the floating row selection...
151
51
 
152
- if (floatingTopRowCount > 0) {
153
- this.drawSelectedRanges(context, state, {
154
- top: 0,
155
- bottom: floatingTopRowCount - 1,
156
- maxY: visibleRowYs.get(floatingTopRowCount - 1) + visibleRowHeights.get(floatingTopRowCount - 1) - 0.5
157
- }, true);
158
- }
52
+ return str;
53
+ }
54
+ /**
55
+ * Uses binary search to truncate a string to fit in the provided width
56
+ * @param {Context} context The drawing context to measure the text in
57
+ * @param {string} str The string to get the maximum length it can draw
58
+ * @param {number} width The width to truncate it to
59
+ * @param {number} start The low boundary to start the search
60
+ * @param {number} end The high boundary to start the search
61
+ */
62
+
63
+
64
+ static binaryTruncateToWidth(context, str, width) {
65
+ var start = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 0;
66
+ var end = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : str.length;
67
+
68
+ if (end >= str.length && context.measureText(str).width <= width) {
69
+ // IDS-6069 If the whole string can fit, don't bother checking for truncation
70
+ // The ellipses are actually slightly wider than other chars, and it's possible
71
+ // that the "truncation" ends up being slightly longer, which messes up the search
72
+ // algorithm below.
73
+ // Besides, if we already fit, it's just faster to not bother checking other truncations.
74
+ return str;
75
+ }
159
76
 
160
- if (floatingBottomRowCount > 0) {
161
- this.drawSelectedRanges(context, state, {
162
- top: rowCount - floatingBottomRowCount - 1,
163
- bottom: rowCount - 1,
164
- minY: visibleRowYs.get(rowCount - floatingBottomRowCount) + 0.5,
165
- maxY: visibleRowYs.get(rowCount - 1) + visibleRowHeights.get(rowCount - 1) - 0.5
166
- }, true);
167
- } // Draw the cell content...
77
+ var lo = start;
78
+ var hi = Math.min(str.length - 1, end);
79
+ var result = str;
168
80
 
81
+ while (hi > lo) {
82
+ var mid = Math.ceil((hi + lo) / 2);
83
+ var truncatedStr = GridRenderer.truncate(str, mid);
169
84
 
170
- for (var c = 0; c < visibleColumns.length; c += 1) {
171
- var column = visibleColumns[c];
85
+ if (context.measureText(truncatedStr).width <= width) {
86
+ result = truncatedStr;
172
87
 
173
- for (var r = 0; r < floatingRows.length; r += 1) {
174
- var row = floatingRows[r];
175
- this.drawCellContent(context, state, column, row);
88
+ if (lo === mid) {
89
+ break;
176
90
  }
91
+
92
+ lo = mid;
93
+ } else {
94
+ hi = mid - 1;
177
95
  }
178
96
  }
179
- }, {
180
- key: "drawFloatingColumns",
181
- value: function drawFloatingColumns(context, state) {
182
- var metrics = state.metrics,
183
- theme = state.theme;
184
- var draggingRow = metrics.draggingRow,
185
- draggingColumn = metrics.draggingColumn,
186
- floatingLeftColumnCount = metrics.floatingLeftColumnCount,
187
- floatingRightColumnCount = metrics.floatingRightColumnCount,
188
- floatingLeftWidth = metrics.floatingLeftWidth,
189
- floatingRightWidth = metrics.floatingRightWidth,
190
- floatingColumns = metrics.floatingColumns,
191
- gridX = metrics.gridX,
192
- maxX = metrics.maxX,
193
- columnCount = metrics.columnCount,
194
- visibleRows = metrics.visibleRows,
195
- visibleColumnXs = metrics.visibleColumnXs,
196
- visibleColumnWidths = metrics.visibleColumnWidths,
197
- width = metrics.width;
198
-
199
- if (floatingColumns.length === 0) {
200
- return;
201
- }
202
97
 
203
- if (theme.floatingRowBackgroundColors) {
204
- this.drawRowStripesForRows(context, state, visibleRows, theme.floatingRowBackgroundColors, 0, floatingLeftWidth);
205
- this.drawRowStripesForRows(context, state, visibleRows, theme.floatingRowBackgroundColors, width - gridX - floatingRightWidth, maxX);
206
- }
98
+ return result;
99
+ }
100
+ /**
101
+ * Truncate a string (if necessary) to fit in the specified width.
102
+ * First uses the estimated font width to calculate a lower/upper bound
103
+ * Then uses binary search within those bounds to find the exact max length
104
+ * @param {Context} context The drawing context
105
+ * @param {string} str The string to calculate max length for
106
+ * @param {number} width The width to truncate within
107
+ * @param {number} fontWidth The estimated width of each character
108
+ */
109
+
110
+
111
+ static truncateToWidth(context, str, width) {
112
+ var fontWidth = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : GridRenderer.DEFAULT_FONT_WIDTH;
113
+
114
+ if (width <= 0 || str.length <= 0) {
115
+ return null;
116
+ }
207
117
 
208
- if (draggingRow == null && draggingColumn == null) {
209
- this.drawFloatingMouseRowHover(context, state);
210
- }
118
+ var lo = Math.min(Math.floor(width / fontWidth / 2), str.length);
119
+ var hi = Math.min(Math.ceil(width / fontWidth * 2), str.length);
120
+ return GridRenderer.binaryTruncateToWidth(context, str, width, lo, hi);
121
+ }
122
+ /**
123
+ *
124
+ * @param {CanvasRenderingContext2D} context The context to draw the grid in
125
+ * @param {GridState} state State of the grid, { left, top, mouseX, mouseY, selectedRanges, theme, model, metrics }
126
+ */
127
+
128
+
129
+ drawCanvas(state) {
130
+ var {
131
+ context
132
+ } = state;
133
+ context.save();
134
+ this.configureContext(context, state);
135
+ this.drawBackground(context, state);
136
+ this.drawGrid(context, state);
137
+ this.drawHeaders(context, state);
138
+ this.drawFooters(context, state);
139
+ this.drawDraggingColumn(context, state);
140
+ this.drawDraggingRow(context, state);
141
+ this.drawScrollBars(context, state);
142
+ context.restore();
143
+ }
211
144
 
212
- this.drawGridLinesForItems(context, state, floatingColumns, visibleRows, theme.floatingGridColumnColor, theme.floatingGridRowColor);
213
- this.drawCellBackgroundsForItems(context, state, floatingColumns, visibleRows);
214
- this.drawFloatingBorders(context, state); // Draw the floating column selection...
145
+ configureContext(context, state) {
146
+ var {
147
+ theme
148
+ } = state;
149
+ context.font = theme.font;
150
+ context.textBaseline = 'middle';
151
+ context.lineCap = 'butt';
152
+ }
215
153
 
216
- if (floatingLeftColumnCount > 0) {
217
- this.drawSelectedRanges(context, state, {
218
- left: 0,
219
- right: floatingLeftColumnCount,
220
- maxX: visibleColumnXs.get(floatingLeftColumnCount - 1) + visibleColumnWidths.get(floatingLeftColumnCount - 1)
221
- }, true);
222
- }
154
+ drawBackground(context, state) {
155
+ var {
156
+ theme,
157
+ metrics
158
+ } = state;
159
+ var {
160
+ width,
161
+ height
162
+ } = metrics;
163
+ context.fillStyle = theme.backgroundColor;
164
+ context.fillRect(0, 0, width, height);
165
+ }
223
166
 
224
- if (floatingRightColumnCount > 0) {
225
- this.drawSelectedRanges(context, state, {
226
- left: columnCount - floatingRightColumnCount,
227
- right: columnCount - 1,
228
- minX: visibleColumnXs.get(columnCount - floatingRightColumnCount) + 0.5,
229
- maxX: visibleColumnXs.get(columnCount - 1) + visibleColumnWidths.get(columnCount - 1)
230
- }, true);
231
- } // Draw the cell content...
167
+ drawGrid(context, state) {
168
+ var {
169
+ metrics,
170
+ draggingRow,
171
+ draggingColumn
172
+ } = state;
173
+ var {
174
+ gridX,
175
+ gridY
176
+ } = metrics;
177
+ context.translate(gridX, gridY);
178
+ this.drawGridBackground(context, state, draggingRow == null && draggingColumn == null);
179
+ this.drawCellContents(context, state);
180
+ this.drawFloatingRows(context, state);
181
+ this.drawFloatingColumns(context, state);
182
+ context.translate(-gridX, -gridY);
183
+ }
232
184
 
185
+ drawFloatingRows(context, state) {
186
+ var {
187
+ metrics,
188
+ theme
189
+ } = state;
190
+ var {
191
+ draggingRow,
192
+ draggingColumn,
193
+ floatingTopRowCount,
194
+ floatingBottomRowCount,
195
+ floatingRows,
196
+ rowCount,
197
+ visibleColumns,
198
+ visibleRowYs,
199
+ visibleRowHeights
200
+ } = metrics;
201
+
202
+ if (floatingRows.length === 0) {
203
+ return;
204
+ }
233
205
 
234
- for (var c = 0; c < floatingColumns.length; c += 1) {
235
- var column = floatingColumns[c];
206
+ if (theme.floatingRowBackgroundColors) {
207
+ this.drawRowStripesForRows(context, state, floatingRows, theme.floatingRowBackgroundColors);
208
+ }
236
209
 
237
- for (var r = 0; r < visibleRows.length; r += 1) {
238
- var row = visibleRows[r];
239
- this.drawCellContent(context, state, column, row);
240
- }
241
- }
210
+ if (draggingRow == null && draggingColumn == null) {
211
+ this.drawFloatingMouseRowHover(context, state);
242
212
  }
243
- }, {
244
- key: "drawFloatingBorders",
245
- value: function drawFloatingBorders(context, state) {
246
- var metrics = state.metrics,
247
- theme = state.theme;
248
- var floatingTopRowCount = metrics.floatingTopRowCount,
249
- floatingBottomRowCount = metrics.floatingBottomRowCount,
250
- floatingLeftColumnCount = metrics.floatingLeftColumnCount,
251
- floatingRightColumnCount = metrics.floatingRightColumnCount,
252
- rowCount = metrics.rowCount,
253
- columnCount = metrics.columnCount,
254
- visibleRowYs = metrics.visibleRowYs,
255
- visibleColumnXs = metrics.visibleColumnXs,
256
- visibleRowHeights = metrics.visibleRowHeights,
257
- visibleColumnWidths = metrics.visibleColumnWidths,
258
- maxX = metrics.maxX,
259
- maxY = metrics.maxY;
260
- var floatingDividerOuterColor = theme.floatingDividerOuterColor,
261
- floatingDividerInnerColor = theme.floatingDividerInnerColor;
262
- context.lineWidth = 3;
263
- context.beginPath();
264
- context.strokeStyle = floatingDividerOuterColor;
265
213
 
266
- if (floatingTopRowCount > 0) {
267
- var y = visibleRowYs.get(floatingTopRowCount - 1) + visibleRowHeights.get(floatingTopRowCount - 1) + 0.5;
268
- context.moveTo(0.5, y);
269
- context.lineTo(maxX - 0.5, y);
270
- }
214
+ this.drawGridLinesForItems(context, state, visibleColumns, floatingRows, theme.floatingGridColumnColor, theme.floatingGridRowColor);
215
+ this.drawCellBackgroundsForItems(context, state, visibleColumns, floatingRows);
216
+ this.drawFloatingBorders(context, state); // Draw the floating row selection...
271
217
 
272
- if (floatingBottomRowCount > 0) {
273
- var _y = visibleRowYs.get(rowCount - floatingBottomRowCount) - 0.5;
218
+ if (floatingTopRowCount > 0) {
219
+ this.drawSelectedRanges(context, state, {
220
+ top: 0,
221
+ bottom: floatingTopRowCount - 1,
222
+ maxY: visibleRowYs.get(floatingTopRowCount - 1) + visibleRowHeights.get(floatingTopRowCount - 1) - 0.5
223
+ }, true);
224
+ }
274
225
 
275
- context.moveTo(0.5, _y);
276
- context.lineTo(maxX - 0.5, _y);
277
- }
226
+ if (floatingBottomRowCount > 0) {
227
+ this.drawSelectedRanges(context, state, {
228
+ top: rowCount - floatingBottomRowCount - 1,
229
+ bottom: rowCount - 1,
230
+ minY: visibleRowYs.get(rowCount - floatingBottomRowCount) + 0.5,
231
+ maxY: visibleRowYs.get(rowCount - 1) + visibleRowHeights.get(rowCount - 1) - 0.5
232
+ }, true);
233
+ } // Draw the cell content...
278
234
 
279
- if (floatingLeftColumnCount > 0) {
280
- var x = visibleColumnXs.get(floatingLeftColumnCount - 1) + visibleColumnWidths.get(floatingLeftColumnCount - 1) + 0.5;
281
- context.moveTo(x, 0.5);
282
- context.lineTo(x, maxY - 0.5);
283
- }
284
235
 
285
- if (floatingRightColumnCount > 0) {
286
- var _x = visibleColumnXs.get(columnCount - floatingRightColumnCount) - 0.5;
236
+ for (var c = 0; c < visibleColumns.length; c += 1) {
237
+ var column = visibleColumns[c];
287
238
 
288
- context.moveTo(_x, 0.5);
289
- context.lineTo(_x, maxY - 0.5);
239
+ for (var r = 0; r < floatingRows.length; r += 1) {
240
+ var row = floatingRows[r];
241
+ this.drawCellContent(context, state, column, row);
290
242
  }
243
+ }
244
+ }
291
245
 
292
- context.stroke();
293
- context.beginPath();
294
- context.lineWidth = 1;
295
- context.strokeStyle = floatingDividerInnerColor;
246
+ drawFloatingColumns(context, state) {
247
+ var {
248
+ metrics,
249
+ theme
250
+ } = state;
251
+ var {
252
+ draggingRow,
253
+ draggingColumn,
254
+ floatingLeftColumnCount,
255
+ floatingRightColumnCount,
256
+ floatingLeftWidth,
257
+ floatingRightWidth,
258
+ floatingColumns,
259
+ gridX,
260
+ maxX,
261
+ columnCount,
262
+ visibleRows,
263
+ visibleColumnXs,
264
+ visibleColumnWidths,
265
+ width
266
+ } = metrics;
267
+
268
+ if (floatingColumns.length === 0) {
269
+ return;
270
+ }
296
271
 
297
- if (floatingTopRowCount > 0) {
298
- var _y2 = visibleRowYs.get(floatingTopRowCount - 1) + visibleRowHeights.get(floatingTopRowCount - 1) + 0.5;
272
+ if (theme.floatingRowBackgroundColors) {
273
+ this.drawRowStripesForRows(context, state, visibleRows, theme.floatingRowBackgroundColors, 0, floatingLeftWidth);
274
+ this.drawRowStripesForRows(context, state, visibleRows, theme.floatingRowBackgroundColors, width - gridX - floatingRightWidth, maxX);
275
+ }
299
276
 
300
- context.moveTo(0.5, _y2);
301
- context.lineTo(maxX - 0.5, _y2);
302
- }
277
+ if (draggingRow == null && draggingColumn == null) {
278
+ this.drawFloatingMouseRowHover(context, state);
279
+ }
303
280
 
304
- if (floatingBottomRowCount > 0) {
305
- var _y3 = visibleRowYs.get(rowCount - floatingBottomRowCount) - 0.5;
281
+ this.drawGridLinesForItems(context, state, floatingColumns, visibleRows, theme.floatingGridColumnColor, theme.floatingGridRowColor);
282
+ this.drawCellBackgroundsForItems(context, state, floatingColumns, visibleRows);
283
+ this.drawFloatingBorders(context, state); // Draw the floating column selection...
306
284
 
307
- context.moveTo(0.5, _y3);
308
- context.lineTo(maxX - 0.5, _y3);
309
- }
285
+ if (floatingLeftColumnCount > 0) {
286
+ this.drawSelectedRanges(context, state, {
287
+ left: 0,
288
+ right: floatingLeftColumnCount,
289
+ maxX: visibleColumnXs.get(floatingLeftColumnCount - 1) + visibleColumnWidths.get(floatingLeftColumnCount - 1)
290
+ }, true);
291
+ }
310
292
 
311
- if (floatingLeftColumnCount > 0) {
312
- var _x2 = visibleColumnXs.get(floatingLeftColumnCount - 1) + visibleColumnWidths.get(floatingLeftColumnCount - 1) + 0.5;
293
+ if (floatingRightColumnCount > 0) {
294
+ this.drawSelectedRanges(context, state, {
295
+ left: columnCount - floatingRightColumnCount,
296
+ right: columnCount - 1,
297
+ minX: visibleColumnXs.get(columnCount - floatingRightColumnCount) + 0.5,
298
+ maxX: visibleColumnXs.get(columnCount - 1) + visibleColumnWidths.get(columnCount - 1)
299
+ }, true);
300
+ } // Draw the cell content...
313
301
 
314
- context.moveTo(_x2, 0.5);
315
- context.lineTo(_x2, maxY - 0.5);
316
- }
317
302
 
318
- if (floatingRightColumnCount > 0) {
319
- var _x3 = visibleColumnXs.get(columnCount - floatingRightColumnCount) - 0.5;
303
+ for (var c = 0; c < floatingColumns.length; c += 1) {
304
+ var column = floatingColumns[c];
320
305
 
321
- context.moveTo(_x3, 0.5);
322
- context.lineTo(_x3, maxY - 0.5);
306
+ for (var r = 0; r < visibleRows.length; r += 1) {
307
+ var row = visibleRows[r];
308
+ this.drawCellContent(context, state, column, row);
323
309
  }
310
+ }
311
+ }
324
312
 
325
- context.stroke();
313
+ drawFloatingBorders(context, state) {
314
+ var {
315
+ metrics,
316
+ theme
317
+ } = state;
318
+ var {
319
+ floatingTopRowCount,
320
+ floatingBottomRowCount,
321
+ floatingLeftColumnCount,
322
+ floatingRightColumnCount,
323
+ rowCount,
324
+ columnCount,
325
+ visibleRowYs,
326
+ visibleColumnXs,
327
+ visibleRowHeights,
328
+ visibleColumnWidths,
329
+ maxX,
330
+ maxY
331
+ } = metrics;
332
+ var {
333
+ floatingDividerOuterColor,
334
+ floatingDividerInnerColor
335
+ } = theme;
336
+ context.lineWidth = 3;
337
+ context.beginPath();
338
+ context.strokeStyle = floatingDividerOuterColor;
339
+
340
+ if (floatingTopRowCount > 0) {
341
+ var y = visibleRowYs.get(floatingTopRowCount - 1) + visibleRowHeights.get(floatingTopRowCount - 1) + 0.5;
342
+ context.moveTo(0.5, y);
343
+ context.lineTo(maxX - 0.5, y);
326
344
  }
327
- }, {
328
- key: "drawGridBackground",
329
- value: function drawGridBackground(context, state) {
330
- var drawHover = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
331
- this.drawRowStripes(context, state);
332
345
 
333
- if (drawHover) {
334
- this.drawMouseColumnHover(context, state);
335
- this.drawMouseRowHover(context, state);
336
- }
346
+ if (floatingBottomRowCount > 0) {
347
+ var _y = visibleRowYs.get(rowCount - floatingBottomRowCount) - 0.5;
337
348
 
338
- this.drawGridLines(context, state);
339
- this.drawCellBackgrounds(context, state);
340
- var metrics = state.metrics;
341
- var bottom = metrics.bottom,
342
- right = metrics.right,
343
- floatingBottomRowCount = metrics.floatingBottomRowCount,
344
- floatingLeftColumnCount = metrics.floatingLeftColumnCount,
345
- floatingRightColumnCount = metrics.floatingRightColumnCount,
346
- floatingTopColumnCount = metrics.floatingTopColumnCount,
347
- columnCount = metrics.columnCount,
348
- rowCount = metrics.rowCount,
349
- visibleRowHeights = metrics.visibleRowHeights,
350
- visibleRowYs = metrics.visibleRowYs,
351
- visibleColumnXs = metrics.visibleColumnXs,
352
- visibleColumnWidths = metrics.visibleColumnWidths,
353
- width = metrics.width,
354
- height = metrics.height;
355
- this.drawSelectedRanges(context, state, {
356
- bottom: Math.min(bottom, rowCount - floatingBottomRowCount - 1),
357
- right: Math.min(right, columnCount - floatingRightColumnCount - 1),
358
- minX: floatingLeftColumnCount > 0 && visibleColumnXs.has(floatingLeftColumnCount + 1) ? visibleColumnXs.get(floatingLeftColumnCount + 1) : -10,
359
- minY: floatingTopColumnCount > 0 && visibleRowYs.has(floatingTopColumnCount + 1) ? visibleRowYs.get(floatingTopColumnCount + 1) : -10,
360
- maxX: floatingRightColumnCount > 0 && visibleColumnXs.has(columnCount - floatingRightColumnCount - 1) ? visibleColumnXs.get(columnCount - floatingRightColumnCount - 1) + visibleColumnWidths.get(columnCount - floatingRightColumnCount - 1) - 0.5 : width + 10,
361
- maxY: floatingBottomRowCount > 0 && visibleRowYs.has(rowCount - floatingBottomRowCount - 1) ? visibleRowYs.get(rowCount - floatingBottomRowCount - 1) + visibleRowHeights.get(rowCount - floatingBottomRowCount - 1) - 0.5 : height + 10
362
- });
363
- }
364
- }, {
365
- key: "drawRowStripes",
366
- value: function drawRowStripes(context, state) {
367
- var metrics = state.metrics,
368
- theme = state.theme;
369
- var visibleRows = metrics.visibleRows;
370
- var rowBackgroundColors = theme.rowBackgroundColors;
371
-
372
- if (!rowBackgroundColors) {
373
- return;
374
- }
349
+ context.moveTo(0.5, _y);
350
+ context.lineTo(maxX - 0.5, _y);
351
+ }
375
352
 
376
- this.drawRowStripesForRows(context, state, visibleRows, rowBackgroundColors);
377
- }
378
- }, {
379
- key: "drawRowStripesForRows",
380
- value: function drawRowStripesForRows(context, state, rows, rowBackgroundColors) {
381
- var minX = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 0;
382
- var maxX = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : state.metrics.maxX;
383
- var theme = state.theme,
384
- metrics = state.metrics,
385
- model = state.model;
386
- var maxDepth = theme.maxDepth,
387
- shadowBlur = theme.shadowBlur,
388
- shadowColor = theme.shadowColor;
389
- var colorSets = this.getCachedBackgroundColors(rowBackgroundColors, maxDepth);
390
- var visibleRowYs = metrics.visibleRowYs,
391
- visibleRowHeights = metrics.visibleRowHeights; // Optimize by grouping together all rows that end up with the same color
392
-
393
- var colorRowMap = new Map();
394
- var topShadowRows = []; // Rows that are deeper than the row above them
395
-
396
- var bottomShadowRows = [];
397
-
398
- var addRowToColorMap = function addRowToColorMap(row, rowAbove) {
399
- var depth = model.depthForRow(row);
400
- var colorSet = colorSets[row % colorSets.length];
401
- var color = colorSet[Math.min(depth, colorSet.length - 1)];
402
-
403
- if (!colorRowMap.has(color)) {
404
- colorRowMap.set(color, []);
405
- }
353
+ if (floatingLeftColumnCount > 0) {
354
+ var x = visibleColumnXs.get(floatingLeftColumnCount - 1) + visibleColumnWidths.get(floatingLeftColumnCount - 1) + 0.5;
355
+ context.moveTo(x, 0.5);
356
+ context.lineTo(x, maxY - 0.5);
357
+ }
406
358
 
407
- colorRowMap.get(color).push(row);
359
+ if (floatingRightColumnCount > 0) {
360
+ var _x = visibleColumnXs.get(columnCount - floatingRightColumnCount) - 0.5;
408
361
 
409
- if (rowAbove != null) {
410
- var depthAbove = model.depthForRow(rowAbove);
362
+ context.moveTo(_x, 0.5);
363
+ context.lineTo(_x, maxY - 0.5);
364
+ }
411
365
 
412
- if (depthAbove < depth) {
413
- topShadowRows.push(row);
414
- } else if (depthAbove > depth) {
415
- bottomShadowRows.push(rowAbove);
416
- }
417
- }
418
- }; // Add all the regular row stripes
366
+ context.stroke();
367
+ context.beginPath();
368
+ context.lineWidth = 1;
369
+ context.strokeStyle = floatingDividerInnerColor;
419
370
 
371
+ if (floatingTopRowCount > 0) {
372
+ var _y2 = visibleRowYs.get(floatingTopRowCount - 1) + visibleRowHeights.get(floatingTopRowCount - 1) + 0.5;
420
373
 
421
- for (var i = 0; i < rows.length; i += 1) {
422
- var row = rows[i];
423
- var rowAbove = i > 0 ? rows[i - 1] : null;
424
- addRowToColorMap(row, rowAbove);
425
- }
374
+ context.moveTo(0.5, _y2);
375
+ context.lineTo(maxX - 0.5, _y2);
376
+ }
426
377
 
427
- colorRowMap.forEach(function (colorRows, color) {
428
- context.fillStyle = color;
429
- context.beginPath();
378
+ if (floatingBottomRowCount > 0) {
379
+ var _y3 = visibleRowYs.get(rowCount - floatingBottomRowCount) - 0.5;
430
380
 
431
- for (var _i = 0; _i < colorRows.length; _i += 1) {
432
- var _row = colorRows[_i];
433
- var y = visibleRowYs.get(_row);
434
- var rowHeight = visibleRowHeights.get(_row);
435
- context.rect(minX, y, maxX, rowHeight);
436
- }
381
+ context.moveTo(0.5, _y3);
382
+ context.lineTo(maxX - 0.5, _y3);
383
+ }
437
384
 
438
- context.fill();
439
- });
440
-
441
- if (topShadowRows.length > 0) {
442
- context.save();
443
- var startColor = this.getCachedColorWithAlpha(shadowColor, 0.15);
444
- var endColor = this.getCachedColorWithAlpha(shadowColor, 0);
445
- var gradient = context.createLinearGradient(0, 0, 0, shadowBlur);
446
- gradient.addColorStop(0, startColor);
447
- gradient.addColorStop(1, endColor);
448
- context.fillStyle = gradient;
449
-
450
- for (var _i2 = 0; _i2 < topShadowRows.length; _i2 += 1) {
451
- var _row2 = topShadowRows[_i2];
452
- var y = visibleRowYs.get(_row2); // Use a translate so we can reuse the gradient
453
-
454
- context.translate(0, y);
455
- context.fillRect(minX, 0, maxX, shadowBlur);
456
- context.translate(0, -y);
457
- }
385
+ if (floatingLeftColumnCount > 0) {
386
+ var _x2 = visibleColumnXs.get(floatingLeftColumnCount - 1) + visibleColumnWidths.get(floatingLeftColumnCount - 1) + 0.5;
458
387
 
459
- context.restore();
460
- }
388
+ context.moveTo(_x2, 0.5);
389
+ context.lineTo(_x2, maxY - 0.5);
390
+ }
461
391
 
462
- if (bottomShadowRows.length > 0) {
463
- context.save();
392
+ if (floatingRightColumnCount > 0) {
393
+ var _x3 = visibleColumnXs.get(columnCount - floatingRightColumnCount) - 0.5;
464
394
 
465
- var _startColor = this.getCachedColorWithAlpha(shadowColor, 0);
395
+ context.moveTo(_x3, 0.5);
396
+ context.lineTo(_x3, maxY - 0.5);
397
+ }
466
398
 
467
- var _endColor = this.getCachedColorWithAlpha(shadowColor, 0.15);
399
+ context.stroke();
400
+ }
468
401
 
469
- var _gradient = context.createLinearGradient(0, 0, 0, shadowBlur);
402
+ drawGridBackground(context, state) {
403
+ var drawHover = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
404
+ this.drawRowStripes(context, state);
470
405
 
471
- _gradient.addColorStop(0, _startColor);
406
+ if (drawHover) {
407
+ this.drawMouseColumnHover(context, state);
408
+ this.drawMouseRowHover(context, state);
409
+ }
472
410
 
473
- _gradient.addColorStop(1, _endColor);
411
+ this.drawGridLines(context, state);
412
+ this.drawCellBackgrounds(context, state);
413
+ var {
414
+ metrics
415
+ } = state;
416
+ var {
417
+ bottom,
418
+ right,
419
+ floatingBottomRowCount,
420
+ floatingLeftColumnCount,
421
+ floatingRightColumnCount,
422
+ floatingTopColumnCount,
423
+ columnCount,
424
+ rowCount,
425
+ visibleRowHeights,
426
+ visibleRowYs,
427
+ visibleColumnXs,
428
+ visibleColumnWidths,
429
+ width,
430
+ height
431
+ } = metrics;
432
+ this.drawSelectedRanges(context, state, {
433
+ bottom: Math.min(bottom, rowCount - floatingBottomRowCount - 1),
434
+ right: Math.min(right, columnCount - floatingRightColumnCount - 1),
435
+ minX: floatingLeftColumnCount > 0 && visibleColumnXs.has(floatingLeftColumnCount + 1) ? visibleColumnXs.get(floatingLeftColumnCount + 1) : -10,
436
+ minY: floatingTopColumnCount > 0 && visibleRowYs.has(floatingTopColumnCount + 1) ? visibleRowYs.get(floatingTopColumnCount + 1) : -10,
437
+ maxX: floatingRightColumnCount > 0 && visibleColumnXs.has(columnCount - floatingRightColumnCount - 1) ? visibleColumnXs.get(columnCount - floatingRightColumnCount - 1) + visibleColumnWidths.get(columnCount - floatingRightColumnCount - 1) - 0.5 : width + 10,
438
+ maxY: floatingBottomRowCount > 0 && visibleRowYs.has(rowCount - floatingBottomRowCount - 1) ? visibleRowYs.get(rowCount - floatingBottomRowCount - 1) + visibleRowHeights.get(rowCount - floatingBottomRowCount - 1) - 0.5 : height + 10
439
+ });
440
+ }
441
+
442
+ drawRowStripes(context, state) {
443
+ var {
444
+ metrics,
445
+ theme
446
+ } = state;
447
+ var {
448
+ visibleRows
449
+ } = metrics;
450
+ var {
451
+ rowBackgroundColors
452
+ } = theme;
453
+
454
+ if (!rowBackgroundColors) {
455
+ return;
456
+ }
457
+
458
+ this.drawRowStripesForRows(context, state, visibleRows, rowBackgroundColors);
459
+ }
474
460
 
475
- context.fillStyle = _gradient;
461
+ drawRowStripesForRows(context, state, rows, rowBackgroundColors) {
462
+ var minX = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 0;
463
+ var maxX = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : state.metrics.maxX;
464
+ var {
465
+ theme,
466
+ metrics,
467
+ model
468
+ } = state;
469
+ var {
470
+ maxDepth,
471
+ shadowBlur,
472
+ shadowColor
473
+ } = theme;
474
+ var colorSets = this.getCachedBackgroundColors(rowBackgroundColors, maxDepth);
475
+ var {
476
+ visibleRowYs,
477
+ visibleRowHeights
478
+ } = metrics; // Optimize by grouping together all rows that end up with the same color
479
+
480
+ var colorRowMap = new Map();
481
+ var topShadowRows = []; // Rows that are deeper than the row above them
482
+
483
+ var bottomShadowRows = [];
484
+
485
+ var addRowToColorMap = (row, rowAbove) => {
486
+ var depth = model.depthForRow(row);
487
+ var colorSet = colorSets[row % colorSets.length];
488
+ var color = colorSet[Math.min(depth, colorSet.length - 1)];
476
489
 
477
- for (var _i3 = 0; _i3 < bottomShadowRows.length; _i3 += 1) {
478
- var _row3 = bottomShadowRows[_i3];
490
+ if (!colorRowMap.has(color)) {
491
+ colorRowMap.set(color, []);
492
+ }
479
493
 
480
- var _y4 = visibleRowYs.get(_row3);
494
+ colorRowMap.get(color).push(row);
481
495
 
482
- var rowHeight = visibleRowHeights.get(_row3);
483
- var gradientY = _y4 + rowHeight - shadowBlur; // Use a translate so we can reuse the gradient
496
+ if (rowAbove != null) {
497
+ var depthAbove = model.depthForRow(rowAbove);
484
498
 
485
- context.translate(0, gradientY);
486
- context.fillRect(minX, 0, maxX, shadowBlur);
487
- context.translate(0, -gradientY);
499
+ if (depthAbove < depth) {
500
+ topShadowRows.push(row);
501
+ } else if (depthAbove > depth) {
502
+ bottomShadowRows.push(rowAbove);
488
503
  }
489
-
490
- context.restore();
491
504
  }
505
+ }; // Add all the regular row stripes
506
+
507
+
508
+ for (var i = 0; i < rows.length; i += 1) {
509
+ var row = rows[i];
510
+ var rowAbove = i > 0 ? rows[i - 1] : null;
511
+ addRowToColorMap(row, rowAbove);
492
512
  }
493
- }, {
494
- key: "drawMouseColumnHover",
495
- value: function drawMouseColumnHover(context, state) {
496
- var mouseX = state.mouseX,
497
- mouseY = state.mouseY,
498
- theme = state.theme,
499
- metrics = state.metrics;
500
- var mouseColumn = GridUtils.getColumnAtX(mouseX, metrics);
501
-
502
- if (mouseColumn == null || !theme.columnHoverBackgroundColor) {
503
- return;
504
- }
505
513
 
506
- var visibleColumnWidths = metrics.visibleColumnWidths,
507
- visibleColumnXs = metrics.visibleColumnXs,
508
- maxY = metrics.maxY;
514
+ colorRowMap.forEach((colorRows, color) => {
515
+ context.fillStyle = color;
516
+ context.beginPath();
509
517
 
510
- if (mouseY > maxY) {
511
- return;
518
+ for (var _i = 0; _i < colorRows.length; _i += 1) {
519
+ var _row = colorRows[_i];
520
+ var y = visibleRowYs.get(_row);
521
+ var rowHeight = visibleRowHeights.get(_row);
522
+ context.rect(minX, y, maxX, rowHeight);
512
523
  }
513
524
 
514
- var x = visibleColumnXs.get(mouseColumn);
515
- var columnWidth = visibleColumnWidths.get(mouseColumn);
516
- context.fillStyle = theme.columnHoverBackgroundColor;
517
- context.fillRect(x, 0, columnWidth, maxY);
518
- }
519
- }, {
520
- key: "drawMouseRowHover",
521
- value: function drawMouseRowHover(context, state) {
522
- var mouseX = state.mouseX,
523
- mouseY = state.mouseY,
524
- theme = state.theme,
525
- metrics = state.metrics;
526
- var maxX = metrics.maxX;
527
-
528
- if (mouseX > maxX || !theme.rowHoverBackgroundColor) {
529
- return;
530
- }
525
+ context.fill();
526
+ });
531
527
 
532
- var mouseRow = GridUtils.getRowAtY(mouseY, metrics);
528
+ if (topShadowRows.length > 0) {
529
+ context.save();
530
+ var startColor = this.getCachedColorWithAlpha(shadowColor, 0.15);
531
+ var endColor = this.getCachedColorWithAlpha(shadowColor, 0);
532
+ var gradient = context.createLinearGradient(0, 0, 0, shadowBlur);
533
+ gradient.addColorStop(0, startColor);
534
+ gradient.addColorStop(1, endColor);
535
+ context.fillStyle = gradient;
536
+
537
+ for (var _i2 = 0; _i2 < topShadowRows.length; _i2 += 1) {
538
+ var _row2 = topShadowRows[_i2];
539
+ var y = visibleRowYs.get(_row2); // Use a translate so we can reuse the gradient
533
540
 
534
- if (mouseRow == null) {
535
- return;
541
+ context.translate(0, y);
542
+ context.fillRect(minX, 0, maxX, shadowBlur);
543
+ context.translate(0, -y);
536
544
  }
537
545
 
538
- this.drawMouseRowHoverForRow(context, state, mouseRow);
546
+ context.restore();
539
547
  }
540
- }, {
541
- key: "drawFloatingMouseRowHover",
542
- value: function drawFloatingMouseRowHover(context, state) {
543
- var mouseX = state.mouseX,
544
- mouseY = state.mouseY,
545
- theme = state.theme,
546
- metrics = state.metrics;
547
- var maxX = metrics.maxX,
548
- floatingTopRowCount = metrics.floatingTopRowCount,
549
- floatingBottomRowCount = metrics.floatingBottomRowCount,
550
- rowCount = metrics.rowCount,
551
- rowFooterWidth = metrics.rowFooterWidth;
552
-
553
- if (mouseX > maxX + rowFooterWidth || !theme.rowHoverBackgroundColor) {
554
- return;
555
- }
556
548
 
557
- var mouseRow = GridUtils.getRowAtY(mouseY, metrics);
549
+ if (bottomShadowRows.length > 0) {
550
+ context.save();
558
551
 
559
- if (mouseRow != null && (mouseRow < floatingTopRowCount || rowCount - floatingBottomRowCount <= mouseRow)) {
560
- this.drawMouseRowHoverForRow(context, state, mouseRow);
561
- }
562
- }
563
- }, {
564
- key: "drawMouseRowHoverForRow",
565
- value: function drawMouseRowHoverForRow(context, state, row) {
566
- var metrics = state.metrics,
567
- selectedRanges = state.selectedRanges,
568
- theme = state.theme;
569
- var visibleRowHeights = metrics.visibleRowHeights,
570
- visibleRowYs = metrics.visibleRowYs,
571
- maxX = metrics.maxX;
572
- var y = visibleRowYs.get(row);
573
- var rowHeight = visibleRowHeights.get(row);
574
- context.fillStyle = theme.rowHoverBackgroundColor;
552
+ var _startColor = this.getCachedColorWithAlpha(shadowColor, 0);
575
553
 
576
- for (var i = 0; i < selectedRanges.length; i += 1) {
577
- if (selectedRanges[i].startRow <= row && selectedRanges[i].endRow >= row) {
578
- context.fillStyle = theme.selectedRowHoverBackgroundColor;
579
- break;
580
- }
581
- }
554
+ var _endColor = this.getCachedColorWithAlpha(shadowColor, 0.15);
582
555
 
583
- context.fillRect(0, y, maxX, rowHeight);
584
- }
585
- }, {
586
- key: "drawGridLines",
587
- value: function drawGridLines(context, state) {
588
- var metrics = state.metrics,
589
- theme = state.theme;
590
- var visibleColumns = metrics.visibleColumns,
591
- visibleRows = metrics.visibleRows;
592
- this.drawGridLinesForItems(context, state, visibleColumns, visibleRows, theme.gridColumnColor, theme.gridRowColor);
593
- }
594
- }, {
595
- key: "drawGridLinesForItems",
596
- value: function drawGridLinesForItems(context, state, columns, rows, columnColor, rowColor) {
597
- if (!columnColor && !rowColor) {
598
- return;
599
- }
556
+ var _gradient = context.createLinearGradient(0, 0, 0, shadowBlur);
600
557
 
601
- context.lineWidth = 1;
602
- context.beginPath();
558
+ _gradient.addColorStop(0, _startColor);
603
559
 
604
- if (columnColor) {
605
- context.strokeStyle = columnColor;
606
- this.drawGridLinesForColumns(context, state, columns);
607
- }
560
+ _gradient.addColorStop(1, _endColor);
608
561
 
609
- if (rowColor) {
610
- context.strokeStyle = rowColor;
611
- this.drawGridLinesForRows(context, state, rows);
612
- }
562
+ context.fillStyle = _gradient;
613
563
 
614
- context.stroke();
615
- }
616
- }, {
617
- key: "drawGridLinesForColumns",
618
- value: function drawGridLinesForColumns(context, state, columns) {
619
- var metrics = state.metrics;
620
- var visibleColumnXs = metrics.visibleColumnXs,
621
- maxY = metrics.maxY;
622
-
623
- for (var i = 0; i < columns.length; i += 1) {
624
- var column = columns[i];
625
- var x = visibleColumnXs.get(column) + 0.5;
626
- context.moveTo(x, 0);
627
- context.lineTo(x, maxY);
628
- }
629
- }
630
- }, {
631
- key: "drawGridLinesForRows",
632
- value: function drawGridLinesForRows(context, state, rows) {
633
- var metrics = state.metrics;
634
- var visibleRowYs = metrics.visibleRowYs,
635
- maxX = metrics.maxX; // Draw row lines
636
-
637
- for (var i = 0; i < rows.length; i += 1) {
638
- var row = rows[i];
639
- var y = visibleRowYs.get(row) + 0.5;
640
- context.moveTo(0.5, y);
641
- context.lineTo(maxX - 0.5, y);
642
- }
643
- }
644
- }, {
645
- key: "drawCellBackgrounds",
646
- value: function drawCellBackgrounds(context, state) {
647
- var metrics = state.metrics;
648
- var visibleColumns = metrics.visibleColumns,
649
- visibleRows = metrics.visibleRows;
650
- this.drawCellBackgroundsForItems(context, state, visibleColumns, visibleRows);
651
- }
652
- }, {
653
- key: "drawCellBackgroundsForItems",
654
- value: function drawCellBackgroundsForItems(context, state, columns, rows) {
655
- context.save();
564
+ for (var _i3 = 0; _i3 < bottomShadowRows.length; _i3 += 1) {
565
+ var _row3 = bottomShadowRows[_i3];
656
566
 
657
- for (var i = 0; i < columns.length; i += 1) {
658
- var column = columns[i];
567
+ var _y4 = visibleRowYs.get(_row3);
659
568
 
660
- for (var j = 0; j < rows.length; j += 1) {
661
- var row = rows[j];
662
- var rowAfter = j + 1 < rows.length ? rows[j + 1] : null;
663
- this.drawCellBackground(context, state, column, row, rowAfter);
664
- }
569
+ var rowHeight = visibleRowHeights.get(_row3);
570
+ var gradientY = _y4 + rowHeight - shadowBlur; // Use a translate so we can reuse the gradient
571
+
572
+ context.translate(0, gradientY);
573
+ context.fillRect(minX, 0, maxX, shadowBlur);
574
+ context.translate(0, -gradientY);
665
575
  }
666
576
 
667
577
  context.restore();
668
578
  }
669
- }, {
670
- key: "drawCellBackground",
671
- value: function drawCellBackground(context, state, column, row, rowAfter) {
672
- var metrics = state.metrics,
673
- model = state.model,
674
- hasExpandableRows = state.model.hasExpandableRows,
675
- theme = state.theme;
676
- var firstColumn = metrics.firstColumn,
677
- modelColumns = metrics.modelColumns,
678
- modelRows = metrics.modelRows,
679
- visibleColumnXs = metrics.visibleColumnXs,
680
- visibleColumnWidths = metrics.visibleColumnWidths,
681
- visibleRowYs = metrics.visibleRowYs,
682
- visibleRowHeights = metrics.visibleRowHeights;
683
- var modelRow = modelRows.get(row);
684
- var modelColumn = modelColumns.get(column);
685
- var backgroundColor = model.backgroundColorForCell(modelColumn, modelRow, theme);
686
- var isFirstColumn = column === firstColumn;
687
-
688
- if (backgroundColor) {
689
- var x = visibleColumnXs.get(column) + 1;
690
- var y = visibleRowYs.get(row) + 1;
691
- var columnWidth = visibleColumnWidths.get(column) - 1;
692
- var rowHeight = visibleRowHeights.get(row) - 1;
693
- context.fillStyle = backgroundColor;
694
- context.fillRect(x, y, columnWidth, rowHeight);
695
- }
579
+ }
696
580
 
697
- if (isFirstColumn && hasExpandableRows) {
698
- this.drawCellRowTreeDepthLines(context, state, row, rowAfter);
699
- }
581
+ drawMouseColumnHover(context, state) {
582
+ var {
583
+ mouseX,
584
+ mouseY,
585
+ theme,
586
+ metrics
587
+ } = state;
588
+ var mouseColumn = GridUtils.getColumnAtX(mouseX, metrics);
589
+
590
+ if (mouseColumn == null || !theme.columnHoverBackgroundColor) {
591
+ return;
700
592
  }
701
- }, {
702
- key: "drawCellContents",
703
- value: function drawCellContents(context, state) {
704
- var metrics = state.metrics;
705
- var visibleColumns = metrics.visibleColumns;
706
593
 
707
- for (var i = 0; i < visibleColumns.length; i += 1) {
708
- var column = visibleColumns[i];
709
- this.drawColumnCellContents(context, state, column);
710
- }
594
+ var {
595
+ visibleColumnWidths,
596
+ visibleColumnXs,
597
+ maxY
598
+ } = metrics;
599
+
600
+ if (mouseY > maxY) {
601
+ return;
711
602
  }
712
- }, {
713
- key: "drawColumnCellContents",
714
- value: function drawColumnCellContents(context, state, column) {
715
- var metrics = state.metrics;
716
- var visibleColumnXs = metrics.visibleColumnXs,
717
- visibleColumnWidths = metrics.visibleColumnWidths,
718
- visibleRows = metrics.visibleRows,
719
- height = metrics.height;
720
- var x = visibleColumnXs.get(column);
721
- var columnWidth = visibleColumnWidths.get(column);
722
- context.save();
723
- context.beginPath();
724
- context.rect(x, 0, columnWidth, height);
725
- context.clip();
726
603
 
727
- for (var i = 0; i < visibleRows.length; i += 1) {
728
- var row = visibleRows[i];
729
- this.drawCellContent(context, state, column, row);
730
- }
604
+ var x = visibleColumnXs.get(mouseColumn);
605
+ var columnWidth = visibleColumnWidths.get(mouseColumn);
606
+ context.fillStyle = theme.columnHoverBackgroundColor;
607
+ context.fillRect(x, 0, columnWidth, maxY);
608
+ }
731
609
 
732
- context.restore();
610
+ drawMouseRowHover(context, state) {
611
+ var {
612
+ mouseX,
613
+ mouseY,
614
+ theme,
615
+ metrics
616
+ } = state;
617
+ var {
618
+ maxX
619
+ } = metrics;
620
+
621
+ if (mouseX > maxX || !theme.rowHoverBackgroundColor) {
622
+ return;
733
623
  }
734
- }, {
735
- key: "drawCellContent",
736
- value: function drawCellContent(context, state, column, row) {
737
- var metrics = state.metrics,
738
- model = state.model,
739
- hasExpandableRows = state.model.hasExpandableRows,
740
- theme = state.theme;
741
- var firstColumn = metrics.firstColumn,
742
- fontWidths = metrics.fontWidths,
743
- modelColumns = metrics.modelColumns,
744
- modelRows = metrics.modelRows,
745
- visibleColumnXs = metrics.visibleColumnXs,
746
- visibleColumnWidths = metrics.visibleColumnWidths,
747
- visibleRowYs = metrics.visibleRowYs,
748
- visibleRowHeights = metrics.visibleRowHeights;
749
- var cellHorizontalPadding = theme.cellHorizontalPadding,
750
- treeDepthIndent = theme.treeDepthIndent,
751
- treeHorizontalPadding = theme.treeHorizontalPadding,
752
- textColor = theme.textColor;
753
- var x = visibleColumnXs.get(column);
754
- var y = visibleRowYs.get(row);
755
- var columnWidth = visibleColumnWidths.get(column);
756
- var rowHeight = visibleRowHeights.get(row);
757
- var modelRow = modelRows.get(row);
758
- var modelColumn = modelColumns.get(column);
759
- var text = model.textForCell(modelColumn, modelRow);
760
- var isFirstColumn = column === firstColumn;
761
-
762
- if (text && rowHeight > 0) {
763
- var textAlign = model.textAlignForCell(modelColumn, modelRow) || 'left';
764
- context.textAlign = textAlign;
765
- var color = model.colorForCell(modelColumn, modelRow, theme) || textColor;
766
- context.fillStyle = color;
767
- var treeIndent = 0;
768
-
769
- if (hasExpandableRows && isFirstColumn) {
770
- treeIndent = treeDepthIndent * (model.depthForRow(row) + 1) + treeHorizontalPadding;
771
- }
772
624
 
773
- var textWidth = columnWidth - treeIndent;
774
- var textX = x + cellHorizontalPadding;
775
- var textY = y + rowHeight * 0.5;
625
+ var mouseRow = GridUtils.getRowAtY(mouseY, metrics);
776
626
 
777
- if (textAlign === 'right') {
778
- textX = x + textWidth - cellHorizontalPadding;
779
- } else if (textAlign === 'center') {
780
- textX = x + textWidth * 0.5;
781
- } else {
782
- textX = x + cellHorizontalPadding;
783
- }
627
+ if (mouseRow == null) {
628
+ return;
629
+ }
784
630
 
785
- textX += treeIndent;
786
- var fontWidth = fontWidths.get(context.font);
787
- var truncatedText = this.getCachedTruncatedString(context, text, textWidth - cellHorizontalPadding * 2, fontWidth);
631
+ this.drawMouseRowHoverForRow(context, state, mouseRow);
632
+ }
788
633
 
789
- if (truncatedText != null) {
790
- context.fillText(truncatedText, textX, textY);
791
- }
792
- }
634
+ drawFloatingMouseRowHover(context, state) {
635
+ var {
636
+ mouseX,
637
+ mouseY,
638
+ theme,
639
+ metrics
640
+ } = state;
641
+ var {
642
+ maxX,
643
+ floatingTopRowCount,
644
+ floatingBottomRowCount,
645
+ rowCount,
646
+ rowFooterWidth
647
+ } = metrics;
648
+
649
+ if (mouseX > maxX + rowFooterWidth || !theme.rowHoverBackgroundColor) {
650
+ return;
651
+ }
793
652
 
794
- if (isFirstColumn && hasExpandableRows) {
795
- this.drawCellRowTreeMarker(context, state, row);
796
- }
653
+ var mouseRow = GridUtils.getRowAtY(mouseY, metrics);
654
+
655
+ if (mouseRow != null && (mouseRow < floatingTopRowCount || rowCount - floatingBottomRowCount <= mouseRow)) {
656
+ this.drawMouseRowHoverForRow(context, state, mouseRow);
797
657
  }
798
- }, {
799
- key: "drawCellRowTreeMarker",
800
- value: function drawCellRowTreeMarker(context, state, row) {
801
- var metrics = state.metrics,
802
- model = state.model,
803
- mouseX = state.mouseX,
804
- mouseY = state.mouseY,
805
- theme = state.theme;
806
- var firstColumn = metrics.firstColumn,
807
- gridX = metrics.gridX,
808
- gridY = metrics.gridY,
809
- visibleColumnXs = metrics.visibleColumnXs,
810
- visibleColumnWidths = metrics.visibleColumnWidths,
811
- visibleRowYs = metrics.visibleRowYs,
812
- visibleRowHeights = metrics.visibleRowHeights,
813
- visibleRowTreeBoxes = metrics.visibleRowTreeBoxes;
814
- var treeMarkerColor = theme.treeMarkerColor,
815
- treeMarkerHoverColor = theme.treeMarkerHoverColor;
816
- var columnX = visibleColumnXs.get(firstColumn);
817
- var columnWidth = visibleColumnWidths.get(firstColumn);
818
- var rowY = visibleRowYs.get(row);
819
- var rowHeight = visibleRowHeights.get(row);
820
- var isExpandable = model.isRowExpandable(row);
821
- var isExpanded = model.isRowExpanded(row);
822
-
823
- if (isExpandable) {
824
- var treeBox = visibleRowTreeBoxes.get(row);
825
- var color = mouseX >= gridX + columnX && mouseX <= gridX + columnX + columnWidth && mouseY >= gridY + rowY && mouseY <= gridY + rowY + rowHeight ? treeMarkerHoverColor : treeMarkerColor;
826
- this.drawTreeMarker(context, state, columnX, rowY, treeBox, color, isExpanded);
658
+ }
659
+
660
+ drawMouseRowHoverForRow(context, state, row) {
661
+ var {
662
+ metrics,
663
+ selectedRanges,
664
+ theme
665
+ } = state;
666
+ var {
667
+ visibleRowHeights,
668
+ visibleRowYs,
669
+ maxX
670
+ } = metrics;
671
+ var y = visibleRowYs.get(row);
672
+ var rowHeight = visibleRowHeights.get(row);
673
+ context.fillStyle = theme.rowHoverBackgroundColor;
674
+
675
+ for (var i = 0; i < selectedRanges.length; i += 1) {
676
+ if (selectedRanges[i].startRow <= row && selectedRanges[i].endRow >= row) {
677
+ context.fillStyle = theme.selectedRowHoverBackgroundColor;
678
+ break;
827
679
  }
828
680
  }
829
- }, {
830
- key: "drawTreeMarker",
831
- value: function drawTreeMarker(context, state, columnX, rowY, treeBox, color, isExpanded) {
832
- var _treeBox = _slicedToArray(treeBox, 4),
833
- x1 = _treeBox[0],
834
- y1 = _treeBox[1],
835
- x2 = _treeBox[2],
836
- y2 = _treeBox[3];
837
-
838
- var markerText = isExpanded ? '⊟' : '⊞';
839
- var textX = columnX + (x1 + x2) * 0.5 + 0.5;
840
- var textY = rowY + (y1 + y2) * 0.5 + 0.5;
841
- context.fillStyle = color;
842
- context.textAlign = 'center';
843
- context.fillText(markerText, textX, textY);
844
- }
845
- }, {
846
- key: "drawCellRowTreeDepthLines",
847
- value: function drawCellRowTreeDepthLines(context, state, row, rowAfter) {
848
- var metrics = state.metrics,
849
- model = state.model,
850
- theme = state.theme;
851
- var depth = model.depthForRow(row);
852
- if (depth === 0) return;
853
- var firstColumn = metrics.firstColumn,
854
- visibleColumnXs = metrics.visibleColumnXs,
855
- visibleRowYs = metrics.visibleRowYs,
856
- visibleRowHeights = metrics.visibleRowHeights;
857
- var treeDepthIndent = theme.treeDepthIndent,
858
- treeHorizontalPadding = theme.treeHorizontalPadding,
859
- treeLineColor = theme.treeLineColor;
860
- var columnX = visibleColumnXs.get(firstColumn);
861
- var rowY = visibleRowYs.get(row);
862
- var rowHeight = visibleRowHeights.get(row);
863
- var depthRowAfter = model.depthForRow(rowAfter);
864
- var depthDiff = depth > depthRowAfter ? depth - depthRowAfter : 0;
865
- context.strokeStyle = treeLineColor;
866
- context.lineWidth = 1; // draw normal depth lines
867
-
868
- if (depth - depthDiff > 0) {
869
- context.beginPath();
870
681
 
871
- for (var i = 0; i < depth - depthDiff; i += 1) {
872
- var lineX = columnX + i * treeDepthIndent + treeDepthIndent * 0.5 + treeHorizontalPadding + 0.5;
873
- context.moveTo(lineX, rowY);
874
- context.lineTo(lineX, rowY + rowHeight);
875
- }
682
+ context.fillRect(0, y, maxX, rowHeight);
683
+ }
876
684
 
877
- context.stroke();
878
- } // draw as hockey stick if last row at depth
685
+ drawGridLines(context, state) {
686
+ var {
687
+ metrics,
688
+ theme
689
+ } = state;
690
+ var {
691
+ visibleColumns,
692
+ visibleRows
693
+ } = metrics;
694
+ this.drawGridLinesForItems(context, state, visibleColumns, visibleRows, theme.gridColumnColor, theme.gridRowColor);
695
+ }
879
696
 
697
+ drawGridLinesForItems(context, state, columns, rows, columnColor, rowColor) {
698
+ if (!columnColor && !rowColor) {
699
+ return;
700
+ }
880
701
 
881
- if (depthDiff > 0) {
882
- context.beginPath();
702
+ context.lineWidth = 1;
703
+ context.beginPath();
883
704
 
884
- for (var _i4 = depth - depthDiff; _i4 < depth; _i4 += 1) {
885
- var _lineX = columnX + _i4 * treeDepthIndent + treeDepthIndent * 0.5 + treeHorizontalPadding + 0.5;
705
+ if (columnColor) {
706
+ context.strokeStyle = columnColor;
707
+ this.drawGridLinesForColumns(context, state, columns);
708
+ }
886
709
 
887
- context.moveTo(_lineX, rowY);
888
- context.lineTo(_lineX, rowY + Math.ceil(rowHeight / 2)); // extra moveTo prevents halfpixel in corner
710
+ if (rowColor) {
711
+ context.strokeStyle = rowColor;
712
+ this.drawGridLinesForRows(context, state, rows);
713
+ }
889
714
 
890
- context.moveTo(_lineX - 0.5, rowY + Math.ceil(rowHeight / 2) + 0.5);
891
- context.lineTo(_lineX + treeDepthIndent - 0.5, rowY + Math.ceil(rowHeight / 2) + 0.5);
892
- }
715
+ context.stroke();
716
+ }
893
717
 
894
- context.stroke();
895
- }
718
+ drawGridLinesForColumns(context, state, columns) {
719
+ var {
720
+ metrics
721
+ } = state;
722
+ var {
723
+ visibleColumnXs,
724
+ maxY
725
+ } = metrics;
726
+
727
+ for (var i = 0; i < columns.length; i += 1) {
728
+ var column = columns[i];
729
+ var x = visibleColumnXs.get(column) + 0.5;
730
+ context.moveTo(x, 0);
731
+ context.lineTo(x, maxY);
896
732
  }
897
- }, {
898
- key: "drawHeaders",
899
- value: function drawHeaders(context, state) {
900
- var theme = state.theme;
901
- context.font = theme.headerFont;
902
- this.drawColumnHeaders(context, state);
903
- this.drawRowHeaders(context, state);
904
- }
905
- }, {
906
- key: "drawFooters",
907
- value: function drawFooters(context, state) {
908
- var theme = state.theme;
909
- context.font = theme.headerFont;
910
- this.drawRowFooters(context, state);
911
- }
912
- }, {
913
- key: "drawColumnHeaders",
914
- value: function drawColumnHeaders(context, state) {
915
- var mouseX = state.mouseX,
916
- mouseY = state.mouseY,
917
- theme = state.theme,
918
- metrics = state.metrics,
919
- draggingColumnSeparator = state.draggingColumnSeparator,
920
- isDragging = state.isDragging;
921
- var columnHeaderHeight = metrics.columnHeaderHeight,
922
- gridX = metrics.gridX,
923
- width = metrics.width,
924
- visibleColumns = metrics.visibleColumns,
925
- visibleColumnWidths = metrics.visibleColumnWidths,
926
- visibleColumnXs = metrics.visibleColumnXs;
927
-
928
- if (columnHeaderHeight <= 0) {
929
- return;
930
- }
733
+ }
931
734
 
932
- var headerBackgroundColor = theme.headerBackgroundColor,
933
- headerColor = theme.headerColor,
934
- headerHiddenSeparatorSize = theme.headerHiddenSeparatorSize,
935
- headerHiddenSeparatorHoverColor = theme.headerHiddenSeparatorHoverColor,
936
- headerSeparatorColor = theme.headerSeparatorColor,
937
- headerSeparatorHoverColor = theme.headerSeparatorHoverColor;
938
- var hiddenSeparatorHeight = columnHeaderHeight * 0.5;
939
- var hiddenY = columnHeaderHeight * 0.5 - hiddenSeparatorHeight * 0.5;
940
- context.save();
941
- context.beginPath(); // Fill in the background
735
+ drawGridLinesForRows(context, state, rows) {
736
+ var {
737
+ metrics
738
+ } = state;
739
+ var {
740
+ visibleRowYs,
741
+ maxX
742
+ } = metrics; // Draw row lines
743
+
744
+ for (var i = 0; i < rows.length; i += 1) {
745
+ var row = rows[i];
746
+ var y = visibleRowYs.get(row) + 0.5;
747
+ context.moveTo(0.5, y);
748
+ context.lineTo(maxX - 0.5, y);
749
+ }
750
+ }
942
751
 
943
- context.fillStyle = headerBackgroundColor;
944
- context.fillRect(0, 0, width, columnHeaderHeight); // Draw the separators
752
+ drawCellBackgrounds(context, state) {
753
+ var {
754
+ metrics
755
+ } = state;
756
+ var {
757
+ visibleColumns,
758
+ visibleRows
759
+ } = metrics;
760
+ this.drawCellBackgroundsForItems(context, state, visibleColumns, visibleRows);
761
+ }
945
762
 
946
- if (headerSeparatorColor) {
947
- context.strokeStyle = headerSeparatorColor;
948
- context.beginPath();
949
- var hiddenColumns = [];
950
- var isPreviousColumnHidden = false;
951
-
952
- for (var i = 0; i < visibleColumns.length; i += 1) {
953
- var column = visibleColumns[i];
954
- var columnX = visibleColumnXs.get(column);
955
- var columnWidth = visibleColumnWidths.get(column);
956
-
957
- if (columnWidth > 0) {
958
- var x = gridX + columnX + columnWidth + 0.5;
959
- context.moveTo(x, 0);
960
- context.lineTo(x, columnHeaderHeight - 0.5);
961
- isPreviousColumnHidden = false;
962
- } else if (!isPreviousColumnHidden) {
963
- isPreviousColumnHidden = true;
964
- hiddenColumns.push(column);
965
- }
966
- } // Bottom Border, should be interior to the header height
967
-
968
-
969
- context.moveTo(0, columnHeaderHeight - 0.5);
970
- context.lineTo(width, columnHeaderHeight - 0.5);
971
- context.stroke(); // Now draw the hidden column separator boxes
763
+ drawCellBackgroundsForItems(context, state, columns, rows) {
764
+ context.save();
972
765
 
973
- context.beginPath();
974
- context.fillStyle = headerSeparatorColor;
766
+ for (var i = 0; i < columns.length; i += 1) {
767
+ var column = columns[i];
768
+
769
+ for (var j = 0; j < rows.length; j += 1) {
770
+ var row = rows[j];
771
+ var rowAfter = j + 1 < rows.length ? rows[j + 1] : null;
772
+ this.drawCellBackground(context, state, column, row, rowAfter);
773
+ }
774
+ }
975
775
 
976
- for (var _i5 = 0; _i5 < hiddenColumns.length; _i5 += 1) {
977
- var _column = hiddenColumns[_i5];
776
+ context.restore();
777
+ }
978
778
 
979
- var _columnX = visibleColumnXs.get(_column);
779
+ drawCellBackground(context, state, column, row, rowAfter) {
780
+ var {
781
+ metrics,
782
+ model,
783
+ model: {
784
+ hasExpandableRows
785
+ },
786
+ theme
787
+ } = state;
788
+ var {
789
+ firstColumn,
790
+ modelColumns,
791
+ modelRows,
792
+ visibleColumnXs,
793
+ visibleColumnWidths,
794
+ visibleRowYs,
795
+ visibleRowHeights
796
+ } = metrics;
797
+ var modelRow = modelRows.get(row);
798
+ var modelColumn = modelColumns.get(column);
799
+ var backgroundColor = model.backgroundColorForCell(modelColumn, modelRow, theme);
800
+ var isFirstColumn = column === firstColumn;
801
+
802
+ if (backgroundColor) {
803
+ var x = visibleColumnXs.get(column) + 1;
804
+ var y = visibleRowYs.get(row) + 1;
805
+ var columnWidth = visibleColumnWidths.get(column) - 1;
806
+ var rowHeight = visibleRowHeights.get(row) - 1;
807
+ context.fillStyle = backgroundColor;
808
+ context.fillRect(x, y, columnWidth, rowHeight);
809
+ }
980
810
 
981
- var _columnWidth = visibleColumnWidths.get(_column);
811
+ if (isFirstColumn && hasExpandableRows) {
812
+ this.drawCellRowTreeDepthLines(context, state, row, rowAfter);
813
+ }
814
+ }
982
815
 
983
- var minX = gridX + _columnX + _columnWidth + 0.5 - headerHiddenSeparatorSize * 0.5;
984
- context.rect(minX, hiddenY, headerHiddenSeparatorSize, hiddenSeparatorHeight);
985
- }
816
+ drawCellContents(context, state) {
817
+ var {
818
+ metrics
819
+ } = state;
820
+ var {
821
+ visibleColumns
822
+ } = metrics;
823
+
824
+ for (var i = 0; i < visibleColumns.length; i += 1) {
825
+ var column = visibleColumns[i];
826
+ this.drawColumnCellContents(context, state, column);
827
+ }
828
+ }
986
829
 
987
- context.fill();
988
- }
830
+ drawColumnCellContents(context, state, column) {
831
+ var {
832
+ metrics
833
+ } = state;
834
+ var {
835
+ visibleColumnXs,
836
+ visibleColumnWidths,
837
+ visibleRows,
838
+ height
839
+ } = metrics;
840
+ var x = visibleColumnXs.get(column);
841
+ var columnWidth = visibleColumnWidths.get(column);
842
+ context.save();
843
+ context.beginPath();
844
+ context.rect(x, 0, columnWidth, height);
845
+ context.clip();
846
+
847
+ for (var i = 0; i < visibleRows.length; i += 1) {
848
+ var row = visibleRows[i];
849
+ this.drawCellContent(context, state, column, row);
850
+ }
989
851
 
990
- if (headerSeparatorHoverColor) {
991
- var highlightedSeparator = draggingColumnSeparator;
852
+ context.restore();
853
+ }
992
854
 
993
- if (highlightedSeparator == null) {
994
- highlightedSeparator = GridUtils.getColumnSeparatorIndex(mouseX, mouseY, metrics, theme);
995
- }
855
+ drawCellContent(context, state, column, row) {
856
+ var {
857
+ metrics,
858
+ model,
859
+ model: {
860
+ hasExpandableRows
861
+ },
862
+ theme
863
+ } = state;
864
+ var {
865
+ firstColumn,
866
+ fontWidths,
867
+ modelColumns,
868
+ modelRows,
869
+ visibleColumnXs,
870
+ visibleColumnWidths,
871
+ visibleRowYs,
872
+ visibleRowHeights
873
+ } = metrics;
874
+ var {
875
+ cellHorizontalPadding,
876
+ treeDepthIndent,
877
+ treeHorizontalPadding,
878
+ textColor
879
+ } = theme;
880
+ var x = visibleColumnXs.get(column);
881
+ var y = visibleRowYs.get(row);
882
+ var columnWidth = visibleColumnWidths.get(column);
883
+ var rowHeight = visibleRowHeights.get(row);
884
+ var modelRow = modelRows.get(row);
885
+ var modelColumn = modelColumns.get(column);
886
+ var text = model.textForCell(modelColumn, modelRow);
887
+ var isFirstColumn = column === firstColumn;
888
+
889
+ if (text && rowHeight > 0) {
890
+ var textAlign = model.textAlignForCell(modelColumn, modelRow) || 'left';
891
+ context.textAlign = textAlign;
892
+ var color = model.colorForCell(modelColumn, modelRow, theme) || textColor;
893
+ context.fillStyle = color;
894
+ var treeIndent = 0;
996
895
 
997
- if (highlightedSeparator != null && (!isDragging || draggingColumnSeparator != null)) {
998
- context.strokeStyle = headerSeparatorHoverColor;
896
+ if (hasExpandableRows && isFirstColumn) {
897
+ treeIndent = treeDepthIndent * (model.depthForRow(row) + 1) + treeHorizontalPadding;
898
+ }
999
899
 
1000
- var _columnX2 = visibleColumnXs.get(highlightedSeparator);
900
+ var textWidth = columnWidth - treeIndent;
901
+ var textX = x + cellHorizontalPadding;
902
+ var textY = y + rowHeight * 0.5;
1001
903
 
1002
- var _columnWidth2 = visibleColumnWidths.get(highlightedSeparator);
904
+ if (textAlign === 'right') {
905
+ textX = x + textWidth - cellHorizontalPadding;
906
+ } else if (textAlign === 'center') {
907
+ textX = x + textWidth * 0.5;
908
+ } else {
909
+ textX = x + cellHorizontalPadding;
910
+ }
1003
911
 
1004
- var _x4 = gridX + _columnX2 + _columnWidth2 + 0.5;
912
+ textX += treeIndent;
913
+ var fontWidth = fontWidths.get(context.font);
914
+ var truncatedText = this.getCachedTruncatedString(context, text, textWidth - cellHorizontalPadding * 2, fontWidth);
1005
915
 
1006
- var visibleColumnIndex = visibleColumns.indexOf(highlightedSeparator);
1007
- var nextColumn = visibleColumnIndex < visibleColumns.length - 1 ? visibleColumns[visibleColumnIndex + 1] : null;
1008
- var nextColumnWidth = nextColumn != null ? visibleColumnWidths.get(nextColumn) : null;
1009
- var isColumnHidden = _columnWidth2 === 0;
1010
- var isNextColumnHidden = nextColumnWidth != null && nextColumnWidth === 0;
916
+ if (truncatedText != null) {
917
+ context.fillText(truncatedText, textX, textY);
918
+ }
919
+ }
1011
920
 
1012
- if (isColumnHidden) {
1013
- context.strokeStyle = headerHiddenSeparatorHoverColor;
1014
- context.fillStyle = headerHiddenSeparatorHoverColor;
1015
- context.fillRect(_x4, hiddenY, headerHiddenSeparatorSize * 0.5, hiddenSeparatorHeight);
1016
- } else if (isNextColumnHidden) {
1017
- context.fillStyle = headerSeparatorHoverColor;
1018
- context.fillRect(_x4 - headerHiddenSeparatorSize * 0.5, hiddenY, headerHiddenSeparatorSize * 0.5, hiddenSeparatorHeight);
1019
- } // column seperator hover line
921
+ if (isFirstColumn && hasExpandableRows) {
922
+ this.drawCellRowTreeMarker(context, state, row);
923
+ }
924
+ }
1020
925
 
926
+ drawCellRowTreeMarker(context, state, row) {
927
+ var {
928
+ metrics,
929
+ model,
930
+ mouseX,
931
+ mouseY,
932
+ theme
933
+ } = state;
934
+ var {
935
+ firstColumn,
936
+ gridX,
937
+ gridY,
938
+ visibleColumnXs,
939
+ visibleColumnWidths,
940
+ visibleRowYs,
941
+ visibleRowHeights,
942
+ visibleRowTreeBoxes
943
+ } = metrics;
944
+ var {
945
+ treeMarkerColor,
946
+ treeMarkerHoverColor
947
+ } = theme;
948
+ var columnX = visibleColumnXs.get(firstColumn);
949
+ var columnWidth = visibleColumnWidths.get(firstColumn);
950
+ var rowY = visibleRowYs.get(row);
951
+ var rowHeight = visibleRowHeights.get(row);
952
+ var isExpandable = model.isRowExpandable(row);
953
+ var isExpanded = model.isRowExpanded(row);
954
+
955
+ if (isExpandable) {
956
+ var treeBox = visibleRowTreeBoxes.get(row);
957
+ var color = mouseX >= gridX + columnX && mouseX <= gridX + columnX + columnWidth && mouseY >= gridY + rowY && mouseY <= gridY + rowY + rowHeight ? treeMarkerHoverColor : treeMarkerColor;
958
+ this.drawTreeMarker(context, state, columnX, rowY, treeBox, color, isExpanded);
959
+ }
960
+ }
1021
961
 
1022
- context.beginPath();
1023
- context.moveTo(_x4, 0);
1024
- context.lineTo(_x4, columnHeaderHeight - 1);
1025
- context.stroke();
1026
- }
962
+ drawTreeMarker(context, state, columnX, rowY, treeBox, color, isExpanded) {
963
+ var [x1, y1, x2, y2] = treeBox;
964
+ var markerText = isExpanded ? '⊟' : '⊞';
965
+ var textX = columnX + (x1 + x2) * 0.5 + 0.5;
966
+ var textY = rowY + (y1 + y2) * 0.5 + 0.5;
967
+ context.fillStyle = color;
968
+ context.textAlign = 'center';
969
+ context.fillText(markerText, textX, textY);
970
+ }
971
+
972
+ drawCellRowTreeDepthLines(context, state, row, rowAfter) {
973
+ var {
974
+ metrics,
975
+ model,
976
+ theme
977
+ } = state;
978
+ var depth = model.depthForRow(row);
979
+ if (depth === 0) return;
980
+ var {
981
+ firstColumn,
982
+ visibleColumnXs,
983
+ visibleRowYs,
984
+ visibleRowHeights
985
+ } = metrics;
986
+ var {
987
+ treeDepthIndent,
988
+ treeHorizontalPadding,
989
+ treeLineColor
990
+ } = theme;
991
+ var columnX = visibleColumnXs.get(firstColumn);
992
+ var rowY = visibleRowYs.get(row);
993
+ var rowHeight = visibleRowHeights.get(row);
994
+ var depthRowAfter = model.depthForRow(rowAfter);
995
+ var depthDiff = depth > depthRowAfter ? depth - depthRowAfter : 0;
996
+ context.strokeStyle = treeLineColor;
997
+ context.lineWidth = 1; // draw normal depth lines
998
+
999
+ if (depth - depthDiff > 0) {
1000
+ context.beginPath();
1001
+
1002
+ for (var i = 0; i < depth - depthDiff; i += 1) {
1003
+ var lineX = columnX + i * treeDepthIndent + treeDepthIndent * 0.5 + treeHorizontalPadding + 0.5;
1004
+ context.moveTo(lineX, rowY);
1005
+ context.lineTo(lineX, rowY + rowHeight);
1027
1006
  }
1028
1007
 
1029
- context.fillStyle = headerColor;
1008
+ context.stroke();
1009
+ } // draw as hockey stick if last row at depth
1010
+
1030
1011
 
1031
- for (var _i6 = 0; _i6 < visibleColumns.length; _i6 += 1) {
1032
- var _column2 = visibleColumns[_i6];
1012
+ if (depthDiff > 0) {
1013
+ context.beginPath();
1033
1014
 
1034
- var _columnWidth3 = visibleColumnWidths.get(_column2);
1015
+ for (var _i4 = depth - depthDiff; _i4 < depth; _i4 += 1) {
1016
+ var _lineX = columnX + _i4 * treeDepthIndent + treeDepthIndent * 0.5 + treeHorizontalPadding + 0.5;
1035
1017
 
1036
- var _x5 = visibleColumnXs.get(_column2) + gridX;
1018
+ context.moveTo(_lineX, rowY);
1019
+ context.lineTo(_lineX, rowY + Math.ceil(rowHeight / 2)); // extra moveTo prevents halfpixel in corner
1037
1020
 
1038
- this.drawColumnHeader(context, state, _column2, _x5, _columnWidth3);
1021
+ context.moveTo(_lineX - 0.5, rowY + Math.ceil(rowHeight / 2) + 0.5);
1022
+ context.lineTo(_lineX + treeDepthIndent - 0.5, rowY + Math.ceil(rowHeight / 2) + 0.5);
1039
1023
  }
1040
1024
 
1041
- context.restore();
1025
+ context.stroke();
1042
1026
  }
1043
- }, {
1044
- key: "drawColumnHeader",
1045
- value: function drawColumnHeader(context, state, column, columnX, columnWidth) {
1046
- if (columnWidth <= 0) {
1047
- return;
1048
- }
1027
+ }
1049
1028
 
1050
- var metrics = state.metrics,
1051
- model = state.model,
1052
- theme = state.theme;
1053
- var modelColumns = metrics.modelColumns;
1054
- var modelColumn = modelColumns.get(column);
1055
- var text = model.textForColumnHeader(modelColumn);
1029
+ drawHeaders(context, state) {
1030
+ var {
1031
+ theme
1032
+ } = state;
1033
+ context.font = theme.headerFont;
1034
+ this.drawColumnHeaders(context, state);
1035
+ this.drawRowHeaders(context, state);
1036
+ }
1056
1037
 
1057
- if (!text) {
1058
- return;
1059
- }
1038
+ drawFooters(context, state) {
1039
+ var {
1040
+ theme
1041
+ } = state;
1042
+ context.font = theme.headerFont;
1043
+ this.drawRowFooters(context, state);
1044
+ }
1060
1045
 
1061
- var headerHorizontalPadding = theme.headerHorizontalPadding;
1062
- var columnHeaderHeight = metrics.columnHeaderHeight,
1063
- fontWidths = metrics.fontWidths;
1064
- var fontWidth = fontWidths.get(context.font) || GridRenderer.DEFAULT_FONT_WIDTH;
1065
- var maxLength = (columnWidth - headerHorizontalPadding * 2) / fontWidth;
1046
+ drawColumnHeaders(context, state) {
1047
+ var {
1048
+ mouseX,
1049
+ mouseY,
1050
+ theme,
1051
+ metrics,
1052
+ draggingColumnSeparator,
1053
+ isDragging
1054
+ } = state;
1055
+ var {
1056
+ columnHeaderHeight,
1057
+ gridX,
1058
+ width,
1059
+ visibleColumns,
1060
+ visibleColumnWidths,
1061
+ visibleColumnXs
1062
+ } = metrics;
1063
+
1064
+ if (columnHeaderHeight <= 0) {
1065
+ return;
1066
+ }
1066
1067
 
1067
- if (maxLength <= 0) {
1068
- return;
1069
- }
1068
+ var {
1069
+ headerBackgroundColor,
1070
+ headerColor,
1071
+ headerHiddenSeparatorSize,
1072
+ headerHiddenSeparatorHoverColor,
1073
+ headerSeparatorColor,
1074
+ headerSeparatorHoverColor
1075
+ } = theme;
1076
+ var hiddenSeparatorHeight = columnHeaderHeight * 0.5;
1077
+ var hiddenY = columnHeaderHeight * 0.5 - hiddenSeparatorHeight * 0.5;
1078
+ context.save();
1079
+ context.beginPath(); // Fill in the background
1080
+
1081
+ context.fillStyle = headerBackgroundColor;
1082
+ context.fillRect(0, 0, width, columnHeaderHeight); // Draw the separators
1083
+
1084
+ if (headerSeparatorColor) {
1085
+ context.strokeStyle = headerSeparatorColor;
1086
+ context.beginPath();
1087
+ var hiddenColumns = [];
1088
+ var isPreviousColumnHidden = false;
1089
+
1090
+ for (var i = 0; i < visibleColumns.length; i += 1) {
1091
+ var column = visibleColumns[i];
1092
+ var columnX = visibleColumnXs.get(column);
1093
+ var columnWidth = visibleColumnWidths.get(column);
1094
+
1095
+ if (columnWidth > 0) {
1096
+ var x = gridX + columnX + columnWidth + 0.5;
1097
+ context.moveTo(x, 0);
1098
+ context.lineTo(x, columnHeaderHeight - 0.5);
1099
+ isPreviousColumnHidden = false;
1100
+ } else if (!isPreviousColumnHidden) {
1101
+ isPreviousColumnHidden = true;
1102
+ hiddenColumns.push(column);
1103
+ }
1104
+ } // Bottom Border, should be interior to the header height
1105
+
1106
+
1107
+ context.moveTo(0, columnHeaderHeight - 0.5);
1108
+ context.lineTo(width, columnHeaderHeight - 0.5);
1109
+ context.stroke(); // Now draw the hidden column separator boxes
1070
1110
 
1071
- context.save();
1072
1111
  context.beginPath();
1073
- context.rect(columnX, 0, columnWidth, columnHeaderHeight);
1074
- context.clip();
1112
+ context.fillStyle = headerSeparatorColor;
1075
1113
 
1076
- if (text.length > maxLength) {
1077
- text = "".concat(text.substring(0, maxLength - 1), "\u2026");
1078
- var x = columnX + headerHorizontalPadding;
1079
- var y = columnHeaderHeight * 0.5;
1080
- context.textAlign = 'left';
1081
- context.fillText(text, x, y);
1082
- } else {
1083
- var _x6 = columnX + columnWidth * 0.5;
1114
+ for (var _i5 = 0; _i5 < hiddenColumns.length; _i5 += 1) {
1115
+ var _column = hiddenColumns[_i5];
1084
1116
 
1085
- var _y5 = columnHeaderHeight * 0.5;
1117
+ var _columnX = visibleColumnXs.get(_column);
1086
1118
 
1087
- context.textAlign = 'center';
1088
- context.fillText(text, _x6, _y5);
1119
+ var _columnWidth = visibleColumnWidths.get(_column);
1120
+
1121
+ var minX = gridX + _columnX + _columnWidth + 0.5 - headerHiddenSeparatorSize * 0.5;
1122
+ context.rect(minX, hiddenY, headerHiddenSeparatorSize, hiddenSeparatorHeight);
1089
1123
  }
1090
1124
 
1091
- context.restore();
1125
+ context.fill();
1092
1126
  }
1093
- }, {
1094
- key: "drawRowHeaders",
1095
- value: function drawRowHeaders(context, state) {
1096
- var mouseX = state.mouseX,
1097
- mouseY = state.mouseY,
1098
- metrics = state.metrics,
1099
- theme = state.theme,
1100
- draggingRowSeparator = state.draggingRowSeparator;
1101
- var gridY = metrics.gridY,
1102
- rowHeaderWidth = metrics.rowHeaderWidth,
1103
- height = metrics.height,
1104
- visibleRows = metrics.visibleRows,
1105
- visibleRowHeights = metrics.visibleRowHeights,
1106
- visibleRowYs = metrics.visibleRowYs;
1107
-
1108
- if (rowHeaderWidth <= 0) {
1109
- return;
1127
+
1128
+ if (headerSeparatorHoverColor) {
1129
+ var highlightedSeparator = draggingColumnSeparator;
1130
+
1131
+ if (highlightedSeparator == null) {
1132
+ highlightedSeparator = GridUtils.getColumnSeparatorIndex(mouseX, mouseY, metrics, theme);
1110
1133
  }
1111
1134
 
1112
- var headerBackgroundColor = theme.headerBackgroundColor,
1113
- headerColor = theme.headerColor,
1114
- headerHiddenSeparatorSize = theme.headerHiddenSeparatorSize,
1115
- headerHiddenSeparatorHoverColor = theme.headerHiddenSeparatorHoverColor,
1116
- headerSeparatorColor = theme.headerSeparatorColor,
1117
- headerSeparatorHoverColor = theme.headerSeparatorHoverColor;
1118
- var hiddenSeparatorWidth = rowHeaderWidth * 0.5;
1119
- var hiddenX = rowHeaderWidth * 0.5 - hiddenSeparatorWidth * 0.5;
1120
- context.save();
1121
- context.beginPath(); // Fill in the background
1135
+ if (highlightedSeparator != null && (!isDragging || draggingColumnSeparator != null)) {
1136
+ context.strokeStyle = headerSeparatorHoverColor;
1122
1137
 
1123
- context.fillStyle = headerBackgroundColor;
1124
- context.fillRect(0, 0, rowHeaderWidth, height); // Draw the separators
1138
+ var _columnX2 = visibleColumnXs.get(highlightedSeparator);
1139
+
1140
+ var _columnWidth2 = visibleColumnWidths.get(highlightedSeparator);
1141
+
1142
+ var _x4 = gridX + _columnX2 + _columnWidth2 + 0.5;
1143
+
1144
+ var visibleColumnIndex = visibleColumns.indexOf(highlightedSeparator);
1145
+ var nextColumn = visibleColumnIndex < visibleColumns.length - 1 ? visibleColumns[visibleColumnIndex + 1] : null;
1146
+ var nextColumnWidth = nextColumn != null ? visibleColumnWidths.get(nextColumn) : null;
1147
+ var isColumnHidden = _columnWidth2 === 0;
1148
+ var isNextColumnHidden = nextColumnWidth != null && nextColumnWidth === 0;
1149
+
1150
+ if (isColumnHidden) {
1151
+ context.strokeStyle = headerHiddenSeparatorHoverColor;
1152
+ context.fillStyle = headerHiddenSeparatorHoverColor;
1153
+ context.fillRect(_x4, hiddenY, headerHiddenSeparatorSize * 0.5, hiddenSeparatorHeight);
1154
+ } else if (isNextColumnHidden) {
1155
+ context.fillStyle = headerSeparatorHoverColor;
1156
+ context.fillRect(_x4 - headerHiddenSeparatorSize * 0.5, hiddenY, headerHiddenSeparatorSize * 0.5, hiddenSeparatorHeight);
1157
+ } // column seperator hover line
1125
1158
 
1126
- if (headerSeparatorColor) {
1127
- context.strokeStyle = headerSeparatorColor;
1128
- context.beginPath();
1129
- context.moveTo(0, gridY + 0.5);
1130
- context.lineTo(rowHeaderWidth, gridY + 0.5);
1131
- var hiddenRows = [];
1132
- var isPreviousRowHidden = false;
1133
-
1134
- for (var i = 0; i < visibleRows.length; i += 1) {
1135
- var row = visibleRows[i];
1136
- var rowY = visibleRowYs.get(row);
1137
- var rowHeight = visibleRowHeights.get(row);
1138
-
1139
- if (rowHeight > 0) {
1140
- var y = gridY + rowY + rowHeight + 0.5;
1141
- context.moveTo(0, y);
1142
- context.lineTo(rowHeaderWidth, y);
1143
- isPreviousRowHidden = false;
1144
- } else if (!isPreviousRowHidden) {
1145
- isPreviousRowHidden = true;
1146
- hiddenRows.push(row);
1147
- }
1148
- } // border right, interior to the headerWidth
1149
-
1150
-
1151
- context.moveTo(rowHeaderWidth - 0.5, 0);
1152
- context.lineTo(rowHeaderWidth - 0.5, height);
1153
- context.stroke(); // Draw the hidden column separators
1154
1159
 
1155
1160
  context.beginPath();
1156
- context.fillStyle = headerSeparatorColor;
1161
+ context.moveTo(_x4, 0);
1162
+ context.lineTo(_x4, columnHeaderHeight - 1);
1163
+ context.stroke();
1164
+ }
1165
+ }
1157
1166
 
1158
- for (var _i7 = 0; _i7 < hiddenRows.length; _i7 += 1) {
1159
- var _row4 = hiddenRows[_i7];
1167
+ context.fillStyle = headerColor;
1160
1168
 
1161
- var _rowY = visibleRowYs.get(_row4);
1169
+ for (var _i6 = 0; _i6 < visibleColumns.length; _i6 += 1) {
1170
+ var _column2 = visibleColumns[_i6];
1162
1171
 
1163
- var _rowHeight = visibleRowHeights.get(_row4);
1172
+ var _columnWidth3 = visibleColumnWidths.get(_column2);
1164
1173
 
1165
- var minY = gridY + _rowY + _rowHeight + 0.5 - headerHiddenSeparatorSize * 0.5;
1166
- context.rect(hiddenX, minY, hiddenSeparatorWidth, headerHiddenSeparatorSize);
1167
- }
1174
+ var _x5 = visibleColumnXs.get(_column2) + gridX;
1168
1175
 
1169
- context.fill();
1170
- }
1176
+ this.drawColumnHeader(context, state, _column2, _x5, _columnWidth3);
1177
+ }
1171
1178
 
1172
- if (headerSeparatorHoverColor) {
1173
- var highlightedSeparator = draggingRowSeparator;
1179
+ context.restore();
1180
+ }
1174
1181
 
1175
- if (highlightedSeparator == null) {
1176
- highlightedSeparator = GridUtils.getRowSeparatorIndex(mouseX, mouseY, metrics, theme);
1177
- }
1182
+ drawColumnHeader(context, state, column, columnX, columnWidth) {
1183
+ if (columnWidth <= 0) {
1184
+ return;
1185
+ }
1186
+
1187
+ var {
1188
+ metrics,
1189
+ model,
1190
+ theme
1191
+ } = state;
1192
+ var {
1193
+ modelColumns
1194
+ } = metrics;
1195
+ var modelColumn = modelColumns.get(column);
1196
+ var text = model.textForColumnHeader(modelColumn);
1197
+
1198
+ if (!text) {
1199
+ return;
1200
+ }
1201
+
1202
+ var {
1203
+ headerHorizontalPadding
1204
+ } = theme;
1205
+ var {
1206
+ columnHeaderHeight,
1207
+ fontWidths
1208
+ } = metrics;
1209
+ var fontWidth = fontWidths.get(context.font) || GridRenderer.DEFAULT_FONT_WIDTH;
1210
+ var maxLength = (columnWidth - headerHorizontalPadding * 2) / fontWidth;
1211
+
1212
+ if (maxLength <= 0) {
1213
+ return;
1214
+ }
1178
1215
 
1179
- if (highlightedSeparator != null) {
1180
- context.strokeStyle = headerSeparatorHoverColor;
1216
+ context.save();
1217
+ context.beginPath();
1218
+ context.rect(columnX, 0, columnWidth, columnHeaderHeight);
1219
+ context.clip();
1181
1220
 
1182
- var _rowY2 = visibleRowYs.get(highlightedSeparator);
1221
+ if (text.length > maxLength) {
1222
+ text = "".concat(text.substring(0, maxLength - 1), "\u2026");
1223
+ var x = columnX + headerHorizontalPadding;
1224
+ var y = columnHeaderHeight * 0.5;
1225
+ context.textAlign = 'left';
1226
+ context.fillText(text, x, y);
1227
+ } else {
1228
+ var _x6 = columnX + columnWidth * 0.5;
1229
+
1230
+ var _y5 = columnHeaderHeight * 0.5;
1183
1231
 
1184
- var _rowHeight2 = visibleRowHeights.get(highlightedSeparator);
1232
+ context.textAlign = 'center';
1233
+ context.fillText(text, _x6, _y5);
1234
+ }
1185
1235
 
1186
- var _y6 = gridY + _rowY2 + _rowHeight2 + 0.5;
1236
+ context.restore();
1237
+ }
1187
1238
 
1188
- var visibleRowIndex = visibleRows.indexOf(highlightedSeparator);
1189
- var nextRow = visibleRowIndex < visibleRows.length - 1 ? visibleRows[visibleRowIndex + 1] : null;
1190
- var nextRowHeight = nextRow != null ? visibleRowHeights.get(nextRow) : null;
1191
- var isRowHidden = _rowHeight2 === 0;
1192
- var isNextRowHidden = nextRowHeight != null && nextRowHeight === 0;
1239
+ drawRowHeaders(context, state) {
1240
+ var {
1241
+ mouseX,
1242
+ mouseY,
1243
+ metrics,
1244
+ theme,
1245
+ draggingRowSeparator
1246
+ } = state;
1247
+ var {
1248
+ gridY,
1249
+ rowHeaderWidth,
1250
+ height,
1251
+ visibleRows,
1252
+ visibleRowHeights,
1253
+ visibleRowYs
1254
+ } = metrics;
1255
+
1256
+ if (rowHeaderWidth <= 0) {
1257
+ return;
1258
+ }
1193
1259
 
1194
- if (isRowHidden) {
1195
- context.strokeStyle = headerHiddenSeparatorHoverColor;
1196
- context.fillStyle = headerHiddenSeparatorHoverColor;
1197
- context.fillRect(hiddenX, _y6, hiddenSeparatorWidth, headerHiddenSeparatorSize * 0.5);
1198
- } else if (isNextRowHidden) {
1199
- context.fillStyle = headerSeparatorHoverColor;
1200
- context.fillRect(hiddenX, _y6 - headerHiddenSeparatorSize * 0.5, hiddenSeparatorWidth, headerHiddenSeparatorSize * 0.5);
1201
- }
1260
+ var {
1261
+ headerBackgroundColor,
1262
+ headerColor,
1263
+ headerHiddenSeparatorSize,
1264
+ headerHiddenSeparatorHoverColor,
1265
+ headerSeparatorColor,
1266
+ headerSeparatorHoverColor
1267
+ } = theme;
1268
+ var hiddenSeparatorWidth = rowHeaderWidth * 0.5;
1269
+ var hiddenX = rowHeaderWidth * 0.5 - hiddenSeparatorWidth * 0.5;
1270
+ context.save();
1271
+ context.beginPath(); // Fill in the background
1272
+
1273
+ context.fillStyle = headerBackgroundColor;
1274
+ context.fillRect(0, 0, rowHeaderWidth, height); // Draw the separators
1275
+
1276
+ if (headerSeparatorColor) {
1277
+ context.strokeStyle = headerSeparatorColor;
1278
+ context.beginPath();
1279
+ context.moveTo(0, gridY + 0.5);
1280
+ context.lineTo(rowHeaderWidth, gridY + 0.5);
1281
+ var hiddenRows = [];
1282
+ var isPreviousRowHidden = false;
1202
1283
 
1203
- context.beginPath();
1204
- context.moveTo(0.5, _y6);
1205
- context.lineTo(rowHeaderWidth + 0.5, _y6);
1206
- context.stroke();
1284
+ for (var i = 0; i < visibleRows.length; i += 1) {
1285
+ var row = visibleRows[i];
1286
+ var rowY = visibleRowYs.get(row);
1287
+ var rowHeight = visibleRowHeights.get(row);
1288
+
1289
+ if (rowHeight > 0) {
1290
+ var y = gridY + rowY + rowHeight + 0.5;
1291
+ context.moveTo(0, y);
1292
+ context.lineTo(rowHeaderWidth, y);
1293
+ isPreviousRowHidden = false;
1294
+ } else if (!isPreviousRowHidden) {
1295
+ isPreviousRowHidden = true;
1296
+ hiddenRows.push(row);
1207
1297
  }
1208
- } // Fill in the text
1298
+ } // border right, interior to the headerWidth
1209
1299
 
1210
1300
 
1301
+ context.moveTo(rowHeaderWidth - 0.5, 0);
1302
+ context.lineTo(rowHeaderWidth - 0.5, height);
1303
+ context.stroke(); // Draw the hidden column separators
1304
+
1211
1305
  context.beginPath();
1212
- context.rect(0, gridY, rowHeaderWidth, height);
1213
- context.clip();
1214
- context.fillStyle = headerColor;
1215
- context.textAlign = 'right';
1306
+ context.fillStyle = headerSeparatorColor;
1216
1307
 
1217
- for (var _i8 = 0; _i8 < visibleRows.length; _i8 += 1) {
1218
- var _row5 = visibleRows[_i8];
1308
+ for (var _i7 = 0; _i7 < hiddenRows.length; _i7 += 1) {
1309
+ var _row4 = hiddenRows[_i7];
1219
1310
 
1220
- var _rowHeight3 = visibleRowHeights.get(_row5);
1311
+ var _rowY = visibleRowYs.get(_row4);
1221
1312
 
1222
- var _y7 = visibleRowYs.get(_row5) + gridY;
1313
+ var _rowHeight = visibleRowHeights.get(_row4);
1223
1314
 
1224
- this.drawRowHeader(context, state, _row5, _y7, _rowHeight3);
1315
+ var minY = gridY + _rowY + _rowHeight + 0.5 - headerHiddenSeparatorSize * 0.5;
1316
+ context.rect(hiddenX, minY, hiddenSeparatorWidth, headerHiddenSeparatorSize);
1225
1317
  }
1226
1318
 
1227
- context.restore();
1319
+ context.fill();
1228
1320
  }
1229
- }, {
1230
- key: "drawRowHeader",
1231
- value: function drawRowHeader(context, state, row, rowY, rowHeight) {
1232
- if (rowHeight <= 0) {
1233
- return;
1234
- }
1235
1321
 
1236
- var metrics = state.metrics,
1237
- model = state.model,
1238
- theme = state.theme;
1239
- var modelRows = metrics.modelRows,
1240
- rowHeaderWidth = metrics.rowHeaderWidth;
1241
- var modelRow = modelRows.get(row);
1242
- var x = rowHeaderWidth - theme.cellHorizontalPadding;
1243
- var y = rowY + rowHeight * 0.5;
1244
- context.fillText(model.textForRowHeader(modelRow), x, y);
1245
- }
1246
- }, {
1247
- key: "drawRowFooters",
1248
- value: function drawRowFooters(context, state) {
1249
- var mouseX = state.mouseX,
1250
- mouseY = state.mouseY,
1251
- metrics = state.metrics,
1252
- model = state.model,
1253
- theme = state.theme,
1254
- draggingRowSeparator = state.draggingRowSeparator;
1255
- var gridY = metrics.gridY,
1256
- gridX = metrics.gridX,
1257
- maxX = metrics.maxX,
1258
- modelRows = metrics.modelRows,
1259
- rowFooterWidth = metrics.rowFooterWidth,
1260
- height = metrics.height,
1261
- verticalBarWidth = metrics.verticalBarWidth,
1262
- visibleRows = metrics.visibleRows,
1263
- visibleRowHeights = metrics.visibleRowHeights,
1264
- visibleRowYs = metrics.visibleRowYs,
1265
- width = metrics.width;
1266
-
1267
- if (rowFooterWidth <= 0) {
1268
- return;
1269
- }
1322
+ if (headerSeparatorHoverColor) {
1323
+ var highlightedSeparator = draggingRowSeparator;
1270
1324
 
1271
- var cellHorizontalPadding = theme.cellHorizontalPadding,
1272
- headerBackgroundColor = theme.headerBackgroundColor,
1273
- headerColor = theme.headerColor,
1274
- headerHiddenSeparatorSize = theme.headerHiddenSeparatorSize,
1275
- headerHiddenSeparatorHoverColor = theme.headerHiddenSeparatorHoverColor,
1276
- headerSeparatorColor = theme.headerSeparatorColor,
1277
- headerSeparatorHoverColor = theme.headerSeparatorHoverColor;
1278
- var hiddenSeparatorWidth = rowFooterWidth * 0.5;
1279
- var hiddenX = rowFooterWidth * 0.5 - hiddenSeparatorWidth * 0.5;
1280
- var x = Math.min(gridX + maxX, width - rowFooterWidth - verticalBarWidth);
1281
- context.save();
1282
- context.beginPath(); // Fill in the background
1325
+ if (highlightedSeparator == null) {
1326
+ highlightedSeparator = GridUtils.getRowSeparatorIndex(mouseX, mouseY, metrics, theme);
1327
+ }
1283
1328
 
1284
- context.fillStyle = headerBackgroundColor;
1285
- context.fillRect(x, gridY, rowFooterWidth, height); // Draw the separators
1329
+ if (highlightedSeparator != null) {
1330
+ context.strokeStyle = headerSeparatorHoverColor;
1286
1331
 
1287
- if (headerSeparatorColor) {
1288
- context.strokeStyle = headerSeparatorColor;
1289
- context.beginPath();
1290
- context.moveTo(x, gridY + 0.5);
1291
- context.lineTo(rowFooterWidth, gridY + 0.5);
1292
- var hiddenRows = [];
1293
- var isPreviousRowHidden = false;
1294
-
1295
- for (var i = 0; i < visibleRows.length; i += 1) {
1296
- var row = visibleRows[i];
1297
- var rowY = visibleRowYs.get(row);
1298
- var rowHeight = visibleRowHeights.get(row);
1299
-
1300
- if (rowHeight > 0) {
1301
- var y = gridY + rowY + rowHeight + 0.5;
1302
- context.moveTo(x + 0.5, y);
1303
- context.lineTo(x + rowFooterWidth - 0.5, y);
1304
- isPreviousRowHidden = false;
1305
- } else if (!isPreviousRowHidden) {
1306
- isPreviousRowHidden = true;
1307
- hiddenRows.push(row);
1308
- }
1309
- } // border left, interior to the headerWidth
1310
-
1311
-
1312
- context.moveTo(x + 0.5, gridY);
1313
- context.lineTo(x + 0.5, height);
1314
- context.stroke(); // Draw the hidden column separators
1332
+ var _rowY2 = visibleRowYs.get(highlightedSeparator);
1315
1333
 
1316
- context.beginPath();
1317
- context.fillStyle = headerSeparatorColor;
1334
+ var _rowHeight2 = visibleRowHeights.get(highlightedSeparator);
1318
1335
 
1319
- for (var _i9 = 0; _i9 < hiddenRows.length; _i9 += 1) {
1320
- var _row6 = hiddenRows[_i9];
1336
+ var _y6 = gridY + _rowY2 + _rowHeight2 + 0.5;
1321
1337
 
1322
- var _rowY3 = visibleRowYs.get(_row6);
1338
+ var visibleRowIndex = visibleRows.indexOf(highlightedSeparator);
1339
+ var nextRow = visibleRowIndex < visibleRows.length - 1 ? visibleRows[visibleRowIndex + 1] : null;
1340
+ var nextRowHeight = nextRow != null ? visibleRowHeights.get(nextRow) : null;
1341
+ var isRowHidden = _rowHeight2 === 0;
1342
+ var isNextRowHidden = nextRowHeight != null && nextRowHeight === 0;
1323
1343
 
1324
- var _rowHeight4 = visibleRowHeights.get(_row6);
1325
-
1326
- var minY = gridY + _rowY3 + _rowHeight4 + 0.5 - headerHiddenSeparatorSize * 0.5;
1327
- context.rect(x + hiddenX, minY, hiddenSeparatorWidth, headerHiddenSeparatorSize);
1344
+ if (isRowHidden) {
1345
+ context.strokeStyle = headerHiddenSeparatorHoverColor;
1346
+ context.fillStyle = headerHiddenSeparatorHoverColor;
1347
+ context.fillRect(hiddenX, _y6, hiddenSeparatorWidth, headerHiddenSeparatorSize * 0.5);
1348
+ } else if (isNextRowHidden) {
1349
+ context.fillStyle = headerSeparatorHoverColor;
1350
+ context.fillRect(hiddenX, _y6 - headerHiddenSeparatorSize * 0.5, hiddenSeparatorWidth, headerHiddenSeparatorSize * 0.5);
1328
1351
  }
1329
1352
 
1330
- context.fill();
1353
+ context.beginPath();
1354
+ context.moveTo(0.5, _y6);
1355
+ context.lineTo(rowHeaderWidth + 0.5, _y6);
1356
+ context.stroke();
1331
1357
  }
1358
+ } // Fill in the text
1332
1359
 
1333
- if (headerSeparatorHoverColor) {
1334
- var highlightedSeparator = draggingRowSeparator;
1335
1360
 
1336
- if (highlightedSeparator == null) {
1337
- highlightedSeparator = GridUtils.getRowSeparatorIndex(mouseX, mouseY, metrics, theme);
1338
- }
1361
+ context.beginPath();
1362
+ context.rect(0, gridY, rowHeaderWidth, height);
1363
+ context.clip();
1364
+ context.fillStyle = headerColor;
1365
+ context.textAlign = 'right';
1366
+
1367
+ for (var _i8 = 0; _i8 < visibleRows.length; _i8 += 1) {
1368
+ var _row5 = visibleRows[_i8];
1339
1369
 
1340
- if (highlightedSeparator != null) {
1341
- context.strokeStyle = headerSeparatorHoverColor;
1370
+ var _rowHeight3 = visibleRowHeights.get(_row5);
1371
+
1372
+ var _y7 = visibleRowYs.get(_row5) + gridY;
1373
+
1374
+ this.drawRowHeader(context, state, _row5, _y7, _rowHeight3);
1375
+ }
1342
1376
 
1343
- var _rowY4 = visibleRowYs.get(highlightedSeparator);
1377
+ context.restore();
1378
+ }
1344
1379
 
1345
- var _rowHeight5 = visibleRowHeights.get(highlightedSeparator);
1380
+ drawRowHeader(context, state, row, rowY, rowHeight) {
1381
+ if (rowHeight <= 0) {
1382
+ return;
1383
+ }
1346
1384
 
1347
- var _y8 = gridY + _rowY4 + _rowHeight5 + 0.5;
1385
+ var {
1386
+ metrics,
1387
+ model,
1388
+ theme
1389
+ } = state;
1390
+ var {
1391
+ modelRows,
1392
+ rowHeaderWidth
1393
+ } = metrics;
1394
+ var modelRow = modelRows.get(row);
1395
+ var x = rowHeaderWidth - theme.cellHorizontalPadding;
1396
+ var y = rowY + rowHeight * 0.5;
1397
+ context.fillText(model.textForRowHeader(modelRow), x, y);
1398
+ }
1348
1399
 
1349
- var visibleRowIndex = visibleRows.indexOf(highlightedSeparator);
1350
- var nextRow = visibleRowIndex < visibleRows.length - 1 ? visibleRows[visibleRowIndex + 1] : null;
1351
- var nextRowHeight = nextRow != null ? visibleRowHeights.get(nextRow) : null;
1352
- var isRowHidden = _rowHeight5 === 0;
1353
- var isNextRowHidden = nextRowHeight != null && nextRowHeight === 0;
1400
+ drawRowFooters(context, state) {
1401
+ var {
1402
+ mouseX,
1403
+ mouseY,
1404
+ metrics,
1405
+ model,
1406
+ theme,
1407
+ draggingRowSeparator
1408
+ } = state;
1409
+ var {
1410
+ gridY,
1411
+ gridX,
1412
+ maxX,
1413
+ modelRows,
1414
+ rowFooterWidth,
1415
+ height,
1416
+ verticalBarWidth,
1417
+ visibleRows,
1418
+ visibleRowHeights,
1419
+ visibleRowYs,
1420
+ width
1421
+ } = metrics;
1422
+
1423
+ if (rowFooterWidth <= 0) {
1424
+ return;
1425
+ }
1354
1426
 
1355
- if (isRowHidden) {
1356
- context.strokeStyle = headerHiddenSeparatorHoverColor;
1357
- context.fillStyle = headerHiddenSeparatorHoverColor;
1358
- context.fillRect(hiddenX, _y8, hiddenSeparatorWidth, headerHiddenSeparatorSize * 0.5);
1359
- } else if (isNextRowHidden) {
1360
- context.fillStyle = headerSeparatorHoverColor;
1361
- context.fillRect(hiddenX, _y8 - headerHiddenSeparatorSize * 0.5, hiddenSeparatorWidth, headerHiddenSeparatorSize * 0.5);
1362
- }
1427
+ var {
1428
+ cellHorizontalPadding,
1429
+ headerBackgroundColor,
1430
+ headerColor,
1431
+ headerHiddenSeparatorSize,
1432
+ headerHiddenSeparatorHoverColor,
1433
+ headerSeparatorColor,
1434
+ headerSeparatorHoverColor
1435
+ } = theme;
1436
+ var hiddenSeparatorWidth = rowFooterWidth * 0.5;
1437
+ var hiddenX = rowFooterWidth * 0.5 - hiddenSeparatorWidth * 0.5;
1438
+ var x = Math.min(gridX + maxX, width - rowFooterWidth - verticalBarWidth);
1439
+ context.save();
1440
+ context.beginPath(); // Fill in the background
1441
+
1442
+ context.fillStyle = headerBackgroundColor;
1443
+ context.fillRect(x, gridY, rowFooterWidth, height); // Draw the separators
1444
+
1445
+ if (headerSeparatorColor) {
1446
+ context.strokeStyle = headerSeparatorColor;
1447
+ context.beginPath();
1448
+ context.moveTo(x, gridY + 0.5);
1449
+ context.lineTo(rowFooterWidth, gridY + 0.5);
1450
+ var hiddenRows = [];
1451
+ var isPreviousRowHidden = false;
1363
1452
 
1364
- context.beginPath();
1365
- context.moveTo(x + 0.5, _y8);
1366
- context.lineTo(x + rowFooterWidth + 0.5, _y8);
1367
- context.stroke();
1453
+ for (var i = 0; i < visibleRows.length; i += 1) {
1454
+ var row = visibleRows[i];
1455
+ var rowY = visibleRowYs.get(row);
1456
+ var rowHeight = visibleRowHeights.get(row);
1457
+
1458
+ if (rowHeight > 0) {
1459
+ var y = gridY + rowY + rowHeight + 0.5;
1460
+ context.moveTo(x + 0.5, y);
1461
+ context.lineTo(x + rowFooterWidth - 0.5, y);
1462
+ isPreviousRowHidden = false;
1463
+ } else if (!isPreviousRowHidden) {
1464
+ isPreviousRowHidden = true;
1465
+ hiddenRows.push(row);
1368
1466
  }
1369
- } // Fill in the text
1467
+ } // border left, interior to the headerWidth
1468
+
1370
1469
 
1470
+ context.moveTo(x + 0.5, gridY);
1471
+ context.lineTo(x + 0.5, height);
1472
+ context.stroke(); // Draw the hidden column separators
1371
1473
 
1372
1474
  context.beginPath();
1373
- context.rect(x, gridY, rowFooterWidth, height);
1374
- context.clip();
1375
- context.fillStyle = headerColor;
1376
- context.textAlign = 'left';
1377
- var textX = x + cellHorizontalPadding;
1475
+ context.fillStyle = headerSeparatorColor;
1378
1476
 
1379
- for (var _i10 = 0; _i10 < visibleRows.length; _i10 += 1) {
1380
- var _row7 = visibleRows[_i10];
1477
+ for (var _i9 = 0; _i9 < hiddenRows.length; _i9 += 1) {
1478
+ var _row6 = hiddenRows[_i9];
1381
1479
 
1382
- var _rowHeight6 = visibleRowHeights.get(_row7);
1480
+ var _rowY3 = visibleRowYs.get(_row6);
1383
1481
 
1384
- if (_rowHeight6 > 0) {
1385
- var _rowY5 = visibleRowYs.get(_row7) + gridY;
1482
+ var _rowHeight4 = visibleRowHeights.get(_row6);
1386
1483
 
1387
- var modelRow = modelRows.get(_row7);
1388
- var textY = _rowY5 + _rowHeight6 * 0.5;
1389
- context.fillText(model.textForRowFooter(modelRow), textX, textY);
1390
- }
1484
+ var minY = gridY + _rowY3 + _rowHeight4 + 0.5 - headerHiddenSeparatorSize * 0.5;
1485
+ context.rect(x + hiddenX, minY, hiddenSeparatorWidth, headerHiddenSeparatorSize);
1391
1486
  }
1392
1487
 
1393
- context.restore();
1488
+ context.fill();
1394
1489
  }
1395
- }, {
1396
- key: "drawSelectedRanges",
1397
- value: function drawSelectedRanges(context, state) {
1398
- var viewport = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
1399
- var column = state.cursorColumn,
1400
- row = state.cursorRow,
1401
- draggingRow = state.draggingRow,
1402
- draggingColumn = state.draggingColumn,
1403
- editingCell = state.editingCell,
1404
- metrics = state.metrics,
1405
- model = state.model,
1406
- selectedRanges = state.selectedRanges,
1407
- theme = state.theme;
1408
- var visibleColumnWidths = metrics.visibleColumnWidths,
1409
- visibleColumnXs = metrics.visibleColumnXs,
1410
- visibleRowHeights = metrics.visibleRowHeights,
1411
- visibleRowYs = metrics.visibleRowYs,
1412
- width = metrics.width,
1413
- height = metrics.height;
1414
- var _viewport$left = viewport.left,
1415
- left = _viewport$left === void 0 ? metrics.left : _viewport$left,
1416
- _viewport$top = viewport.top,
1417
- top = _viewport$top === void 0 ? metrics.top : _viewport$top,
1418
- _viewport$right = viewport.right,
1419
- right = _viewport$right === void 0 ? metrics.right : _viewport$right,
1420
- _viewport$bottom = viewport.bottom,
1421
- bottom = _viewport$bottom === void 0 ? metrics.bottom : _viewport$bottom,
1422
- _viewport$minY = viewport.minY,
1423
- minY = _viewport$minY === void 0 ? -10 : _viewport$minY,
1424
- _viewport$maxY = viewport.maxY,
1425
- maxY = _viewport$maxY === void 0 ? height + 10 : _viewport$maxY,
1426
- _viewport$minX = viewport.minX,
1427
- minX = _viewport$minX === void 0 ? -10 : _viewport$minX,
1428
- _viewport$maxX = viewport.maxX,
1429
- maxX = _viewport$maxX === void 0 ? width + 10 : _viewport$maxX;
1430
-
1431
- if (selectedRanges.length === 0) {
1432
- return;
1490
+
1491
+ if (headerSeparatorHoverColor) {
1492
+ var highlightedSeparator = draggingRowSeparator;
1493
+
1494
+ if (highlightedSeparator == null) {
1495
+ highlightedSeparator = GridUtils.getRowSeparatorIndex(mouseX, mouseY, metrics, theme);
1433
1496
  }
1434
1497
 
1435
- var isCursorVisible = model.isEditable && editingCell == null && draggingRow == null && draggingColumn == null && visibleColumnXs.has(column) && visibleRowYs.has(row);
1498
+ if (highlightedSeparator != null) {
1499
+ context.strokeStyle = headerSeparatorHoverColor;
1436
1500
 
1437
- if (isCursorVisible) {
1438
- // Punch a hole out where the active cell is, it gets styled differently.
1439
- var x = visibleColumnXs.get(column);
1440
- var y = visibleRowYs.get(row);
1441
- var w = visibleColumnWidths.get(column);
1442
- var h = visibleRowHeights.get(row);
1443
- context.save();
1444
- context.beginPath();
1445
- context.rect(0, 0, width, height);
1446
- context.rect(x, y, w, h);
1447
- context.clip('evenodd');
1448
- } // Draw selection ranges
1501
+ var _rowY4 = visibleRowYs.get(highlightedSeparator);
1449
1502
 
1503
+ var _rowHeight5 = visibleRowHeights.get(highlightedSeparator);
1450
1504
 
1451
- context.beginPath();
1505
+ var _y8 = gridY + _rowY4 + _rowHeight5 + 0.5;
1452
1506
 
1453
- for (var i = 0; i < selectedRanges.length; i += 1) {
1454
- var selectedRange = selectedRanges[i];
1455
- var startColumn = selectedRange.startColumn !== null ? selectedRange.startColumn : left;
1456
- var startRow = selectedRange.startRow !== null ? selectedRange.startRow : top;
1457
- var endColumn = selectedRange.endColumn !== null ? selectedRange.endColumn : right;
1458
- var endRow = selectedRange.endRow !== null ? selectedRange.endRow : bottom;
1459
-
1460
- if (endRow >= top && bottom >= startRow && endColumn >= left && right >= startColumn) {
1461
- // Need to offset the x/y coordinates so that the line draws nice and crisp
1462
- var _x7 = startColumn >= left && visibleColumnXs.has(startColumn) ? Math.round(visibleColumnXs.get(startColumn)) + 0.5 : minX;
1463
-
1464
- var _y9 = startRow >= top && visibleRowYs.has(startRow) ? Math.max(Math.round(visibleRowYs.get(startRow)) + 0.5, 0.5) : minY;
1465
-
1466
- var endX = endColumn <= right && visibleColumnXs.has(endColumn) ? Math.round(visibleColumnXs.get(endColumn) + visibleColumnWidths.get(endColumn)) - 0.5 : maxX;
1467
- var endY = endRow <= bottom && visibleRowYs.has(endRow) ? Math.round(visibleRowYs.get(endRow) + visibleRowHeights.get(endRow)) - 0.5 : maxY;
1468
- context.rect(_x7, _y9, endX - _x7, endY - _y9);
1469
- } // draw the inner transparent fill
1470
-
1471
-
1472
- context.fillStyle = theme.selectionColor;
1473
- context.fill();
1474
- /*
1475
- draw an "inner stroke" that's clipped to just inside of the rects
1476
- to act as a casing to the outer stroke. 3px width because 1px is outside
1477
- the rect (but clipped), 1px is "on" the rect (technically this pixel is
1478
- a half pixel clip as well due to rects offset, but we are immediately painting
1479
- over it), and then the 1px inside (which is the desired pixel).
1480
- */
1481
-
1482
- context.save();
1483
- context.clip();
1484
- context.strokeStyle = theme.selectionOutlineCasingColor;
1485
- context.lineWidth = 3;
1486
- context.stroke();
1487
- context.restore(); // draw the outerstroke border on top of the inner stroke
1507
+ var visibleRowIndex = visibleRows.indexOf(highlightedSeparator);
1508
+ var nextRow = visibleRowIndex < visibleRows.length - 1 ? visibleRows[visibleRowIndex + 1] : null;
1509
+ var nextRowHeight = nextRow != null ? visibleRowHeights.get(nextRow) : null;
1510
+ var isRowHidden = _rowHeight5 === 0;
1511
+ var isNextRowHidden = nextRowHeight != null && nextRowHeight === 0;
1488
1512
 
1489
- context.strokeStyle = theme.selectionOutlineColor;
1490
- context.lineWidth = 1;
1513
+ if (isRowHidden) {
1514
+ context.strokeStyle = headerHiddenSeparatorHoverColor;
1515
+ context.fillStyle = headerHiddenSeparatorHoverColor;
1516
+ context.fillRect(hiddenX, _y8, hiddenSeparatorWidth, headerHiddenSeparatorSize * 0.5);
1517
+ } else if (isNextRowHidden) {
1518
+ context.fillStyle = headerSeparatorHoverColor;
1519
+ context.fillRect(hiddenX, _y8 - headerHiddenSeparatorSize * 0.5, hiddenSeparatorWidth, headerHiddenSeparatorSize * 0.5);
1520
+ }
1521
+
1522
+ context.beginPath();
1523
+ context.moveTo(x + 0.5, _y8);
1524
+ context.lineTo(x + rowFooterWidth + 0.5, _y8);
1491
1525
  context.stroke();
1492
1526
  }
1527
+ } // Fill in the text
1528
+
1529
+
1530
+ context.beginPath();
1531
+ context.rect(x, gridY, rowFooterWidth, height);
1532
+ context.clip();
1533
+ context.fillStyle = headerColor;
1534
+ context.textAlign = 'left';
1535
+ var textX = x + cellHorizontalPadding;
1536
+
1537
+ for (var _i10 = 0; _i10 < visibleRows.length; _i10 += 1) {
1538
+ var _row7 = visibleRows[_i10];
1493
1539
 
1494
- if (isCursorVisible) {
1495
- context.restore();
1496
- this.drawActiveCell(context, state, column, row);
1540
+ var _rowHeight6 = visibleRowHeights.get(_row7);
1541
+
1542
+ if (_rowHeight6 > 0) {
1543
+ var _rowY5 = visibleRowYs.get(_row7) + gridY;
1544
+
1545
+ var modelRow = modelRows.get(_row7);
1546
+ var textY = _rowY5 + _rowHeight6 * 0.5;
1547
+ context.fillText(model.textForRowFooter(modelRow), textX, textY);
1497
1548
  }
1498
1549
  }
1499
- }, {
1500
- key: "drawActiveCell",
1501
- value: function drawActiveCell(context, state, column, row) {
1502
- var borderWidth = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : GridRenderer.ACTIVE_CELL_BORDER_WIDTH;
1503
- var metrics = state.metrics,
1504
- theme = state.theme;
1505
- var visibleColumnWidths = metrics.visibleColumnWidths,
1506
- visibleColumnXs = metrics.visibleColumnXs,
1507
- visibleRowHeights = metrics.visibleRowHeights,
1508
- visibleRowYs = metrics.visibleRowYs;
1509
- var cellX = visibleColumnXs.get(column);
1510
- var cellY = visibleRowYs.get(row);
1511
- var cellW = visibleColumnWidths.get(column);
1512
- var cellH = visibleRowHeights.get(row); // Now get the outline for the active cell
1513
-
1514
- var x = cellX - borderWidth * 0.5;
1515
- var y = cellY - borderWidth * 0.5;
1516
- var w = cellW + borderWidth;
1517
- var h = cellH + borderWidth; // Make sure the outline is interior on the edge
1518
-
1519
- if (x <= 0) {
1520
- w += x - 1;
1521
- x = 1;
1522
- }
1523
1550
 
1524
- if (y <= 0) {
1525
- h += y - 1;
1526
- y = 1;
1527
- }
1551
+ context.restore();
1552
+ }
1528
1553
 
1529
- var lineWidth = context.lineWidth;
1530
- context.beginPath();
1531
- context.lineWidth = borderWidth;
1532
- context.strokeStyle = theme.selectionOutlineColor;
1533
- this.drawRoundedRect(context, x, y, w, h);
1534
- context.stroke();
1535
- context.lineWidth = lineWidth;
1536
- }
1537
- /**
1538
- * Draws a rounded rectangle using the current state of the canvas.
1539
- *
1540
- * @param {CanvasRenderingContext2D} ctx
1541
- * @param {number} x coordinate of the left side
1542
- * @param {number} y coordinate of the top side
1543
- * @param {number} w width of the rectangle
1544
- * @param {number} h height of the rectangle
1545
- * @param {number} r corner radius of the rectangle
1546
- */
1547
-
1548
- }, {
1549
- key: "drawRoundedRect",
1550
- value: function drawRoundedRect(context, x, y, w, h) {
1551
- var r = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : GridRenderer.DEFAULT_EDGE_RADIUS;
1552
- context.beginPath();
1553
- context.moveTo(x + r, y);
1554
- context.lineTo(x + w - r, y);
1555
- context.quadraticCurveTo(x + w, y, x + w, y + r);
1556
- context.lineTo(x + w, y + h - r);
1557
- context.quadraticCurveTo(x + w, y + h, x + w - r, y + h);
1558
- context.lineTo(x + r, y + h);
1559
- context.quadraticCurveTo(x, y + h, x, y + h - r);
1560
- context.lineTo(x, y + r);
1561
- context.quadraticCurveTo(x, y, x + r, y);
1562
- context.closePath();
1563
- }
1564
- }, {
1565
- key: "drawDraggingColumn",
1566
- value: function drawDraggingColumn(context, state) {
1567
- var draggingColumn = state.draggingColumn,
1568
- draggingColumnOffset = state.draggingColumnOffset,
1569
- metrics = state.metrics,
1570
- mouseX = state.mouseX,
1571
- theme = state.theme;
1572
-
1573
- if (draggingColumn == null) {
1574
- return;
1575
- }
1554
+ drawSelectedRanges(context, state) {
1555
+ var viewport = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
1556
+ var {
1557
+ cursorColumn: column,
1558
+ cursorRow: row,
1559
+ draggingRow,
1560
+ draggingColumn,
1561
+ editingCell,
1562
+ metrics,
1563
+ model,
1564
+ selectedRanges,
1565
+ theme
1566
+ } = state;
1567
+ var {
1568
+ visibleColumnWidths,
1569
+ visibleColumnXs,
1570
+ visibleRowHeights,
1571
+ visibleRowYs,
1572
+ width,
1573
+ height
1574
+ } = metrics;
1575
+ var {
1576
+ left = metrics.left,
1577
+ top = metrics.top,
1578
+ right = metrics.right,
1579
+ bottom = metrics.bottom,
1580
+ minY = -10,
1581
+ maxY = height + 10,
1582
+ minX = -10,
1583
+ maxX = width + 10
1584
+ } = viewport;
1585
+
1586
+ if (selectedRanges.length === 0) {
1587
+ return;
1588
+ }
1589
+
1590
+ var isCursorVisible = model.isEditable && editingCell == null && draggingRow == null && draggingColumn == null && visibleColumnXs.has(column) && visibleRowYs.has(row);
1576
1591
 
1577
- var gridX = metrics.gridX,
1578
- gridY = metrics.gridY,
1579
- visibleColumnXs = metrics.visibleColumnXs,
1580
- visibleColumnWidths = metrics.visibleColumnWidths,
1581
- height = metrics.height;
1582
- var x = visibleColumnXs.get(draggingColumn);
1583
- var columnWidth = visibleColumnWidths.get(draggingColumn) + 1;
1584
- var backgroundColor = theme.backgroundColor,
1585
- font = theme.font,
1586
- headerFont = theme.headerFont,
1587
- reorderOffset = theme.reorderOffset,
1588
- shadowBlur = theme.shadowBlur,
1589
- shadowColor = theme.shadowColor;
1592
+ if (isCursorVisible) {
1593
+ // Punch a hole out where the active cell is, it gets styled differently.
1594
+ var x = visibleColumnXs.get(column);
1595
+ var y = visibleRowYs.get(row);
1596
+ var w = visibleColumnWidths.get(column);
1597
+ var h = visibleRowHeights.get(row);
1590
1598
  context.save();
1591
- context.translate(gridX, 0); // First, we need to draw over the row stripes where the column is coming from
1599
+ context.beginPath();
1600
+ context.rect(0, 0, width, height);
1601
+ context.rect(x, y, w, h);
1602
+ context.clip('evenodd');
1603
+ } // Draw selection ranges
1592
1604
 
1593
- context.fillStyle = backgroundColor;
1594
- context.fillRect(x, 0, columnWidth, height);
1595
- context.translate(mouseX - x - gridX - draggingColumnOffset, gridY + reorderOffset); // Then draw the shadow of the moving column
1596
1605
 
1597
- context.save();
1598
- context.shadowColor = shadowColor;
1599
- context.shadowBlur = shadowBlur;
1600
- context.fillStyle = backgroundColor;
1601
- context.fillRect(x, -gridY, columnWidth, height);
1602
- context.restore(); // Now set the clipping region and pretty much just redraw this column and all it's contents
1606
+ context.beginPath();
1603
1607
 
1604
- context.beginPath();
1605
- context.rect(x, -gridY, columnWidth, height);
1606
- context.clip();
1607
- context.font = font;
1608
- this.drawGridBackground(context, state);
1609
- this.drawColumnCellContents(context, state, draggingColumn); // Now translate it back up and draw the header
1608
+ for (var i = 0; i < selectedRanges.length; i += 1) {
1609
+ var selectedRange = selectedRanges[i];
1610
+ var startColumn = selectedRange.startColumn !== null ? selectedRange.startColumn : left;
1611
+ var startRow = selectedRange.startRow !== null ? selectedRange.startRow : top;
1612
+ var endColumn = selectedRange.endColumn !== null ? selectedRange.endColumn : right;
1613
+ var endRow = selectedRange.endRow !== null ? selectedRange.endRow : bottom;
1610
1614
 
1611
- context.translate(-gridX, -gridY);
1612
- context.font = headerFont;
1613
- this.drawColumnHeaders(context, state);
1614
- context.restore();
1615
- }
1616
- }, {
1617
- key: "drawDraggingRow",
1618
- value: function drawDraggingRow(context, state) {
1619
- var draggingRow = state.draggingRow,
1620
- draggingRowOffset = state.draggingRowOffset,
1621
- metrics = state.metrics,
1622
- mouseY = state.mouseY,
1623
- theme = state.theme;
1624
-
1625
- if (draggingRow == null) {
1626
- return;
1627
- }
1615
+ if (endRow >= top && bottom >= startRow && endColumn >= left && right >= startColumn) {
1616
+ // Need to offset the x/y coordinates so that the line draws nice and crisp
1617
+ var _x7 = startColumn >= left && visibleColumnXs.has(startColumn) ? Math.round(visibleColumnXs.get(startColumn)) + 0.5 : minX;
1628
1618
 
1629
- var gridX = metrics.gridX,
1630
- gridY = metrics.gridY,
1631
- visibleRowYs = metrics.visibleRowYs,
1632
- visibleRowHeights = metrics.visibleRowHeights,
1633
- width = metrics.width;
1634
- var y = visibleRowYs.get(draggingRow);
1635
- var rowHeight = visibleRowHeights.get(draggingRow) + 1;
1636
- var backgroundColor = theme.backgroundColor,
1637
- font = theme.font,
1638
- headerFont = theme.headerFont,
1639
- reorderOffset = theme.reorderOffset,
1640
- shadowBlur = theme.shadowBlur,
1641
- shadowColor = theme.shadowColor;
1642
- context.save();
1643
- context.translate(0, gridY); // First, we need to draw over the row stripes where the row is coming from
1619
+ var _y9 = startRow >= top && visibleRowYs.has(startRow) ? Math.max(Math.round(visibleRowYs.get(startRow)) + 0.5, 0.5) : minY;
1644
1620
 
1645
- context.fillStyle = backgroundColor;
1646
- context.fillRect(0, y, width, rowHeight);
1647
- context.translate(gridX + reorderOffset, mouseY - y - gridY - draggingRowOffset); // Then draw the shadow of the moving row
1621
+ var endX = endColumn <= right && visibleColumnXs.has(endColumn) ? Math.round(visibleColumnXs.get(endColumn) + visibleColumnWidths.get(endColumn)) - 0.5 : maxX;
1622
+ var endY = endRow <= bottom && visibleRowYs.has(endRow) ? Math.round(visibleRowYs.get(endRow) + visibleRowHeights.get(endRow)) - 0.5 : maxY;
1623
+ context.rect(_x7, _y9, endX - _x7, endY - _y9);
1624
+ } // draw the inner transparent fill
1648
1625
 
1649
- context.save();
1650
- context.shadowColor = shadowColor;
1651
- context.shadowBlur = shadowBlur;
1652
- context.fillStyle = backgroundColor;
1653
- context.fillRect(-gridX, y, width, rowHeight);
1654
- context.restore(); // Now set the clipping region and pretty much just redraw this row and all it's contents
1655
1626
 
1656
- context.beginPath();
1657
- context.rect(-gridX, y, width, rowHeight);
1627
+ context.fillStyle = theme.selectionColor;
1628
+ context.fill();
1629
+ /*
1630
+ draw an "inner stroke" that's clipped to just inside of the rects
1631
+ to act as a casing to the outer stroke. 3px width because 1px is outside
1632
+ the rect (but clipped), 1px is "on" the rect (technically this pixel is
1633
+ a half pixel clip as well due to rects offset, but we are immediately painting
1634
+ over it), and then the 1px inside (which is the desired pixel).
1635
+ */
1636
+
1637
+ context.save();
1658
1638
  context.clip();
1659
- context.font = font;
1660
- this.drawGridBackground(context, state);
1661
- this.drawCellContents(context, state); // Now translate it back up and draw the header
1639
+ context.strokeStyle = theme.selectionOutlineCasingColor;
1640
+ context.lineWidth = 3;
1641
+ context.stroke();
1642
+ context.restore(); // draw the outerstroke border on top of the inner stroke
1662
1643
 
1663
- context.translate(-gridX, -gridY);
1664
- context.font = headerFont;
1665
- this.drawRowHeaders(context, state);
1644
+ context.strokeStyle = theme.selectionOutlineColor;
1645
+ context.lineWidth = 1;
1646
+ context.stroke();
1647
+ }
1648
+
1649
+ if (isCursorVisible) {
1666
1650
  context.restore();
1651
+ this.drawActiveCell(context, state, column, row);
1667
1652
  }
1668
- }, {
1669
- key: "drawScrollBars",
1670
- value: function drawScrollBars(context, state) {
1671
- var isDraggingHorizontalScrollBar = state.isDraggingHorizontalScrollBar,
1672
- isDraggingVerticalScrollBar = state.isDraggingVerticalScrollBar,
1673
- isDragging = state.isDragging,
1674
- metrics = state.metrics,
1675
- mouseX = state.mouseX,
1676
- mouseY = state.mouseY,
1677
- theme = state.theme;
1678
-
1679
- if (theme.scrollBarSize <= 0) {
1680
- return;
1681
- }
1653
+ }
1682
1654
 
1683
- var rowHeaderWidth = metrics.rowHeaderWidth,
1684
- columnHeaderHeight = metrics.columnHeaderHeight,
1685
- width = metrics.width,
1686
- height = metrics.height,
1687
- handleHeight = metrics.handleHeight,
1688
- handleWidth = metrics.handleWidth,
1689
- scrollX = metrics.scrollX,
1690
- scrollY = metrics.scrollY,
1691
- hasHorizontalBar = metrics.hasHorizontalBar,
1692
- hasVerticalBar = metrics.hasVerticalBar,
1693
- barWidth = metrics.barWidth,
1694
- barHeight = metrics.barHeight;
1695
- var scrollBarBackgroundColor = theme.scrollBarBackgroundColor,
1696
- scrollBarHoverBackgroundColor = theme.scrollBarHoverBackgroundColor,
1697
- scrollBarCasingColor = theme.scrollBarCasingColor,
1698
- scrollBarCornerColor = theme.scrollBarCornerColor,
1699
- scrollBarColor = theme.scrollBarColor,
1700
- scrollBarHoverColor = theme.scrollBarHoverColor,
1701
- scrollBarActiveColor = theme.scrollBarActiveColor,
1702
- scrollBarSize = theme.scrollBarSize,
1703
- scrollBarHoverSize = theme.scrollBarHoverSize,
1704
- scrollBarCasingWidth = theme.scrollBarCasingWidth;
1705
- var isInbounds = mouseX <= width && mouseY <= height;
1706
- var isVerticalBarHover = isDraggingVerticalScrollBar || hasVerticalBar && !isDraggingHorizontalScrollBar && !isDragging && mouseX >= width - scrollBarHoverSize && mouseY <= barHeight + columnHeaderHeight && isInbounds;
1707
- var isHorizontalBarHover = isDraggingHorizontalScrollBar || hasHorizontalBar && !isDraggingVerticalScrollBar && !isDragging && !isVerticalBarHover && // vert bar gets priorty in overlapped corner hover area
1708
- mouseY >= height - scrollBarHoverSize && mouseX <= barWidth - rowHeaderWidth && isInbounds;
1709
- var hScrollBarSize = isHorizontalBarHover ? scrollBarHoverSize : scrollBarSize;
1710
- var vScrollBarSize = isVerticalBarHover ? scrollBarHoverSize : scrollBarSize;
1711
- context.translate(rowHeaderWidth, columnHeaderHeight);
1712
-
1713
- if (hasHorizontalBar && hasVerticalBar) {
1714
- // That little corner in the bottom right
1715
- context.fillStyle = scrollBarCasingColor;
1716
- context.fillRect(width - rowHeaderWidth - scrollBarSize, height - columnHeaderHeight - scrollBarSize, scrollBarSize, scrollBarSize);
1717
- context.fillStyle = scrollBarCornerColor;
1718
- context.fillRect(width - rowHeaderWidth - scrollBarSize + scrollBarCasingWidth, height - columnHeaderHeight - scrollBarSize + scrollBarCasingWidth, scrollBarSize - scrollBarCasingWidth, scrollBarSize - scrollBarCasingWidth);
1719
- }
1655
+ drawActiveCell(context, state, column, row) {
1656
+ var borderWidth = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : GridRenderer.ACTIVE_CELL_BORDER_WIDTH;
1657
+ var {
1658
+ metrics,
1659
+ theme
1660
+ } = state;
1661
+ var {
1662
+ visibleColumnWidths,
1663
+ visibleColumnXs,
1664
+ visibleRowHeights,
1665
+ visibleRowYs
1666
+ } = metrics;
1667
+ var cellX = visibleColumnXs.get(column);
1668
+ var cellY = visibleRowYs.get(row);
1669
+ var cellW = visibleColumnWidths.get(column);
1670
+ var cellH = visibleRowHeights.get(row); // Now get the outline for the active cell
1671
+
1672
+ var x = cellX - borderWidth * 0.5;
1673
+ var y = cellY - borderWidth * 0.5;
1674
+ var w = cellW + borderWidth;
1675
+ var h = cellH + borderWidth; // Make sure the outline is interior on the edge
1676
+
1677
+ if (x <= 0) {
1678
+ w += x - 1;
1679
+ x = 1;
1680
+ }
1720
1681
 
1721
- if (hasHorizontalBar) {
1722
- var x = scrollX;
1723
- var y = height - columnHeaderHeight - hScrollBarSize; // scrollbar casing
1682
+ if (y <= 0) {
1683
+ h += y - 1;
1684
+ y = 1;
1685
+ }
1724
1686
 
1725
- context.fillStyle = scrollBarCasingColor;
1726
- context.fillRect(0, y, barWidth, hScrollBarSize - scrollBarCasingWidth); // scrollbar track
1687
+ var {
1688
+ lineWidth
1689
+ } = context;
1690
+ context.beginPath();
1691
+ context.lineWidth = borderWidth;
1692
+ context.strokeStyle = theme.selectionOutlineColor;
1693
+ this.drawRoundedRect(context, x, y, w, h);
1694
+ context.stroke();
1695
+ context.lineWidth = lineWidth;
1696
+ }
1697
+ /**
1698
+ * Draws a rounded rectangle using the current state of the canvas.
1699
+ *
1700
+ * @param {CanvasRenderingContext2D} ctx
1701
+ * @param {number} x coordinate of the left side
1702
+ * @param {number} y coordinate of the top side
1703
+ * @param {number} w width of the rectangle
1704
+ * @param {number} h height of the rectangle
1705
+ * @param {number} r corner radius of the rectangle
1706
+ */
1707
+
1708
+
1709
+ drawRoundedRect(context, x, y, w, h) {
1710
+ var r = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : GridRenderer.DEFAULT_EDGE_RADIUS;
1711
+ context.beginPath();
1712
+ context.moveTo(x + r, y);
1713
+ context.lineTo(x + w - r, y);
1714
+ context.quadraticCurveTo(x + w, y, x + w, y + r);
1715
+ context.lineTo(x + w, y + h - r);
1716
+ context.quadraticCurveTo(x + w, y + h, x + w - r, y + h);
1717
+ context.lineTo(x + r, y + h);
1718
+ context.quadraticCurveTo(x, y + h, x, y + h - r);
1719
+ context.lineTo(x, y + r);
1720
+ context.quadraticCurveTo(x, y, x + r, y);
1721
+ context.closePath();
1722
+ }
1727
1723
 
1728
- context.fillStyle = isHorizontalBarHover ? scrollBarHoverBackgroundColor : scrollBarBackgroundColor;
1729
- context.fillRect(0, y + scrollBarCasingWidth, barWidth, hScrollBarSize - scrollBarCasingWidth); // scrollbar thumb
1724
+ drawDraggingColumn(context, state) {
1725
+ var {
1726
+ draggingColumn,
1727
+ draggingColumnOffset,
1728
+ metrics,
1729
+ mouseX,
1730
+ theme
1731
+ } = state;
1732
+
1733
+ if (draggingColumn == null) {
1734
+ return;
1735
+ }
1730
1736
 
1731
- if (isDraggingHorizontalScrollBar) {
1732
- context.fillStyle = scrollBarActiveColor;
1733
- } else if (isHorizontalBarHover) {
1734
- context.fillStyle = scrollBarHoverColor;
1735
- } else {
1736
- context.fillStyle = scrollBarColor;
1737
- }
1737
+ var {
1738
+ gridX,
1739
+ gridY,
1740
+ visibleColumnXs,
1741
+ visibleColumnWidths,
1742
+ height
1743
+ } = metrics;
1744
+ var x = visibleColumnXs.get(draggingColumn);
1745
+ var columnWidth = visibleColumnWidths.get(draggingColumn) + 1;
1746
+ var {
1747
+ backgroundColor,
1748
+ font,
1749
+ headerFont,
1750
+ reorderOffset,
1751
+ shadowBlur,
1752
+ shadowColor
1753
+ } = theme;
1754
+ context.save();
1755
+ context.translate(gridX, 0); // First, we need to draw over the row stripes where the column is coming from
1756
+
1757
+ context.fillStyle = backgroundColor;
1758
+ context.fillRect(x, 0, columnWidth, height);
1759
+ context.translate(mouseX - x - gridX - draggingColumnOffset, gridY + reorderOffset); // Then draw the shadow of the moving column
1760
+
1761
+ context.save();
1762
+ context.shadowColor = shadowColor;
1763
+ context.shadowBlur = shadowBlur;
1764
+ context.fillStyle = backgroundColor;
1765
+ context.fillRect(x, -gridY, columnWidth, height);
1766
+ context.restore(); // Now set the clipping region and pretty much just redraw this column and all it's contents
1767
+
1768
+ context.beginPath();
1769
+ context.rect(x, -gridY, columnWidth, height);
1770
+ context.clip();
1771
+ context.font = font;
1772
+ this.drawGridBackground(context, state);
1773
+ this.drawColumnCellContents(context, state, draggingColumn); // Now translate it back up and draw the header
1774
+
1775
+ context.translate(-gridX, -gridY);
1776
+ context.font = headerFont;
1777
+ this.drawColumnHeaders(context, state);
1778
+ context.restore();
1779
+ }
1738
1780
 
1739
- context.fillRect(x, y + scrollBarCasingWidth, handleWidth, hScrollBarSize - scrollBarCasingWidth);
1740
- }
1781
+ drawDraggingRow(context, state) {
1782
+ var {
1783
+ draggingRow,
1784
+ draggingRowOffset,
1785
+ metrics,
1786
+ mouseY,
1787
+ theme
1788
+ } = state;
1789
+
1790
+ if (draggingRow == null) {
1791
+ return;
1792
+ }
1741
1793
 
1742
- if (hasVerticalBar) {
1743
- var _x8 = width - rowHeaderWidth - vScrollBarSize;
1794
+ var {
1795
+ gridX,
1796
+ gridY,
1797
+ visibleRowYs,
1798
+ visibleRowHeights,
1799
+ width
1800
+ } = metrics;
1801
+ var y = visibleRowYs.get(draggingRow);
1802
+ var rowHeight = visibleRowHeights.get(draggingRow) + 1;
1803
+ var {
1804
+ backgroundColor,
1805
+ font,
1806
+ headerFont,
1807
+ reorderOffset,
1808
+ shadowBlur,
1809
+ shadowColor
1810
+ } = theme;
1811
+ context.save();
1812
+ context.translate(0, gridY); // First, we need to draw over the row stripes where the row is coming from
1813
+
1814
+ context.fillStyle = backgroundColor;
1815
+ context.fillRect(0, y, width, rowHeight);
1816
+ context.translate(gridX + reorderOffset, mouseY - y - gridY - draggingRowOffset); // Then draw the shadow of the moving row
1817
+
1818
+ context.save();
1819
+ context.shadowColor = shadowColor;
1820
+ context.shadowBlur = shadowBlur;
1821
+ context.fillStyle = backgroundColor;
1822
+ context.fillRect(-gridX, y, width, rowHeight);
1823
+ context.restore(); // Now set the clipping region and pretty much just redraw this row and all it's contents
1824
+
1825
+ context.beginPath();
1826
+ context.rect(-gridX, y, width, rowHeight);
1827
+ context.clip();
1828
+ context.font = font;
1829
+ this.drawGridBackground(context, state);
1830
+ this.drawCellContents(context, state); // Now translate it back up and draw the header
1831
+
1832
+ context.translate(-gridX, -gridY);
1833
+ context.font = headerFont;
1834
+ this.drawRowHeaders(context, state);
1835
+ context.restore();
1836
+ }
1744
1837
 
1745
- var _y10 = scrollY; // scrollbar casing
1838
+ drawScrollBars(context, state) {
1839
+ var {
1840
+ isDraggingHorizontalScrollBar,
1841
+ isDraggingVerticalScrollBar,
1842
+ isDragging,
1843
+ metrics,
1844
+ mouseX,
1845
+ mouseY,
1846
+ theme
1847
+ } = state;
1848
+
1849
+ if (theme.scrollBarSize <= 0) {
1850
+ return;
1851
+ }
1746
1852
 
1747
- context.fillStyle = scrollBarCasingColor;
1748
- context.fillRect(_x8, 0, vScrollBarSize - scrollBarCasingWidth, barHeight); // scrollbar track
1853
+ var {
1854
+ rowHeaderWidth,
1855
+ columnHeaderHeight,
1856
+ width,
1857
+ height,
1858
+ handleHeight,
1859
+ handleWidth,
1860
+ scrollX,
1861
+ scrollY,
1862
+ hasHorizontalBar,
1863
+ hasVerticalBar,
1864
+ barWidth,
1865
+ barHeight
1866
+ } = metrics;
1867
+ var {
1868
+ scrollBarBackgroundColor,
1869
+ scrollBarHoverBackgroundColor,
1870
+ scrollBarCasingColor,
1871
+ scrollBarCornerColor,
1872
+ scrollBarColor,
1873
+ scrollBarHoverColor,
1874
+ scrollBarActiveColor,
1875
+ scrollBarSize,
1876
+ scrollBarHoverSize,
1877
+ scrollBarCasingWidth
1878
+ } = theme;
1879
+ var isInbounds = mouseX <= width && mouseY <= height;
1880
+ var isVerticalBarHover = isDraggingVerticalScrollBar || hasVerticalBar && !isDraggingHorizontalScrollBar && !isDragging && mouseX >= width - scrollBarHoverSize && mouseY <= barHeight + columnHeaderHeight && isInbounds;
1881
+ var isHorizontalBarHover = isDraggingHorizontalScrollBar || hasHorizontalBar && !isDraggingVerticalScrollBar && !isDragging && !isVerticalBarHover && // vert bar gets priorty in overlapped corner hover area
1882
+ mouseY >= height - scrollBarHoverSize && mouseX <= barWidth - rowHeaderWidth && isInbounds;
1883
+ var hScrollBarSize = isHorizontalBarHover ? scrollBarHoverSize : scrollBarSize;
1884
+ var vScrollBarSize = isVerticalBarHover ? scrollBarHoverSize : scrollBarSize;
1885
+ context.translate(rowHeaderWidth, columnHeaderHeight);
1886
+
1887
+ if (hasHorizontalBar && hasVerticalBar) {
1888
+ // That little corner in the bottom right
1889
+ context.fillStyle = scrollBarCasingColor;
1890
+ context.fillRect(width - rowHeaderWidth - scrollBarSize, height - columnHeaderHeight - scrollBarSize, scrollBarSize, scrollBarSize);
1891
+ context.fillStyle = scrollBarCornerColor;
1892
+ context.fillRect(width - rowHeaderWidth - scrollBarSize + scrollBarCasingWidth, height - columnHeaderHeight - scrollBarSize + scrollBarCasingWidth, scrollBarSize - scrollBarCasingWidth, scrollBarSize - scrollBarCasingWidth);
1893
+ }
1749
1894
 
1750
- context.fillStyle = isVerticalBarHover ? scrollBarHoverBackgroundColor : scrollBarBackgroundColor;
1751
- context.fillRect(_x8 + scrollBarCasingWidth, 0, vScrollBarSize - scrollBarCasingWidth, barHeight); // scrollbar thumb
1895
+ if (hasHorizontalBar) {
1896
+ var x = scrollX;
1897
+ var y = height - columnHeaderHeight - hScrollBarSize; // scrollbar casing
1752
1898
 
1753
- if (isDraggingVerticalScrollBar) {
1754
- context.fillStyle = scrollBarActiveColor;
1755
- } else if (isVerticalBarHover) {
1756
- context.fillStyle = scrollBarHoverColor;
1757
- } else {
1758
- context.fillStyle = scrollBarColor;
1759
- }
1899
+ context.fillStyle = scrollBarCasingColor;
1900
+ context.fillRect(0, y, barWidth, hScrollBarSize - scrollBarCasingWidth); // scrollbar track
1760
1901
 
1761
- context.fillRect(_x8 + scrollBarCasingWidth, _y10, vScrollBarSize - scrollBarCasingWidth, handleHeight);
1762
- }
1902
+ context.fillStyle = isHorizontalBarHover ? scrollBarHoverBackgroundColor : scrollBarBackgroundColor;
1903
+ context.fillRect(0, y + scrollBarCasingWidth, barWidth, hScrollBarSize - scrollBarCasingWidth); // scrollbar thumb
1763
1904
 
1764
- context.translate(-rowHeaderWidth, -columnHeaderHeight);
1765
- }
1766
- }], [{
1767
- key: "truncate",
1768
- value:
1769
- /**
1770
- * Truncate a string and add ellipses if necessary
1771
- * @param {string} str The string to truncate
1772
- * @param {number} len The length to truncate the string to. If longer than the actual string, just returns the string
1773
- */
1774
- function truncate(str, len) {
1775
- if (len < str.length) {
1776
- // eslint-disable-next-line prefer-template
1777
- return str.substr(0, len) + '…';
1905
+ if (isDraggingHorizontalScrollBar) {
1906
+ context.fillStyle = scrollBarActiveColor;
1907
+ } else if (isHorizontalBarHover) {
1908
+ context.fillStyle = scrollBarHoverColor;
1909
+ } else {
1910
+ context.fillStyle = scrollBarColor;
1778
1911
  }
1779
1912
 
1780
- return str;
1913
+ context.fillRect(x, y + scrollBarCasingWidth, handleWidth, hScrollBarSize - scrollBarCasingWidth);
1781
1914
  }
1782
- /**
1783
- * Uses binary search to truncate a string to fit in the provided width
1784
- * @param {Context} context The drawing context to measure the text in
1785
- * @param {string} str The string to get the maximum length it can draw
1786
- * @param {number} width The width to truncate it to
1787
- * @param {number} start The low boundary to start the search
1788
- * @param {number} end The high boundary to start the search
1789
- */
1790
-
1791
- }, {
1792
- key: "binaryTruncateToWidth",
1793
- value: function binaryTruncateToWidth(context, str, width) {
1794
- var start = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 0;
1795
- var end = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : str.length;
1796
-
1797
- if (end >= str.length && context.measureText(str).width <= width) {
1798
- // IDS-6069 If the whole string can fit, don't bother checking for truncation
1799
- // The ellipses are actually slightly wider than other chars, and it's possible
1800
- // that the "truncation" ends up being slightly longer, which messes up the search
1801
- // algorithm below.
1802
- // Besides, if we already fit, it's just faster to not bother checking other truncations.
1803
- return str;
1804
- }
1805
1915
 
1806
- var lo = start;
1807
- var hi = Math.min(str.length - 1, end);
1808
- var result = str;
1916
+ if (hasVerticalBar) {
1917
+ var _x8 = width - rowHeaderWidth - vScrollBarSize;
1809
1918
 
1810
- while (hi > lo) {
1811
- var mid = Math.ceil((hi + lo) / 2);
1812
- var truncatedStr = GridRenderer.truncate(str, mid);
1919
+ var _y10 = scrollY; // scrollbar casing
1813
1920
 
1814
- if (context.measureText(truncatedStr).width <= width) {
1815
- result = truncatedStr;
1921
+ context.fillStyle = scrollBarCasingColor;
1922
+ context.fillRect(_x8, 0, vScrollBarSize - scrollBarCasingWidth, barHeight); // scrollbar track
1816
1923
 
1817
- if (lo === mid) {
1818
- break;
1819
- }
1924
+ context.fillStyle = isVerticalBarHover ? scrollBarHoverBackgroundColor : scrollBarBackgroundColor;
1925
+ context.fillRect(_x8 + scrollBarCasingWidth, 0, vScrollBarSize - scrollBarCasingWidth, barHeight); // scrollbar thumb
1820
1926
 
1821
- lo = mid;
1822
- } else {
1823
- hi = mid - 1;
1824
- }
1825
- }
1826
-
1827
- return result;
1828
- }
1829
- /**
1830
- * Truncate a string (if necessary) to fit in the specified width.
1831
- * First uses the estimated font width to calculate a lower/upper bound
1832
- * Then uses binary search within those bounds to find the exact max length
1833
- * @param {Context} context The drawing context
1834
- * @param {string} str The string to calculate max length for
1835
- * @param {number} width The width to truncate within
1836
- * @param {number} fontWidth The estimated width of each character
1837
- */
1838
-
1839
- }, {
1840
- key: "truncateToWidth",
1841
- value: function truncateToWidth(context, str, width) {
1842
- var fontWidth = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : GridRenderer.DEFAULT_FONT_WIDTH;
1843
-
1844
- if (width <= 0 || str.length <= 0) {
1845
- return null;
1927
+ if (isDraggingVerticalScrollBar) {
1928
+ context.fillStyle = scrollBarActiveColor;
1929
+ } else if (isVerticalBarHover) {
1930
+ context.fillStyle = scrollBarHoverColor;
1931
+ } else {
1932
+ context.fillStyle = scrollBarColor;
1846
1933
  }
1847
1934
 
1848
- var lo = Math.min(Math.floor(width / fontWidth / 2), str.length);
1849
- var hi = Math.min(Math.ceil(width / fontWidth * 2), str.length);
1850
- return GridRenderer.binaryTruncateToWidth(context, str, width, lo, hi);
1935
+ context.fillRect(_x8 + scrollBarCasingWidth, _y10, vScrollBarSize - scrollBarCasingWidth, handleHeight);
1851
1936
  }
1852
- }]);
1853
1937
 
1854
- return GridRenderer;
1855
- }();
1938
+ context.translate(-rowHeaderWidth, -columnHeaderHeight);
1939
+ }
1940
+
1941
+ }
1856
1942
 
1857
1943
  _defineProperty(GridRenderer, "DEFAULT_FONT_WIDTH", 10);
1858
1944