@deephaven/grid 0.4.1-modules.0 → 0.5.2-beta.0

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 (74) hide show
  1. package/dist/CellInputField.js +88 -40
  2. package/dist/CellInputField.js.map +1 -1
  3. package/dist/Grid.js +1484 -1449
  4. package/dist/Grid.js.map +1 -1
  5. package/dist/GridColorUtils.js +51 -18
  6. package/dist/GridColorUtils.js.map +1 -1
  7. package/dist/GridMetricCalculator.js +994 -1017
  8. package/dist/GridMetricCalculator.js.map +1 -1
  9. package/dist/GridModel.js +286 -171
  10. package/dist/GridModel.js.map +1 -1
  11. package/dist/GridMouseHandler.js +59 -39
  12. package/dist/GridMouseHandler.js.map +1 -1
  13. package/dist/GridRange.js +630 -572
  14. package/dist/GridRange.js.map +1 -1
  15. package/dist/GridRenderer.d.ts.map +1 -1
  16. package/dist/GridRenderer.js +1564 -1650
  17. package/dist/GridRenderer.js.map +1 -1
  18. package/dist/GridTestUtils.js +29 -15
  19. package/dist/GridTestUtils.js.map +1 -1
  20. package/dist/GridUtils.js +717 -679
  21. package/dist/GridUtils.js.map +1 -1
  22. package/dist/KeyHandler.js +18 -6
  23. package/dist/KeyHandler.js.map +1 -1
  24. package/dist/MockGridModel.js +210 -105
  25. package/dist/MockGridModel.js.map +1 -1
  26. package/dist/MockTreeGridModel.js +183 -113
  27. package/dist/MockTreeGridModel.js.map +1 -1
  28. package/dist/errors/PasteError.js +44 -5
  29. package/dist/errors/PasteError.js.map +1 -1
  30. package/dist/errors/index.js +1 -1
  31. package/dist/errors/index.js.map +1 -1
  32. package/dist/index.js +15 -15
  33. package/dist/index.js.map +1 -1
  34. package/dist/key-handlers/EditKeyHandler.js +75 -42
  35. package/dist/key-handlers/EditKeyHandler.js.map +1 -1
  36. package/dist/key-handlers/PasteKeyHandler.js +78 -42
  37. package/dist/key-handlers/PasteKeyHandler.js.map +1 -1
  38. package/dist/key-handlers/SelectionKeyHandler.js +234 -220
  39. package/dist/key-handlers/SelectionKeyHandler.js.map +1 -1
  40. package/dist/key-handlers/TreeKeyHandler.js +72 -42
  41. package/dist/key-handlers/TreeKeyHandler.js.map +1 -1
  42. package/dist/key-handlers/index.js +4 -4
  43. package/dist/key-handlers/index.js.map +1 -1
  44. package/dist/memoizeClear.js +1 -1
  45. package/dist/memoizeClear.js.map +1 -1
  46. package/dist/mouse-handlers/EditMouseHandler.js +50 -18
  47. package/dist/mouse-handlers/EditMouseHandler.js.map +1 -1
  48. package/dist/mouse-handlers/GridColumnMoveMouseHandler.js +163 -141
  49. package/dist/mouse-handlers/GridColumnMoveMouseHandler.js.map +1 -1
  50. package/dist/mouse-handlers/GridColumnSeparatorMouseHandler.js +86 -47
  51. package/dist/mouse-handlers/GridColumnSeparatorMouseHandler.js.map +1 -1
  52. package/dist/mouse-handlers/GridHorizontalScrollBarMouseHandler.d.ts.map +1 -1
  53. package/dist/mouse-handlers/GridHorizontalScrollBarMouseHandler.js +171 -143
  54. package/dist/mouse-handlers/GridHorizontalScrollBarMouseHandler.js.map +1 -1
  55. package/dist/mouse-handlers/GridRowMoveMouseHandler.js +147 -125
  56. package/dist/mouse-handlers/GridRowMoveMouseHandler.js.map +1 -1
  57. package/dist/mouse-handlers/GridRowSeparatorMouseHandler.js +86 -47
  58. package/dist/mouse-handlers/GridRowSeparatorMouseHandler.js.map +1 -1
  59. package/dist/mouse-handlers/GridRowTreeMouseHandler.js +76 -46
  60. package/dist/mouse-handlers/GridRowTreeMouseHandler.js.map +1 -1
  61. package/dist/mouse-handlers/GridScrollBarCornerMouseHandler.d.ts.map +1 -1
  62. package/dist/mouse-handlers/GridScrollBarCornerMouseHandler.js +62 -31
  63. package/dist/mouse-handlers/GridScrollBarCornerMouseHandler.js.map +1 -1
  64. package/dist/mouse-handlers/GridSelectionMouseHandler.js +222 -200
  65. package/dist/mouse-handlers/GridSelectionMouseHandler.js.map +1 -1
  66. package/dist/mouse-handlers/GridSeparatorMouseHandler.js +253 -206
  67. package/dist/mouse-handlers/GridSeparatorMouseHandler.js.map +1 -1
  68. package/dist/mouse-handlers/GridVerticalScrollBarMouseHandler.d.ts.map +1 -1
  69. package/dist/mouse-handlers/GridVerticalScrollBarMouseHandler.js +172 -144
  70. package/dist/mouse-handlers/GridVerticalScrollBarMouseHandler.js.map +1 -1
  71. package/dist/mouse-handlers/index.js +10 -10
  72. package/dist/mouse-handlers/index.js.map +1 -1
  73. package/dist/tsconfig.tsbuildinfo +1 -1
  74. package/package.json +4 -5
@@ -1,8 +1,26 @@
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
+
1
19
  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; }
2
20
 
3
- import memoizeClear from "./memoizeClear.js";
4
- import GridUtils from "./GridUtils.js";
5
- import GridColorUtils from "./GridColorUtils.js";
21
+ import memoizeClear from './memoizeClear';
22
+ import GridUtils from './GridUtils';
23
+ import GridColorUtils from './GridColorUtils';
6
24
  /* eslint react/destructuring-assignment: "off" */
7
25
 
8
26
  /* eslint class-methods-use-this: "off" */
@@ -15,1930 +33,1826 @@ import GridColorUtils from "./GridColorUtils.js";
15
33
  * your own methods to customize drawing of the grid (eg. Draw icons or special features)
16
34
  */
17
35
 
18
- class GridRenderer {
19
- constructor() {
20
- _defineProperty(this, "getCachedTruncatedString", memoizeClear((context, text, width, fontWidth) => GridRenderer.truncateToWidth(context, text, width, fontWidth), {
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
+ }, {
21
43
  max: 10000
22
44
  }));
23
45
 
24
- _defineProperty(this, "getCachedBackgroundColors", memoizeClear((backgroundColors, maxDepth) => backgroundColors.split(' ').map(color => {
25
- var colors = [];
46
+ _defineProperty(this, "getCachedBackgroundColors", memoizeClear(function (backgroundColors, maxDepth) {
47
+ return backgroundColors.split(' ').map(function (color) {
48
+ var colors = [];
26
49
 
27
- for (var i = 0; i < maxDepth; i += 1) {
28
- colors.push(GridColorUtils.darkenForDepth(color, i, maxDepth));
29
- }
50
+ for (var i = 0; i < maxDepth; i += 1) {
51
+ colors.push(GridColorUtils.darkenForDepth(color, i, maxDepth));
52
+ }
30
53
 
31
- return colors;
32
- }), {
54
+ return colors;
55
+ });
56
+ }, {
33
57
  max: 1000
34
58
  }));
35
59
 
36
- _defineProperty(this, "getCachedColorWithAlpha", memoizeClear((color, alpha) => GridColorUtils.colorWithAlpha(color, alpha), {
60
+ _defineProperty(this, "getCachedColorWithAlpha", memoizeClear(function (color, alpha) {
61
+ return GridColorUtils.colorWithAlpha(color, alpha);
62
+ }, {
37
63
  max: 1000
38
64
  }));
39
65
  }
40
66
 
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) + '…';
50
- }
51
-
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;
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();
75
87
  }
76
-
77
- var lo = start;
78
- var hi = Math.min(str.length - 1, end);
79
- var result = str;
80
-
81
- while (hi > lo) {
82
- var mid = Math.ceil((hi + lo) / 2);
83
- var truncatedStr = GridRenderer.truncate(str, mid);
84
-
85
- if (context.measureText(truncatedStr).width <= width) {
86
- result = truncatedStr;
87
-
88
- if (lo === mid) {
89
- break;
90
- }
91
-
92
- lo = mid;
93
- } else {
94
- hi = mid - 1;
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;
95
138
  }
96
- }
97
-
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
- }
117
139
 
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
- }
144
-
145
- configureContext(context, state) {
146
- var {
147
- theme
148
- } = state;
149
- context.font = theme.font;
150
- context.textBaseline = 'middle';
151
- context.lineCap = 'butt';
152
- }
140
+ if (theme.floatingRowBackgroundColors) {
141
+ this.drawRowStripesForRows(context, state, floatingRows, theme.floatingRowBackgroundColors);
142
+ }
153
143
 
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
- }
144
+ if (draggingRow == null && draggingColumn == null) {
145
+ this.drawFloatingMouseRowHover(context, state);
146
+ }
166
147
 
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
- }
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...
184
151
 
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
- }
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
+ }
205
159
 
206
- if (theme.floatingRowBackgroundColors) {
207
- this.drawRowStripesForRows(context, state, floatingRows, theme.floatingRowBackgroundColors);
208
- }
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...
209
168
 
210
- if (draggingRow == null && draggingColumn == null) {
211
- this.drawFloatingMouseRowHover(context, state);
212
- }
213
169
 
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...
170
+ for (var c = 0; c < visibleColumns.length; c += 1) {
171
+ var column = visibleColumns[c];
217
172
 
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);
173
+ for (var r = 0; r < floatingRows.length; r += 1) {
174
+ var row = floatingRows[r];
175
+ this.drawCellContent(context, state, column, row);
176
+ }
177
+ }
224
178
  }
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
+ }
225
202
 
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...
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
+ }
234
207
 
208
+ if (draggingRow == null && draggingColumn == null) {
209
+ this.drawFloatingMouseRowHover(context, state);
210
+ }
235
211
 
236
- for (var c = 0; c < visibleColumns.length; c += 1) {
237
- var column = visibleColumns[c];
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...
238
215
 
239
- for (var r = 0; r < floatingRows.length; r += 1) {
240
- var row = floatingRows[r];
241
- this.drawCellContent(context, state, column, row);
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);
242
222
  }
243
- }
244
- }
245
-
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
- }
271
223
 
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
- }
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...
276
232
 
277
- if (draggingRow == null && draggingColumn == null) {
278
- this.drawFloatingMouseRowHover(context, state);
279
- }
280
233
 
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...
234
+ for (var c = 0; c < floatingColumns.length; c += 1) {
235
+ var column = floatingColumns[c];
284
236
 
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);
237
+ for (var r = 0; r < visibleRows.length; r += 1) {
238
+ var row = visibleRows[r];
239
+ this.drawCellContent(context, state, column, row);
240
+ }
241
+ }
291
242
  }
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;
292
265
 
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...
301
-
302
-
303
- for (var c = 0; c < floatingColumns.length; c += 1) {
304
- var column = floatingColumns[c];
305
-
306
- for (var r = 0; r < visibleRows.length; r += 1) {
307
- var row = visibleRows[r];
308
- this.drawCellContent(context, state, column, row);
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);
309
270
  }
310
- }
311
- }
312
271
 
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);
344
- }
272
+ if (floatingBottomRowCount > 0) {
273
+ var _y = visibleRowYs.get(rowCount - floatingBottomRowCount) - 0.5;
345
274
 
346
- if (floatingBottomRowCount > 0) {
347
- var _y = visibleRowYs.get(rowCount - floatingBottomRowCount) - 0.5;
275
+ context.moveTo(0.5, _y);
276
+ context.lineTo(maxX - 0.5, _y);
277
+ }
348
278
 
349
- context.moveTo(0.5, _y);
350
- context.lineTo(maxX - 0.5, _y);
351
- }
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
+ }
352
284
 
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
- }
285
+ if (floatingRightColumnCount > 0) {
286
+ var _x = visibleColumnXs.get(columnCount - floatingRightColumnCount) - 0.5;
358
287
 
359
- if (floatingRightColumnCount > 0) {
360
- var _x = visibleColumnXs.get(columnCount - floatingRightColumnCount) - 0.5;
288
+ context.moveTo(_x, 0.5);
289
+ context.lineTo(_x, maxY - 0.5);
290
+ }
361
291
 
362
- context.moveTo(_x, 0.5);
363
- context.lineTo(_x, maxY - 0.5);
364
- }
292
+ context.stroke();
293
+ context.beginPath();
294
+ context.lineWidth = 1;
295
+ context.strokeStyle = floatingDividerInnerColor;
365
296
 
366
- context.stroke();
367
- context.beginPath();
368
- context.lineWidth = 1;
369
- context.strokeStyle = floatingDividerInnerColor;
297
+ if (floatingTopRowCount > 0) {
298
+ var _y2 = visibleRowYs.get(floatingTopRowCount - 1) + visibleRowHeights.get(floatingTopRowCount - 1) + 0.5;
370
299
 
371
- if (floatingTopRowCount > 0) {
372
- var _y2 = visibleRowYs.get(floatingTopRowCount - 1) + visibleRowHeights.get(floatingTopRowCount - 1) + 0.5;
300
+ context.moveTo(0.5, _y2);
301
+ context.lineTo(maxX - 0.5, _y2);
302
+ }
373
303
 
374
- context.moveTo(0.5, _y2);
375
- context.lineTo(maxX - 0.5, _y2);
376
- }
304
+ if (floatingBottomRowCount > 0) {
305
+ var _y3 = visibleRowYs.get(rowCount - floatingBottomRowCount) - 0.5;
377
306
 
378
- if (floatingBottomRowCount > 0) {
379
- var _y3 = visibleRowYs.get(rowCount - floatingBottomRowCount) - 0.5;
307
+ context.moveTo(0.5, _y3);
308
+ context.lineTo(maxX - 0.5, _y3);
309
+ }
380
310
 
381
- context.moveTo(0.5, _y3);
382
- context.lineTo(maxX - 0.5, _y3);
383
- }
311
+ if (floatingLeftColumnCount > 0) {
312
+ var _x2 = visibleColumnXs.get(floatingLeftColumnCount - 1) + visibleColumnWidths.get(floatingLeftColumnCount - 1) + 0.5;
384
313
 
385
- if (floatingLeftColumnCount > 0) {
386
- var _x2 = visibleColumnXs.get(floatingLeftColumnCount - 1) + visibleColumnWidths.get(floatingLeftColumnCount - 1) + 0.5;
314
+ context.moveTo(_x2, 0.5);
315
+ context.lineTo(_x2, maxY - 0.5);
316
+ }
387
317
 
388
- context.moveTo(_x2, 0.5);
389
- context.lineTo(_x2, maxY - 0.5);
390
- }
318
+ if (floatingRightColumnCount > 0) {
319
+ var _x3 = visibleColumnXs.get(columnCount - floatingRightColumnCount) - 0.5;
391
320
 
392
- if (floatingRightColumnCount > 0) {
393
- var _x3 = visibleColumnXs.get(columnCount - floatingRightColumnCount) - 0.5;
321
+ context.moveTo(_x3, 0.5);
322
+ context.lineTo(_x3, maxY - 0.5);
323
+ }
394
324
 
395
- context.moveTo(_x3, 0.5);
396
- context.lineTo(_x3, maxY - 0.5);
325
+ context.stroke();
397
326
  }
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);
398
332
 
399
- context.stroke();
400
- }
333
+ if (drawHover) {
334
+ this.drawMouseColumnHover(context, state);
335
+ this.drawMouseRowHover(context, state);
336
+ }
401
337
 
402
- drawGridBackground(context, state) {
403
- var drawHover = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
404
- this.drawRowStripes(context, state);
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
+ }
405
375
 
406
- if (drawHover) {
407
- this.drawMouseColumnHover(context, state);
408
- this.drawMouseRowHover(context, state);
409
- }
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
+ }
410
406
 
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
- }
407
+ colorRowMap.get(color).push(row);
441
408
 
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
- }
409
+ if (rowAbove != null) {
410
+ var depthAbove = model.depthForRow(rowAbove);
457
411
 
458
- this.drawRowStripesForRows(context, state, visibleRows, rowBackgroundColors);
459
- }
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
460
419
 
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)];
489
420
 
490
- if (!colorRowMap.has(color)) {
491
- colorRowMap.set(color, []);
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);
492
425
  }
493
426
 
494
- colorRowMap.get(color).push(row);
495
-
496
- if (rowAbove != null) {
497
- var depthAbove = model.depthForRow(rowAbove);
427
+ colorRowMap.forEach(function (colorRows, color) {
428
+ context.fillStyle = color;
429
+ context.beginPath();
498
430
 
499
- if (depthAbove < depth) {
500
- topShadowRows.push(row);
501
- } else if (depthAbove > depth) {
502
- bottomShadowRows.push(rowAbove);
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);
503
436
  }
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);
512
- }
513
437
 
514
- colorRowMap.forEach((colorRows, color) => {
515
- context.fillStyle = color;
516
- context.beginPath();
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
+ }
517
458
 
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);
459
+ context.restore();
523
460
  }
524
461
 
525
- context.fill();
526
- });
527
-
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
462
+ if (bottomShadowRows.length > 0) {
463
+ context.save();
540
464
 
541
- context.translate(0, y);
542
- context.fillRect(minX, 0, maxX, shadowBlur);
543
- context.translate(0, -y);
544
- }
465
+ var _startColor = this.getCachedColorWithAlpha(shadowColor, 0);
545
466
 
546
- context.restore();
547
- }
467
+ var _endColor = this.getCachedColorWithAlpha(shadowColor, 0.15);
548
468
 
549
- if (bottomShadowRows.length > 0) {
550
- context.save();
469
+ var _gradient = context.createLinearGradient(0, 0, 0, shadowBlur);
551
470
 
552
- var _startColor = this.getCachedColorWithAlpha(shadowColor, 0);
471
+ _gradient.addColorStop(0, _startColor);
553
472
 
554
- var _endColor = this.getCachedColorWithAlpha(shadowColor, 0.15);
473
+ _gradient.addColorStop(1, _endColor);
555
474
 
556
- var _gradient = context.createLinearGradient(0, 0, 0, shadowBlur);
475
+ context.fillStyle = _gradient;
557
476
 
558
- _gradient.addColorStop(0, _startColor);
477
+ for (var _i3 = 0; _i3 < bottomShadowRows.length; _i3 += 1) {
478
+ var _row3 = bottomShadowRows[_i3];
559
479
 
560
- _gradient.addColorStop(1, _endColor);
480
+ var _y4 = visibleRowYs.get(_row3);
561
481
 
562
- context.fillStyle = _gradient;
482
+ var rowHeight = visibleRowHeights.get(_row3);
483
+ var gradientY = _y4 + rowHeight - shadowBlur; // Use a translate so we can reuse the gradient
563
484
 
564
- for (var _i3 = 0; _i3 < bottomShadowRows.length; _i3 += 1) {
565
- var _row3 = bottomShadowRows[_i3];
485
+ context.translate(0, gradientY);
486
+ context.fillRect(minX, 0, maxX, shadowBlur);
487
+ context.translate(0, -gradientY);
488
+ }
566
489
 
567
- var _y4 = visibleRowYs.get(_row3);
490
+ context.restore();
491
+ }
492
+ }
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
+ }
568
505
 
569
- var rowHeight = visibleRowHeights.get(_row3);
570
- var gradientY = _y4 + rowHeight - shadowBlur; // Use a translate so we can reuse the gradient
506
+ var visibleColumnWidths = metrics.visibleColumnWidths,
507
+ visibleColumnXs = metrics.visibleColumnXs,
508
+ maxY = metrics.maxY;
571
509
 
572
- context.translate(0, gradientY);
573
- context.fillRect(minX, 0, maxX, shadowBlur);
574
- context.translate(0, -gradientY);
510
+ if (mouseY > maxY) {
511
+ return;
575
512
  }
576
513
 
577
- context.restore();
578
- }
579
- }
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
+ }
580
531
 
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;
592
- }
532
+ var mouseRow = GridUtils.getRowAtY(mouseY, metrics);
593
533
 
594
- var {
595
- visibleColumnWidths,
596
- visibleColumnXs,
597
- maxY
598
- } = metrics;
534
+ if (mouseRow == null) {
535
+ return;
536
+ }
599
537
 
600
- if (mouseY > maxY) {
601
- return;
538
+ this.drawMouseRowHoverForRow(context, state, mouseRow);
602
539
  }
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
+ }
603
556
 
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
- }
557
+ var mouseRow = GridUtils.getRowAtY(mouseY, metrics);
609
558
 
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;
559
+ if (mouseRow != null && (mouseRow < floatingTopRowCount || rowCount - floatingBottomRowCount <= mouseRow)) {
560
+ this.drawMouseRowHoverForRow(context, state, mouseRow);
561
+ }
623
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;
624
575
 
625
- var mouseRow = GridUtils.getRowAtY(mouseY, metrics);
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
+ }
626
582
 
627
- if (mouseRow == null) {
628
- return;
629
- }
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
+ }
630
600
 
631
- this.drawMouseRowHoverForRow(context, state, mouseRow);
632
- }
601
+ context.lineWidth = 1;
602
+ context.beginPath();
633
603
 
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
- }
604
+ if (columnColor) {
605
+ context.strokeStyle = columnColor;
606
+ this.drawGridLinesForColumns(context, state, columns);
607
+ }
652
608
 
653
- var mouseRow = GridUtils.getRowAtY(mouseY, metrics);
609
+ if (rowColor) {
610
+ context.strokeStyle = rowColor;
611
+ this.drawGridLinesForRows(context, state, rows);
612
+ }
654
613
 
655
- if (mouseRow != null && (mouseRow < floatingTopRowCount || rowCount - floatingBottomRowCount <= mouseRow)) {
656
- this.drawMouseRowHoverForRow(context, state, mouseRow);
614
+ context.stroke();
657
615
  }
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;
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);
679
628
  }
680
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();
681
656
 
682
- context.fillRect(0, y, maxX, rowHeight);
683
- }
657
+ for (var i = 0; i < columns.length; i += 1) {
658
+ var column = columns[i];
684
659
 
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
- }
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
+ }
665
+ }
696
666
 
697
- drawGridLinesForItems(context, state, columns, rows, columnColor, rowColor) {
698
- if (!columnColor && !rowColor) {
699
- return;
667
+ context.restore();
700
668
  }
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
+ }
701
696
 
702
- context.lineWidth = 1;
703
- context.beginPath();
704
-
705
- if (columnColor) {
706
- context.strokeStyle = columnColor;
707
- this.drawGridLinesForColumns(context, state, columns);
697
+ if (isFirstColumn && hasExpandableRows) {
698
+ this.drawCellRowTreeDepthLines(context, state, row, rowAfter);
699
+ }
708
700
  }
701
+ }, {
702
+ key: "drawCellContents",
703
+ value: function drawCellContents(context, state) {
704
+ var metrics = state.metrics;
705
+ var visibleColumns = metrics.visibleColumns;
709
706
 
710
- if (rowColor) {
711
- context.strokeStyle = rowColor;
712
- this.drawGridLinesForRows(context, state, rows);
707
+ for (var i = 0; i < visibleColumns.length; i += 1) {
708
+ var column = visibleColumns[i];
709
+ this.drawColumnCellContents(context, state, column);
710
+ }
713
711
  }
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();
714
726
 
715
- context.stroke();
716
- }
717
-
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);
732
- }
733
- }
727
+ for (var i = 0; i < visibleRows.length; i += 1) {
728
+ var row = visibleRows[i];
729
+ this.drawCellContent(context, state, column, row);
730
+ }
734
731
 
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);
732
+ context.restore();
749
733
  }
750
- }
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
+ }
751
772
 
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
- }
773
+ var textWidth = columnWidth - treeIndent;
774
+ var textX = x + cellHorizontalPadding;
775
+ var textY = y + rowHeight * 0.5;
762
776
 
763
- drawCellBackgroundsForItems(context, state, columns, rows) {
764
- context.save();
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
+ }
765
784
 
766
- for (var i = 0; i < columns.length; i += 1) {
767
- var column = columns[i];
785
+ textX += treeIndent;
786
+ var fontWidth = fontWidths.get(context.font);
787
+ var truncatedText = this.getCachedTruncatedString(context, text, textWidth - cellHorizontalPadding * 2, fontWidth);
768
788
 
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);
789
+ if (truncatedText != null) {
790
+ context.fillText(truncatedText, textX, textY);
791
+ }
773
792
  }
774
- }
775
793
 
776
- context.restore();
777
- }
778
-
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
- }
810
-
811
- if (isFirstColumn && hasExpandableRows) {
812
- this.drawCellRowTreeDepthLines(context, state, row, rowAfter);
794
+ if (isFirstColumn && hasExpandableRows) {
795
+ this.drawCellRowTreeMarker(context, state, row);
796
+ }
813
797
  }
814
- }
815
-
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);
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);
827
+ }
827
828
  }
828
- }
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();
829
870
 
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
- }
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
+ }
851
876
 
852
- context.restore();
853
- }
877
+ context.stroke();
878
+ } // draw as hockey stick if last row at depth
854
879
 
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;
895
880
 
896
- if (hasExpandableRows && isFirstColumn) {
897
- treeIndent = treeDepthIndent * (model.depthForRow(row) + 1) + treeHorizontalPadding;
898
- }
881
+ if (depthDiff > 0) {
882
+ context.beginPath();
899
883
 
900
- var textWidth = columnWidth - treeIndent;
901
- var textX = x + cellHorizontalPadding;
902
- var textY = y + rowHeight * 0.5;
884
+ for (var _i4 = depth - depthDiff; _i4 < depth; _i4 += 1) {
885
+ var _lineX = columnX + _i4 * treeDepthIndent + treeDepthIndent * 0.5 + treeHorizontalPadding + 0.5;
903
886
 
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
- }
887
+ context.moveTo(_lineX, rowY);
888
+ context.lineTo(_lineX, rowY + Math.ceil(rowHeight / 2)); // extra moveTo prevents halfpixel in corner
911
889
 
912
- textX += treeIndent;
913
- var fontWidth = fontWidths.get(context.font);
914
- var truncatedText = this.getCachedTruncatedString(context, text, textWidth - cellHorizontalPadding * 2, fontWidth);
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
+ }
915
893
 
916
- if (truncatedText != null) {
917
- context.fillText(truncatedText, textX, textY);
894
+ context.stroke();
918
895
  }
919
896
  }
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
+ }
920
931
 
921
- if (isFirstColumn && hasExpandableRows) {
922
- this.drawCellRowTreeMarker(context, state, row);
923
- }
924
- }
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
925
942
 
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
- }
943
+ context.fillStyle = headerBackgroundColor;
944
+ context.fillRect(0, 0, width, columnHeaderHeight); // Draw the separators
961
945
 
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
- }
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
971
972
 
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();
973
+ context.beginPath();
974
+ context.fillStyle = headerSeparatorColor;
1001
975
 
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);
1006
- }
976
+ for (var _i5 = 0; _i5 < hiddenColumns.length; _i5 += 1) {
977
+ var _column = hiddenColumns[_i5];
1007
978
 
1008
- context.stroke();
1009
- } // draw as hockey stick if last row at depth
979
+ var _columnX = visibleColumnXs.get(_column);
1010
980
 
981
+ var _columnWidth = visibleColumnWidths.get(_column);
1011
982
 
1012
- if (depthDiff > 0) {
1013
- context.beginPath();
983
+ var minX = gridX + _columnX + _columnWidth + 0.5 - headerHiddenSeparatorSize * 0.5;
984
+ context.rect(minX, hiddenY, headerHiddenSeparatorSize, hiddenSeparatorHeight);
985
+ }
1014
986
 
1015
- for (var _i4 = depth - depthDiff; _i4 < depth; _i4 += 1) {
1016
- var _lineX = columnX + _i4 * treeDepthIndent + treeDepthIndent * 0.5 + treeHorizontalPadding + 0.5;
987
+ context.fill();
988
+ }
1017
989
 
1018
- context.moveTo(_lineX, rowY);
1019
- context.lineTo(_lineX, rowY + Math.ceil(rowHeight / 2)); // extra moveTo prevents halfpixel in corner
990
+ if (headerSeparatorHoverColor) {
991
+ var highlightedSeparator = draggingColumnSeparator;
1020
992
 
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);
1023
- }
993
+ if (highlightedSeparator == null) {
994
+ highlightedSeparator = GridUtils.getColumnSeparatorIndex(mouseX, mouseY, metrics, theme);
995
+ }
1024
996
 
1025
- context.stroke();
1026
- }
1027
- }
997
+ if (highlightedSeparator != null && (!isDragging || draggingColumnSeparator != null)) {
998
+ context.strokeStyle = headerSeparatorHoverColor;
1028
999
 
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
- }
1000
+ var _columnX2 = visibleColumnXs.get(highlightedSeparator);
1037
1001
 
1038
- drawFooters(context, state) {
1039
- var {
1040
- theme
1041
- } = state;
1042
- context.font = theme.headerFont;
1043
- this.drawRowFooters(context, state);
1044
- }
1002
+ var _columnWidth2 = visibleColumnWidths.get(highlightedSeparator);
1045
1003
 
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
- }
1004
+ var _x4 = gridX + _columnX2 + _columnWidth2 + 0.5;
1067
1005
 
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;
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;
1089
1011
 
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
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
1105
1020
 
1106
1021
 
1107
- context.moveTo(0, columnHeaderHeight - 0.5);
1108
- context.lineTo(width, columnHeaderHeight - 0.5);
1109
- context.stroke(); // Now draw the hidden column separator boxes
1022
+ context.beginPath();
1023
+ context.moveTo(_x4, 0);
1024
+ context.lineTo(_x4, columnHeaderHeight - 1);
1025
+ context.stroke();
1026
+ }
1027
+ }
1110
1028
 
1111
- context.beginPath();
1112
- context.fillStyle = headerSeparatorColor;
1029
+ context.fillStyle = headerColor;
1113
1030
 
1114
- for (var _i5 = 0; _i5 < hiddenColumns.length; _i5 += 1) {
1115
- var _column = hiddenColumns[_i5];
1031
+ for (var _i6 = 0; _i6 < visibleColumns.length; _i6 += 1) {
1032
+ var _column2 = visibleColumns[_i6];
1116
1033
 
1117
- var _columnX = visibleColumnXs.get(_column);
1034
+ var _columnWidth3 = visibleColumnWidths.get(_column2);
1118
1035
 
1119
- var _columnWidth = visibleColumnWidths.get(_column);
1036
+ var _x5 = visibleColumnXs.get(_column2) + gridX;
1120
1037
 
1121
- var minX = gridX + _columnX + _columnWidth + 0.5 - headerHiddenSeparatorSize * 0.5;
1122
- context.rect(minX, hiddenY, headerHiddenSeparatorSize, hiddenSeparatorHeight);
1038
+ this.drawColumnHeader(context, state, _column2, _x5, _columnWidth3);
1123
1039
  }
1124
1040
 
1125
- context.fill();
1041
+ context.restore();
1126
1042
  }
1127
-
1128
- if (headerSeparatorHoverColor) {
1129
- var highlightedSeparator = draggingColumnSeparator;
1130
-
1131
- if (highlightedSeparator == null) {
1132
- highlightedSeparator = GridUtils.getColumnSeparatorIndex(mouseX, mouseY, metrics, theme);
1043
+ }, {
1044
+ key: "drawColumnHeader",
1045
+ value: function drawColumnHeader(context, state, column, columnX, columnWidth) {
1046
+ if (columnWidth <= 0) {
1047
+ return;
1133
1048
  }
1134
1049
 
1135
- if (highlightedSeparator != null && (!isDragging || draggingColumnSeparator != null)) {
1136
- context.strokeStyle = headerSeparatorHoverColor;
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);
1137
1056
 
1138
- var _columnX2 = visibleColumnXs.get(highlightedSeparator);
1057
+ if (!text) {
1058
+ return;
1059
+ }
1139
1060
 
1140
- var _columnWidth2 = visibleColumnWidths.get(highlightedSeparator);
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;
1141
1066
 
1142
- var _x4 = gridX + _columnX2 + _columnWidth2 + 0.5;
1067
+ if (maxLength <= 0) {
1068
+ return;
1069
+ }
1143
1070
 
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;
1071
+ context.save();
1072
+ context.beginPath();
1073
+ context.rect(columnX, 0, columnWidth, columnHeaderHeight);
1074
+ context.clip();
1149
1075
 
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
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;
1158
1084
 
1085
+ var _y5 = columnHeaderHeight * 0.5;
1159
1086
 
1160
- context.beginPath();
1161
- context.moveTo(_x4, 0);
1162
- context.lineTo(_x4, columnHeaderHeight - 1);
1163
- context.stroke();
1087
+ context.textAlign = 'center';
1088
+ context.fillText(text, _x6, _y5);
1164
1089
  }
1090
+
1091
+ context.restore();
1165
1092
  }
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;
1110
+ }
1166
1111
 
1167
- context.fillStyle = headerColor;
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
1168
1122
 
1169
- for (var _i6 = 0; _i6 < visibleColumns.length; _i6 += 1) {
1170
- var _column2 = visibleColumns[_i6];
1123
+ context.fillStyle = headerBackgroundColor;
1124
+ context.fillRect(0, 0, rowHeaderWidth, height); // Draw the separators
1171
1125
 
1172
- var _columnWidth3 = visibleColumnWidths.get(_column2);
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
1173
1154
 
1174
- var _x5 = visibleColumnXs.get(_column2) + gridX;
1155
+ context.beginPath();
1156
+ context.fillStyle = headerSeparatorColor;
1175
1157
 
1176
- this.drawColumnHeader(context, state, _column2, _x5, _columnWidth3);
1177
- }
1158
+ for (var _i7 = 0; _i7 < hiddenRows.length; _i7 += 1) {
1159
+ var _row4 = hiddenRows[_i7];
1178
1160
 
1179
- context.restore();
1180
- }
1161
+ var _rowY = visibleRowYs.get(_row4);
1181
1162
 
1182
- drawColumnHeader(context, state, column, columnX, columnWidth) {
1183
- if (columnWidth <= 0) {
1184
- return;
1185
- }
1163
+ var _rowHeight = visibleRowHeights.get(_row4);
1186
1164
 
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
- }
1165
+ var minY = gridY + _rowY + _rowHeight + 0.5 - headerHiddenSeparatorSize * 0.5;
1166
+ context.rect(hiddenX, minY, hiddenSeparatorWidth, headerHiddenSeparatorSize);
1167
+ }
1201
1168
 
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
- }
1169
+ context.fill();
1170
+ }
1215
1171
 
1216
- context.save();
1217
- context.beginPath();
1218
- context.rect(columnX, 0, columnWidth, columnHeaderHeight);
1219
- context.clip();
1172
+ if (headerSeparatorHoverColor) {
1173
+ var highlightedSeparator = draggingRowSeparator;
1220
1174
 
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;
1175
+ if (highlightedSeparator == null) {
1176
+ highlightedSeparator = GridUtils.getRowSeparatorIndex(mouseX, mouseY, metrics, theme);
1177
+ }
1229
1178
 
1230
- var _y5 = columnHeaderHeight * 0.5;
1179
+ if (highlightedSeparator != null) {
1180
+ context.strokeStyle = headerSeparatorHoverColor;
1231
1181
 
1232
- context.textAlign = 'center';
1233
- context.fillText(text, _x6, _y5);
1234
- }
1182
+ var _rowY2 = visibleRowYs.get(highlightedSeparator);
1235
1183
 
1236
- context.restore();
1237
- }
1184
+ var _rowHeight2 = visibleRowHeights.get(highlightedSeparator);
1238
1185
 
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
- }
1186
+ var _y6 = gridY + _rowY2 + _rowHeight2 + 0.5;
1259
1187
 
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;
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;
1283
1193
 
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);
1297
- }
1298
- } // border right, interior to the headerWidth
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
+ }
1299
1202
 
1203
+ context.beginPath();
1204
+ context.moveTo(0.5, _y6);
1205
+ context.lineTo(rowHeaderWidth + 0.5, _y6);
1206
+ context.stroke();
1207
+ }
1208
+ } // Fill in the text
1300
1209
 
1301
- context.moveTo(rowHeaderWidth - 0.5, 0);
1302
- context.lineTo(rowHeaderWidth - 0.5, height);
1303
- context.stroke(); // Draw the hidden column separators
1304
1210
 
1305
1211
  context.beginPath();
1306
- context.fillStyle = headerSeparatorColor;
1212
+ context.rect(0, gridY, rowHeaderWidth, height);
1213
+ context.clip();
1214
+ context.fillStyle = headerColor;
1215
+ context.textAlign = 'right';
1307
1216
 
1308
- for (var _i7 = 0; _i7 < hiddenRows.length; _i7 += 1) {
1309
- var _row4 = hiddenRows[_i7];
1217
+ for (var _i8 = 0; _i8 < visibleRows.length; _i8 += 1) {
1218
+ var _row5 = visibleRows[_i8];
1310
1219
 
1311
- var _rowY = visibleRowYs.get(_row4);
1220
+ var _rowHeight3 = visibleRowHeights.get(_row5);
1312
1221
 
1313
- var _rowHeight = visibleRowHeights.get(_row4);
1222
+ var _y7 = visibleRowYs.get(_row5) + gridY;
1314
1223
 
1315
- var minY = gridY + _rowY + _rowHeight + 0.5 - headerHiddenSeparatorSize * 0.5;
1316
- context.rect(hiddenX, minY, hiddenSeparatorWidth, headerHiddenSeparatorSize);
1224
+ this.drawRowHeader(context, state, _row5, _y7, _rowHeight3);
1317
1225
  }
1318
1226
 
1319
- context.fill();
1227
+ context.restore();
1320
1228
  }
1321
-
1322
- if (headerSeparatorHoverColor) {
1323
- var highlightedSeparator = draggingRowSeparator;
1324
-
1325
- if (highlightedSeparator == null) {
1326
- highlightedSeparator = GridUtils.getRowSeparatorIndex(mouseX, mouseY, metrics, theme);
1229
+ }, {
1230
+ key: "drawRowHeader",
1231
+ value: function drawRowHeader(context, state, row, rowY, rowHeight) {
1232
+ if (rowHeight <= 0) {
1233
+ return;
1327
1234
  }
1328
1235
 
1329
- if (highlightedSeparator != null) {
1330
- context.strokeStyle = headerSeparatorHoverColor;
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
+ }
1331
1270
 
1332
- var _rowY2 = visibleRowYs.get(highlightedSeparator);
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
1333
1283
 
1334
- var _rowHeight2 = visibleRowHeights.get(highlightedSeparator);
1284
+ context.fillStyle = headerBackgroundColor;
1285
+ context.fillRect(x, gridY, rowFooterWidth, height); // Draw the separators
1335
1286
 
1336
- var _y6 = gridY + _rowY2 + _rowHeight2 + 0.5;
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
1337
1315
 
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;
1316
+ context.beginPath();
1317
+ context.fillStyle = headerSeparatorColor;
1343
1318
 
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);
1351
- }
1319
+ for (var _i9 = 0; _i9 < hiddenRows.length; _i9 += 1) {
1320
+ var _row6 = hiddenRows[_i9];
1352
1321
 
1353
- context.beginPath();
1354
- context.moveTo(0.5, _y6);
1355
- context.lineTo(rowHeaderWidth + 0.5, _y6);
1356
- context.stroke();
1357
- }
1358
- } // Fill in the text
1322
+ var _rowY3 = visibleRowYs.get(_row6);
1359
1323
 
1324
+ var _rowHeight4 = visibleRowHeights.get(_row6);
1360
1325
 
1361
- context.beginPath();
1362
- context.rect(0, gridY, rowHeaderWidth, height);
1363
- context.clip();
1364
- context.fillStyle = headerColor;
1365
- context.textAlign = 'right';
1326
+ var minY = gridY + _rowY3 + _rowHeight4 + 0.5 - headerHiddenSeparatorSize * 0.5;
1327
+ context.rect(x + hiddenX, minY, hiddenSeparatorWidth, headerHiddenSeparatorSize);
1328
+ }
1366
1329
 
1367
- for (var _i8 = 0; _i8 < visibleRows.length; _i8 += 1) {
1368
- var _row5 = visibleRows[_i8];
1330
+ context.fill();
1331
+ }
1369
1332
 
1370
- var _rowHeight3 = visibleRowHeights.get(_row5);
1333
+ if (headerSeparatorHoverColor) {
1334
+ var highlightedSeparator = draggingRowSeparator;
1371
1335
 
1372
- var _y7 = visibleRowYs.get(_row5) + gridY;
1336
+ if (highlightedSeparator == null) {
1337
+ highlightedSeparator = GridUtils.getRowSeparatorIndex(mouseX, mouseY, metrics, theme);
1338
+ }
1373
1339
 
1374
- this.drawRowHeader(context, state, _row5, _y7, _rowHeight3);
1375
- }
1340
+ if (highlightedSeparator != null) {
1341
+ context.strokeStyle = headerSeparatorHoverColor;
1376
1342
 
1377
- context.restore();
1378
- }
1343
+ var _rowY4 = visibleRowYs.get(highlightedSeparator);
1379
1344
 
1380
- drawRowHeader(context, state, row, rowY, rowHeight) {
1381
- if (rowHeight <= 0) {
1382
- return;
1383
- }
1345
+ var _rowHeight5 = visibleRowHeights.get(highlightedSeparator);
1384
1346
 
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
- }
1347
+ var _y8 = gridY + _rowY4 + _rowHeight5 + 0.5;
1399
1348
 
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
- }
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;
1426
1354
 
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;
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
+ }
1452
1363
 
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);
1364
+ context.beginPath();
1365
+ context.moveTo(x + 0.5, _y8);
1366
+ context.lineTo(x + rowFooterWidth + 0.5, _y8);
1367
+ context.stroke();
1466
1368
  }
1467
- } // border left, interior to the headerWidth
1468
-
1369
+ } // Fill in the text
1469
1370
 
1470
- context.moveTo(x + 0.5, gridY);
1471
- context.lineTo(x + 0.5, height);
1472
- context.stroke(); // Draw the hidden column separators
1473
1371
 
1474
1372
  context.beginPath();
1475
- context.fillStyle = headerSeparatorColor;
1373
+ context.rect(x, gridY, rowFooterWidth, height);
1374
+ context.clip();
1375
+ context.fillStyle = headerColor;
1376
+ context.textAlign = 'left';
1377
+ var textX = x + cellHorizontalPadding;
1476
1378
 
1477
- for (var _i9 = 0; _i9 < hiddenRows.length; _i9 += 1) {
1478
- var _row6 = hiddenRows[_i9];
1379
+ for (var _i10 = 0; _i10 < visibleRows.length; _i10 += 1) {
1380
+ var _row7 = visibleRows[_i10];
1479
1381
 
1480
- var _rowY3 = visibleRowYs.get(_row6);
1382
+ var _rowHeight6 = visibleRowHeights.get(_row7);
1481
1383
 
1482
- var _rowHeight4 = visibleRowHeights.get(_row6);
1384
+ if (_rowHeight6 > 0) {
1385
+ var _rowY5 = visibleRowYs.get(_row7) + gridY;
1483
1386
 
1484
- var minY = gridY + _rowY3 + _rowHeight4 + 0.5 - headerHiddenSeparatorSize * 0.5;
1485
- context.rect(x + hiddenX, minY, hiddenSeparatorWidth, headerHiddenSeparatorSize);
1387
+ var modelRow = modelRows.get(_row7);
1388
+ var textY = _rowY5 + _rowHeight6 * 0.5;
1389
+ context.fillText(model.textForRowFooter(modelRow), textX, textY);
1390
+ }
1486
1391
  }
1487
1392
 
1488
- context.fill();
1393
+ context.restore();
1489
1394
  }
1490
-
1491
- if (headerSeparatorHoverColor) {
1492
- var highlightedSeparator = draggingRowSeparator;
1493
-
1494
- if (highlightedSeparator == null) {
1495
- highlightedSeparator = GridUtils.getRowSeparatorIndex(mouseX, mouseY, metrics, theme);
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;
1496
1433
  }
1497
1434
 
1498
- if (highlightedSeparator != null) {
1499
- context.strokeStyle = headerSeparatorHoverColor;
1435
+ var isCursorVisible = model.isEditable && editingCell == null && draggingRow == null && draggingColumn == null && visibleColumnXs.has(column) && visibleRowYs.has(row);
1500
1436
 
1501
- var _rowY4 = visibleRowYs.get(highlightedSeparator);
1502
-
1503
- var _rowHeight5 = visibleRowHeights.get(highlightedSeparator);
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
1504
1449
 
1505
- var _y8 = gridY + _rowY4 + _rowHeight5 + 0.5;
1506
1450
 
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;
1451
+ context.beginPath();
1512
1452
 
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
- }
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
1521
1488
 
1522
- context.beginPath();
1523
- context.moveTo(x + 0.5, _y8);
1524
- context.lineTo(x + rowFooterWidth + 0.5, _y8);
1489
+ context.strokeStyle = theme.selectionOutlineColor;
1490
+ context.lineWidth = 1;
1525
1491
  context.stroke();
1526
1492
  }
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];
1539
1493
 
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);
1494
+ if (isCursorVisible) {
1495
+ context.restore();
1496
+ this.drawActiveCell(context, state, column, row);
1548
1497
  }
1549
1498
  }
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
+ }
1550
1523
 
1551
- context.restore();
1552
- }
1553
-
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);
1524
+ if (y <= 0) {
1525
+ h += y - 1;
1526
+ y = 1;
1527
+ }
1591
1528
 
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);
1598
- context.save();
1529
+ var lineWidth = context.lineWidth;
1599
1530
  context.beginPath();
1600
- context.rect(0, 0, width, height);
1601
- context.rect(x, y, w, h);
1602
- context.clip('evenodd');
1603
- } // Draw selection ranges
1604
-
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
+ }
1605
1576
 
1606
- context.beginPath();
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;
1590
+ context.save();
1591
+ context.translate(gridX, 0); // First, we need to draw over the row stripes where the column is coming from
1607
1592
 
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;
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
1614
1596
 
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;
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
1618
1603
 
1619
- var _y9 = startRow >= top && visibleRowYs.has(startRow) ? Math.max(Math.round(visibleRowYs.get(startRow)) + 0.5, 0.5) : minY;
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
1620
1610
 
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
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
+ }
1625
1628
 
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
1626
1644
 
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
- */
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
1636
1648
 
1637
1649
  context.save();
1638
- context.clip();
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
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
1643
1655
 
1644
- context.strokeStyle = theme.selectionOutlineColor;
1645
- context.lineWidth = 1;
1646
- context.stroke();
1647
- }
1656
+ context.beginPath();
1657
+ context.rect(-gridX, y, width, rowHeight);
1658
+ 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
1648
1662
 
1649
- if (isCursorVisible) {
1663
+ context.translate(-gridX, -gridY);
1664
+ context.font = headerFont;
1665
+ this.drawRowHeaders(context, state);
1650
1666
  context.restore();
1651
- this.drawActiveCell(context, state, column, row);
1652
1667
  }
1653
- }
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
+ }
1654
1682
 
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
- }
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
+ }
1681
1720
 
1682
- if (y <= 0) {
1683
- h += y - 1;
1684
- y = 1;
1685
- }
1721
+ if (hasHorizontalBar) {
1722
+ var x = scrollX;
1723
+ var y = height - columnHeaderHeight - hScrollBarSize; // scrollbar casing
1686
1724
 
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
- }
1725
+ context.fillStyle = scrollBarCasingColor;
1726
+ context.fillRect(0, y, barWidth, hScrollBarSize - scrollBarCasingWidth); // scrollbar track
1723
1727
 
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
- }
1728
+ context.fillStyle = isHorizontalBarHover ? scrollBarHoverBackgroundColor : scrollBarBackgroundColor;
1729
+ context.fillRect(0, y + scrollBarCasingWidth, barWidth, hScrollBarSize - scrollBarCasingWidth); // scrollbar thumb
1736
1730
 
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
- }
1731
+ if (isDraggingHorizontalScrollBar) {
1732
+ context.fillStyle = scrollBarActiveColor;
1733
+ } else if (isHorizontalBarHover) {
1734
+ context.fillStyle = scrollBarHoverColor;
1735
+ } else {
1736
+ context.fillStyle = scrollBarColor;
1737
+ }
1780
1738
 
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
- }
1739
+ context.fillRect(x, y + scrollBarCasingWidth, handleWidth, hScrollBarSize - scrollBarCasingWidth);
1740
+ }
1793
1741
 
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
- }
1742
+ if (hasVerticalBar) {
1743
+ var _x8 = width - rowHeaderWidth - vScrollBarSize;
1837
1744
 
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
- }
1745
+ var _y10 = scrollY; // scrollbar casing
1852
1746
 
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 || !isDraggingHorizontalScrollBar && !isDragging && mouseX >= width - scrollBarHoverSize && mouseY <= barHeight + columnHeaderHeight && isInbounds;
1881
- var isHorizontalBarHover = isDraggingHorizontalScrollBar || !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
- }
1747
+ context.fillStyle = scrollBarCasingColor;
1748
+ context.fillRect(_x8, 0, vScrollBarSize - scrollBarCasingWidth, barHeight); // scrollbar track
1894
1749
 
1895
- if (hasHorizontalBar) {
1896
- var x = scrollX;
1897
- var y = height - columnHeaderHeight - hScrollBarSize; // scrollbar casing
1750
+ context.fillStyle = isVerticalBarHover ? scrollBarHoverBackgroundColor : scrollBarBackgroundColor;
1751
+ context.fillRect(_x8 + scrollBarCasingWidth, 0, vScrollBarSize - scrollBarCasingWidth, barHeight); // scrollbar thumb
1898
1752
 
1899
- context.fillStyle = scrollBarCasingColor;
1900
- context.fillRect(0, y, barWidth, hScrollBarSize - scrollBarCasingWidth); // scrollbar track
1753
+ if (isDraggingVerticalScrollBar) {
1754
+ context.fillStyle = scrollBarActiveColor;
1755
+ } else if (isVerticalBarHover) {
1756
+ context.fillStyle = scrollBarHoverColor;
1757
+ } else {
1758
+ context.fillStyle = scrollBarColor;
1759
+ }
1901
1760
 
1902
- context.fillStyle = isHorizontalBarHover ? scrollBarHoverBackgroundColor : scrollBarBackgroundColor;
1903
- context.fillRect(0, y + scrollBarCasingWidth, barWidth, hScrollBarSize - scrollBarCasingWidth); // scrollbar thumb
1761
+ context.fillRect(_x8 + scrollBarCasingWidth, _y10, vScrollBarSize - scrollBarCasingWidth, handleHeight);
1762
+ }
1904
1763
 
1905
- if (isDraggingHorizontalScrollBar) {
1906
- context.fillStyle = scrollBarActiveColor;
1907
- } else if (isHorizontalBarHover) {
1908
- context.fillStyle = scrollBarHoverColor;
1909
- } else {
1910
- context.fillStyle = scrollBarColor;
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) + '…';
1911
1778
  }
1912
1779
 
1913
- context.fillRect(x, y + scrollBarCasingWidth, handleWidth, hScrollBarSize - scrollBarCasingWidth);
1780
+ return str;
1914
1781
  }
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
+ }
1915
1805
 
1916
- if (hasVerticalBar) {
1917
- var _x8 = width - rowHeaderWidth - vScrollBarSize;
1806
+ var lo = start;
1807
+ var hi = Math.min(str.length - 1, end);
1808
+ var result = str;
1918
1809
 
1919
- var _y10 = scrollY; // scrollbar casing
1810
+ while (hi > lo) {
1811
+ var mid = Math.ceil((hi + lo) / 2);
1812
+ var truncatedStr = GridRenderer.truncate(str, mid);
1920
1813
 
1921
- context.fillStyle = scrollBarCasingColor;
1922
- context.fillRect(_x8, 0, vScrollBarSize - scrollBarCasingWidth, barHeight); // scrollbar track
1814
+ if (context.measureText(truncatedStr).width <= width) {
1815
+ result = truncatedStr;
1923
1816
 
1924
- context.fillStyle = isVerticalBarHover ? scrollBarHoverBackgroundColor : scrollBarBackgroundColor;
1925
- context.fillRect(_x8 + scrollBarCasingWidth, 0, vScrollBarSize - scrollBarCasingWidth, barHeight); // scrollbar thumb
1817
+ if (lo === mid) {
1818
+ break;
1819
+ }
1926
1820
 
1927
- if (isDraggingVerticalScrollBar) {
1928
- context.fillStyle = scrollBarActiveColor;
1929
- } else if (isVerticalBarHover) {
1930
- context.fillStyle = scrollBarHoverColor;
1931
- } else {
1932
- context.fillStyle = scrollBarColor;
1821
+ lo = mid;
1822
+ } else {
1823
+ hi = mid - 1;
1824
+ }
1933
1825
  }
1934
1826
 
1935
- context.fillRect(_x8 + scrollBarCasingWidth, _y10, vScrollBarSize - scrollBarCasingWidth, handleHeight);
1936
- }
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;
1846
+ }
1937
1847
 
1938
- context.translate(-rowHeaderWidth, -columnHeaderHeight);
1939
- }
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);
1851
+ }
1852
+ }]);
1940
1853
 
1941
- }
1854
+ return GridRenderer;
1855
+ }();
1942
1856
 
1943
1857
  _defineProperty(GridRenderer, "DEFAULT_FONT_WIDTH", 10);
1944
1858