@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.
- package/dist/CellInputField.js +88 -40
- package/dist/CellInputField.js.map +1 -1
- package/dist/Grid.js +1484 -1449
- package/dist/Grid.js.map +1 -1
- package/dist/GridColorUtils.js +51 -18
- package/dist/GridColorUtils.js.map +1 -1
- package/dist/GridMetricCalculator.js +994 -1017
- package/dist/GridMetricCalculator.js.map +1 -1
- package/dist/GridModel.js +286 -171
- package/dist/GridModel.js.map +1 -1
- package/dist/GridMouseHandler.js +59 -39
- package/dist/GridMouseHandler.js.map +1 -1
- package/dist/GridRange.js +630 -572
- package/dist/GridRange.js.map +1 -1
- package/dist/GridRenderer.d.ts.map +1 -1
- package/dist/GridRenderer.js +1564 -1650
- package/dist/GridRenderer.js.map +1 -1
- package/dist/GridTestUtils.js +29 -15
- package/dist/GridTestUtils.js.map +1 -1
- package/dist/GridUtils.js +717 -679
- package/dist/GridUtils.js.map +1 -1
- package/dist/KeyHandler.js +18 -6
- package/dist/KeyHandler.js.map +1 -1
- package/dist/MockGridModel.js +210 -105
- package/dist/MockGridModel.js.map +1 -1
- package/dist/MockTreeGridModel.js +183 -113
- package/dist/MockTreeGridModel.js.map +1 -1
- package/dist/errors/PasteError.js +44 -5
- package/dist/errors/PasteError.js.map +1 -1
- package/dist/errors/index.js +1 -1
- package/dist/errors/index.js.map +1 -1
- package/dist/index.js +15 -15
- package/dist/index.js.map +1 -1
- package/dist/key-handlers/EditKeyHandler.js +75 -42
- package/dist/key-handlers/EditKeyHandler.js.map +1 -1
- package/dist/key-handlers/PasteKeyHandler.js +78 -42
- package/dist/key-handlers/PasteKeyHandler.js.map +1 -1
- package/dist/key-handlers/SelectionKeyHandler.js +234 -220
- package/dist/key-handlers/SelectionKeyHandler.js.map +1 -1
- package/dist/key-handlers/TreeKeyHandler.js +72 -42
- package/dist/key-handlers/TreeKeyHandler.js.map +1 -1
- package/dist/key-handlers/index.js +4 -4
- package/dist/key-handlers/index.js.map +1 -1
- package/dist/memoizeClear.js +1 -1
- package/dist/memoizeClear.js.map +1 -1
- package/dist/mouse-handlers/EditMouseHandler.js +50 -18
- package/dist/mouse-handlers/EditMouseHandler.js.map +1 -1
- package/dist/mouse-handlers/GridColumnMoveMouseHandler.js +163 -141
- package/dist/mouse-handlers/GridColumnMoveMouseHandler.js.map +1 -1
- package/dist/mouse-handlers/GridColumnSeparatorMouseHandler.js +86 -47
- package/dist/mouse-handlers/GridColumnSeparatorMouseHandler.js.map +1 -1
- package/dist/mouse-handlers/GridHorizontalScrollBarMouseHandler.d.ts.map +1 -1
- package/dist/mouse-handlers/GridHorizontalScrollBarMouseHandler.js +171 -143
- package/dist/mouse-handlers/GridHorizontalScrollBarMouseHandler.js.map +1 -1
- package/dist/mouse-handlers/GridRowMoveMouseHandler.js +147 -125
- package/dist/mouse-handlers/GridRowMoveMouseHandler.js.map +1 -1
- package/dist/mouse-handlers/GridRowSeparatorMouseHandler.js +86 -47
- package/dist/mouse-handlers/GridRowSeparatorMouseHandler.js.map +1 -1
- package/dist/mouse-handlers/GridRowTreeMouseHandler.js +76 -46
- package/dist/mouse-handlers/GridRowTreeMouseHandler.js.map +1 -1
- package/dist/mouse-handlers/GridScrollBarCornerMouseHandler.d.ts.map +1 -1
- package/dist/mouse-handlers/GridScrollBarCornerMouseHandler.js +62 -31
- package/dist/mouse-handlers/GridScrollBarCornerMouseHandler.js.map +1 -1
- package/dist/mouse-handlers/GridSelectionMouseHandler.js +222 -200
- package/dist/mouse-handlers/GridSelectionMouseHandler.js.map +1 -1
- package/dist/mouse-handlers/GridSeparatorMouseHandler.js +253 -206
- package/dist/mouse-handlers/GridSeparatorMouseHandler.js.map +1 -1
- package/dist/mouse-handlers/GridVerticalScrollBarMouseHandler.d.ts.map +1 -1
- package/dist/mouse-handlers/GridVerticalScrollBarMouseHandler.js +172 -144
- package/dist/mouse-handlers/GridVerticalScrollBarMouseHandler.js.map +1 -1
- package/dist/mouse-handlers/index.js +10 -10
- package/dist/mouse-handlers/index.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +4 -5
package/dist/GridRenderer.js
CHANGED
|
@@ -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
|
|
4
|
-
import GridUtils from
|
|
5
|
-
import GridColorUtils from
|
|
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
|
-
|
|
19
|
-
|
|
20
|
-
|
|
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)
|
|
25
|
-
|
|
46
|
+
_defineProperty(this, "getCachedBackgroundColors", memoizeClear(function (backgroundColors, maxDepth) {
|
|
47
|
+
return backgroundColors.split(' ').map(function (color) {
|
|
48
|
+
var colors = [];
|
|
26
49
|
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
50
|
+
for (var i = 0; i < maxDepth; i += 1) {
|
|
51
|
+
colors.push(GridColorUtils.darkenForDepth(color, i, maxDepth));
|
|
52
|
+
}
|
|
30
53
|
|
|
31
|
-
|
|
32
|
-
|
|
54
|
+
return colors;
|
|
55
|
+
});
|
|
56
|
+
}, {
|
|
33
57
|
max: 1000
|
|
34
58
|
}));
|
|
35
59
|
|
|
36
|
-
_defineProperty(this, "getCachedColorWithAlpha", memoizeClear(
|
|
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
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
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
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
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
|
-
|
|
119
|
-
|
|
120
|
-
|
|
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
|
-
|
|
155
|
-
|
|
156
|
-
|
|
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
|
-
|
|
168
|
-
|
|
169
|
-
|
|
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
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
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
|
-
|
|
207
|
-
|
|
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
|
-
|
|
215
|
-
|
|
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
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
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
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
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
|
-
|
|
237
|
-
|
|
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
|
-
|
|
240
|
-
|
|
241
|
-
|
|
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
|
-
|
|
273
|
-
|
|
274
|
-
|
|
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
|
-
|
|
282
|
-
|
|
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
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
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
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
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
|
-
|
|
314
|
-
|
|
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
|
-
|
|
347
|
-
|
|
275
|
+
context.moveTo(0.5, _y);
|
|
276
|
+
context.lineTo(maxX - 0.5, _y);
|
|
277
|
+
}
|
|
348
278
|
|
|
349
|
-
|
|
350
|
-
|
|
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
|
-
|
|
354
|
-
|
|
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
|
-
|
|
360
|
-
|
|
288
|
+
context.moveTo(_x, 0.5);
|
|
289
|
+
context.lineTo(_x, maxY - 0.5);
|
|
290
|
+
}
|
|
361
291
|
|
|
362
|
-
context.
|
|
363
|
-
context.
|
|
364
|
-
|
|
292
|
+
context.stroke();
|
|
293
|
+
context.beginPath();
|
|
294
|
+
context.lineWidth = 1;
|
|
295
|
+
context.strokeStyle = floatingDividerInnerColor;
|
|
365
296
|
|
|
366
|
-
|
|
367
|
-
|
|
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
|
-
|
|
372
|
-
|
|
300
|
+
context.moveTo(0.5, _y2);
|
|
301
|
+
context.lineTo(maxX - 0.5, _y2);
|
|
302
|
+
}
|
|
373
303
|
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
}
|
|
304
|
+
if (floatingBottomRowCount > 0) {
|
|
305
|
+
var _y3 = visibleRowYs.get(rowCount - floatingBottomRowCount) - 0.5;
|
|
377
306
|
|
|
378
|
-
|
|
379
|
-
|
|
307
|
+
context.moveTo(0.5, _y3);
|
|
308
|
+
context.lineTo(maxX - 0.5, _y3);
|
|
309
|
+
}
|
|
380
310
|
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
}
|
|
311
|
+
if (floatingLeftColumnCount > 0) {
|
|
312
|
+
var _x2 = visibleColumnXs.get(floatingLeftColumnCount - 1) + visibleColumnWidths.get(floatingLeftColumnCount - 1) + 0.5;
|
|
384
313
|
|
|
385
|
-
|
|
386
|
-
|
|
314
|
+
context.moveTo(_x2, 0.5);
|
|
315
|
+
context.lineTo(_x2, maxY - 0.5);
|
|
316
|
+
}
|
|
387
317
|
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
}
|
|
318
|
+
if (floatingRightColumnCount > 0) {
|
|
319
|
+
var _x3 = visibleColumnXs.get(columnCount - floatingRightColumnCount) - 0.5;
|
|
391
320
|
|
|
392
|
-
|
|
393
|
-
|
|
321
|
+
context.moveTo(_x3, 0.5);
|
|
322
|
+
context.lineTo(_x3, maxY - 0.5);
|
|
323
|
+
}
|
|
394
324
|
|
|
395
|
-
context.
|
|
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
|
-
|
|
400
|
-
|
|
333
|
+
if (drawHover) {
|
|
334
|
+
this.drawMouseColumnHover(context, state);
|
|
335
|
+
this.drawMouseRowHover(context, state);
|
|
336
|
+
}
|
|
401
337
|
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
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
|
-
|
|
407
|
-
|
|
408
|
-
|
|
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
|
-
|
|
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
|
-
|
|
443
|
-
|
|
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
|
-
|
|
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
|
-
|
|
491
|
-
|
|
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.
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
var depthAbove = model.depthForRow(rowAbove);
|
|
427
|
+
colorRowMap.forEach(function (colorRows, color) {
|
|
428
|
+
context.fillStyle = color;
|
|
429
|
+
context.beginPath();
|
|
498
430
|
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
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
|
-
|
|
515
|
-
|
|
516
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
542
|
-
context.fillRect(minX, 0, maxX, shadowBlur);
|
|
543
|
-
context.translate(0, -y);
|
|
544
|
-
}
|
|
465
|
+
var _startColor = this.getCachedColorWithAlpha(shadowColor, 0);
|
|
545
466
|
|
|
546
|
-
|
|
547
|
-
}
|
|
467
|
+
var _endColor = this.getCachedColorWithAlpha(shadowColor, 0.15);
|
|
548
468
|
|
|
549
|
-
|
|
550
|
-
context.save();
|
|
469
|
+
var _gradient = context.createLinearGradient(0, 0, 0, shadowBlur);
|
|
551
470
|
|
|
552
|
-
|
|
471
|
+
_gradient.addColorStop(0, _startColor);
|
|
553
472
|
|
|
554
|
-
|
|
473
|
+
_gradient.addColorStop(1, _endColor);
|
|
555
474
|
|
|
556
|
-
|
|
475
|
+
context.fillStyle = _gradient;
|
|
557
476
|
|
|
558
|
-
|
|
477
|
+
for (var _i3 = 0; _i3 < bottomShadowRows.length; _i3 += 1) {
|
|
478
|
+
var _row3 = bottomShadowRows[_i3];
|
|
559
479
|
|
|
560
|
-
|
|
480
|
+
var _y4 = visibleRowYs.get(_row3);
|
|
561
481
|
|
|
562
|
-
|
|
482
|
+
var rowHeight = visibleRowHeights.get(_row3);
|
|
483
|
+
var gradientY = _y4 + rowHeight - shadowBlur; // Use a translate so we can reuse the gradient
|
|
563
484
|
|
|
564
|
-
|
|
565
|
-
|
|
485
|
+
context.translate(0, gradientY);
|
|
486
|
+
context.fillRect(minX, 0, maxX, shadowBlur);
|
|
487
|
+
context.translate(0, -gradientY);
|
|
488
|
+
}
|
|
566
489
|
|
|
567
|
-
|
|
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
|
-
|
|
570
|
-
|
|
506
|
+
var visibleColumnWidths = metrics.visibleColumnWidths,
|
|
507
|
+
visibleColumnXs = metrics.visibleColumnXs,
|
|
508
|
+
maxY = metrics.maxY;
|
|
571
509
|
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
context.translate(0, -gradientY);
|
|
510
|
+
if (mouseY > maxY) {
|
|
511
|
+
return;
|
|
575
512
|
}
|
|
576
513
|
|
|
577
|
-
|
|
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
|
-
|
|
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
|
-
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
maxY
|
|
598
|
-
} = metrics;
|
|
534
|
+
if (mouseRow == null) {
|
|
535
|
+
return;
|
|
536
|
+
}
|
|
599
537
|
|
|
600
|
-
|
|
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
|
-
|
|
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
|
-
|
|
611
|
-
|
|
612
|
-
|
|
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
|
-
|
|
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
|
-
|
|
628
|
-
|
|
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
|
-
|
|
632
|
-
|
|
601
|
+
context.lineWidth = 1;
|
|
602
|
+
context.beginPath();
|
|
633
603
|
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
|
|
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
|
-
|
|
609
|
+
if (rowColor) {
|
|
610
|
+
context.strokeStyle = rowColor;
|
|
611
|
+
this.drawGridLinesForRows(context, state, rows);
|
|
612
|
+
}
|
|
654
613
|
|
|
655
|
-
|
|
656
|
-
this.drawMouseRowHoverForRow(context, state, mouseRow);
|
|
614
|
+
context.stroke();
|
|
657
615
|
}
|
|
658
|
-
}
|
|
659
|
-
|
|
660
|
-
|
|
661
|
-
|
|
662
|
-
metrics,
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
|
|
669
|
-
|
|
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
|
-
|
|
683
|
-
|
|
657
|
+
for (var i = 0; i < columns.length; i += 1) {
|
|
658
|
+
var column = columns[i];
|
|
684
659
|
|
|
685
|
-
|
|
686
|
-
|
|
687
|
-
|
|
688
|
-
|
|
689
|
-
|
|
690
|
-
|
|
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
|
-
|
|
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
|
-
|
|
703
|
-
|
|
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
|
-
|
|
711
|
-
|
|
712
|
-
|
|
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
|
-
|
|
716
|
-
|
|
717
|
-
|
|
718
|
-
|
|
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
|
-
|
|
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
|
-
|
|
753
|
-
|
|
754
|
-
|
|
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
|
-
|
|
764
|
-
|
|
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
|
-
|
|
767
|
-
|
|
785
|
+
textX += treeIndent;
|
|
786
|
+
var fontWidth = fontWidths.get(context.font);
|
|
787
|
+
var truncatedText = this.getCachedTruncatedString(context, text, textWidth - cellHorizontalPadding * 2, fontWidth);
|
|
768
788
|
|
|
769
|
-
|
|
770
|
-
|
|
771
|
-
|
|
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
|
-
|
|
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
|
-
|
|
817
|
-
|
|
818
|
-
|
|
819
|
-
|
|
820
|
-
|
|
821
|
-
|
|
822
|
-
|
|
823
|
-
|
|
824
|
-
|
|
825
|
-
|
|
826
|
-
|
|
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
|
-
|
|
831
|
-
|
|
832
|
-
|
|
833
|
-
|
|
834
|
-
|
|
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
|
-
|
|
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 (
|
|
897
|
-
|
|
898
|
-
}
|
|
881
|
+
if (depthDiff > 0) {
|
|
882
|
+
context.beginPath();
|
|
899
883
|
|
|
900
|
-
|
|
901
|
-
|
|
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
|
-
|
|
905
|
-
|
|
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
|
-
|
|
913
|
-
|
|
914
|
-
|
|
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
|
-
|
|
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
|
-
|
|
922
|
-
|
|
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
|
-
|
|
927
|
-
|
|
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
|
-
|
|
963
|
-
|
|
964
|
-
|
|
965
|
-
|
|
966
|
-
|
|
967
|
-
|
|
968
|
-
|
|
969
|
-
|
|
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
|
-
|
|
973
|
-
|
|
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
|
-
|
|
1003
|
-
|
|
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
|
-
|
|
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
|
-
|
|
1013
|
-
|
|
983
|
+
var minX = gridX + _columnX + _columnWidth + 0.5 - headerHiddenSeparatorSize * 0.5;
|
|
984
|
+
context.rect(minX, hiddenY, headerHiddenSeparatorSize, hiddenSeparatorHeight);
|
|
985
|
+
}
|
|
1014
986
|
|
|
1015
|
-
|
|
1016
|
-
|
|
987
|
+
context.fill();
|
|
988
|
+
}
|
|
1017
989
|
|
|
1018
|
-
|
|
1019
|
-
|
|
990
|
+
if (headerSeparatorHoverColor) {
|
|
991
|
+
var highlightedSeparator = draggingColumnSeparator;
|
|
1020
992
|
|
|
1021
|
-
|
|
1022
|
-
|
|
1023
|
-
|
|
993
|
+
if (highlightedSeparator == null) {
|
|
994
|
+
highlightedSeparator = GridUtils.getColumnSeparatorIndex(mouseX, mouseY, metrics, theme);
|
|
995
|
+
}
|
|
1024
996
|
|
|
1025
|
-
|
|
1026
|
-
|
|
1027
|
-
}
|
|
997
|
+
if (highlightedSeparator != null && (!isDragging || draggingColumnSeparator != null)) {
|
|
998
|
+
context.strokeStyle = headerSeparatorHoverColor;
|
|
1028
999
|
|
|
1029
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
1069
|
-
|
|
1070
|
-
|
|
1071
|
-
|
|
1072
|
-
|
|
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
|
-
|
|
1091
|
-
|
|
1092
|
-
|
|
1093
|
-
|
|
1094
|
-
|
|
1095
|
-
|
|
1096
|
-
|
|
1097
|
-
|
|
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
|
-
|
|
1108
|
-
|
|
1109
|
-
|
|
1022
|
+
context.beginPath();
|
|
1023
|
+
context.moveTo(_x4, 0);
|
|
1024
|
+
context.lineTo(_x4, columnHeaderHeight - 1);
|
|
1025
|
+
context.stroke();
|
|
1026
|
+
}
|
|
1027
|
+
}
|
|
1110
1028
|
|
|
1111
|
-
context.
|
|
1112
|
-
context.fillStyle = headerSeparatorColor;
|
|
1029
|
+
context.fillStyle = headerColor;
|
|
1113
1030
|
|
|
1114
|
-
for (var
|
|
1115
|
-
var
|
|
1031
|
+
for (var _i6 = 0; _i6 < visibleColumns.length; _i6 += 1) {
|
|
1032
|
+
var _column2 = visibleColumns[_i6];
|
|
1116
1033
|
|
|
1117
|
-
var
|
|
1034
|
+
var _columnWidth3 = visibleColumnWidths.get(_column2);
|
|
1118
1035
|
|
|
1119
|
-
var
|
|
1036
|
+
var _x5 = visibleColumnXs.get(_column2) + gridX;
|
|
1120
1037
|
|
|
1121
|
-
|
|
1122
|
-
context.rect(minX, hiddenY, headerHiddenSeparatorSize, hiddenSeparatorHeight);
|
|
1038
|
+
this.drawColumnHeader(context, state, _column2, _x5, _columnWidth3);
|
|
1123
1039
|
}
|
|
1124
1040
|
|
|
1125
|
-
context.
|
|
1041
|
+
context.restore();
|
|
1126
1042
|
}
|
|
1127
|
-
|
|
1128
|
-
|
|
1129
|
-
|
|
1130
|
-
|
|
1131
|
-
|
|
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
|
-
|
|
1136
|
-
|
|
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
|
-
|
|
1057
|
+
if (!text) {
|
|
1058
|
+
return;
|
|
1059
|
+
}
|
|
1139
1060
|
|
|
1140
|
-
|
|
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
|
-
|
|
1067
|
+
if (maxLength <= 0) {
|
|
1068
|
+
return;
|
|
1069
|
+
}
|
|
1143
1070
|
|
|
1144
|
-
|
|
1145
|
-
|
|
1146
|
-
|
|
1147
|
-
|
|
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
|
-
|
|
1151
|
-
|
|
1152
|
-
|
|
1153
|
-
|
|
1154
|
-
|
|
1155
|
-
|
|
1156
|
-
|
|
1157
|
-
|
|
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.
|
|
1161
|
-
context.
|
|
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
|
-
|
|
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
|
-
|
|
1170
|
-
|
|
1123
|
+
context.fillStyle = headerBackgroundColor;
|
|
1124
|
+
context.fillRect(0, 0, rowHeaderWidth, height); // Draw the separators
|
|
1171
1125
|
|
|
1172
|
-
|
|
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
|
-
|
|
1155
|
+
context.beginPath();
|
|
1156
|
+
context.fillStyle = headerSeparatorColor;
|
|
1175
1157
|
|
|
1176
|
-
|
|
1177
|
-
|
|
1158
|
+
for (var _i7 = 0; _i7 < hiddenRows.length; _i7 += 1) {
|
|
1159
|
+
var _row4 = hiddenRows[_i7];
|
|
1178
1160
|
|
|
1179
|
-
|
|
1180
|
-
}
|
|
1161
|
+
var _rowY = visibleRowYs.get(_row4);
|
|
1181
1162
|
|
|
1182
|
-
|
|
1183
|
-
if (columnWidth <= 0) {
|
|
1184
|
-
return;
|
|
1185
|
-
}
|
|
1163
|
+
var _rowHeight = visibleRowHeights.get(_row4);
|
|
1186
1164
|
|
|
1187
|
-
|
|
1188
|
-
|
|
1189
|
-
|
|
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
|
-
|
|
1203
|
-
|
|
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
|
-
|
|
1217
|
-
|
|
1218
|
-
context.rect(columnX, 0, columnWidth, columnHeaderHeight);
|
|
1219
|
-
context.clip();
|
|
1172
|
+
if (headerSeparatorHoverColor) {
|
|
1173
|
+
var highlightedSeparator = draggingRowSeparator;
|
|
1220
1174
|
|
|
1221
|
-
|
|
1222
|
-
|
|
1223
|
-
|
|
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
|
-
|
|
1179
|
+
if (highlightedSeparator != null) {
|
|
1180
|
+
context.strokeStyle = headerSeparatorHoverColor;
|
|
1231
1181
|
|
|
1232
|
-
|
|
1233
|
-
context.fillText(text, _x6, _y5);
|
|
1234
|
-
}
|
|
1182
|
+
var _rowY2 = visibleRowYs.get(highlightedSeparator);
|
|
1235
1183
|
|
|
1236
|
-
|
|
1237
|
-
}
|
|
1184
|
+
var _rowHeight2 = visibleRowHeights.get(highlightedSeparator);
|
|
1238
1185
|
|
|
1239
|
-
|
|
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
|
-
|
|
1261
|
-
|
|
1262
|
-
|
|
1263
|
-
|
|
1264
|
-
|
|
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
|
-
|
|
1285
|
-
|
|
1286
|
-
|
|
1287
|
-
|
|
1288
|
-
|
|
1289
|
-
|
|
1290
|
-
|
|
1291
|
-
|
|
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.
|
|
1212
|
+
context.rect(0, gridY, rowHeaderWidth, height);
|
|
1213
|
+
context.clip();
|
|
1214
|
+
context.fillStyle = headerColor;
|
|
1215
|
+
context.textAlign = 'right';
|
|
1307
1216
|
|
|
1308
|
-
for (var
|
|
1309
|
-
var
|
|
1217
|
+
for (var _i8 = 0; _i8 < visibleRows.length; _i8 += 1) {
|
|
1218
|
+
var _row5 = visibleRows[_i8];
|
|
1310
1219
|
|
|
1311
|
-
var
|
|
1220
|
+
var _rowHeight3 = visibleRowHeights.get(_row5);
|
|
1312
1221
|
|
|
1313
|
-
var
|
|
1222
|
+
var _y7 = visibleRowYs.get(_row5) + gridY;
|
|
1314
1223
|
|
|
1315
|
-
|
|
1316
|
-
context.rect(hiddenX, minY, hiddenSeparatorWidth, headerHiddenSeparatorSize);
|
|
1224
|
+
this.drawRowHeader(context, state, _row5, _y7, _rowHeight3);
|
|
1317
1225
|
}
|
|
1318
1226
|
|
|
1319
|
-
context.
|
|
1227
|
+
context.restore();
|
|
1320
1228
|
}
|
|
1321
|
-
|
|
1322
|
-
|
|
1323
|
-
|
|
1324
|
-
|
|
1325
|
-
|
|
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
|
-
|
|
1330
|
-
|
|
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
|
-
|
|
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
|
-
|
|
1284
|
+
context.fillStyle = headerBackgroundColor;
|
|
1285
|
+
context.fillRect(x, gridY, rowFooterWidth, height); // Draw the separators
|
|
1335
1286
|
|
|
1336
|
-
|
|
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
|
-
|
|
1339
|
-
|
|
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
|
-
|
|
1345
|
-
|
|
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
|
-
|
|
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
|
-
|
|
1362
|
-
|
|
1363
|
-
|
|
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
|
-
|
|
1368
|
-
|
|
1330
|
+
context.fill();
|
|
1331
|
+
}
|
|
1369
1332
|
|
|
1370
|
-
|
|
1333
|
+
if (headerSeparatorHoverColor) {
|
|
1334
|
+
var highlightedSeparator = draggingRowSeparator;
|
|
1371
1335
|
|
|
1372
|
-
|
|
1336
|
+
if (highlightedSeparator == null) {
|
|
1337
|
+
highlightedSeparator = GridUtils.getRowSeparatorIndex(mouseX, mouseY, metrics, theme);
|
|
1338
|
+
}
|
|
1373
1339
|
|
|
1374
|
-
|
|
1375
|
-
|
|
1340
|
+
if (highlightedSeparator != null) {
|
|
1341
|
+
context.strokeStyle = headerSeparatorHoverColor;
|
|
1376
1342
|
|
|
1377
|
-
|
|
1378
|
-
}
|
|
1343
|
+
var _rowY4 = visibleRowYs.get(highlightedSeparator);
|
|
1379
1344
|
|
|
1380
|
-
|
|
1381
|
-
if (rowHeight <= 0) {
|
|
1382
|
-
return;
|
|
1383
|
-
}
|
|
1345
|
+
var _rowHeight5 = visibleRowHeights.get(highlightedSeparator);
|
|
1384
1346
|
|
|
1385
|
-
|
|
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
|
-
|
|
1401
|
-
|
|
1402
|
-
|
|
1403
|
-
|
|
1404
|
-
|
|
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
|
-
|
|
1428
|
-
|
|
1429
|
-
|
|
1430
|
-
|
|
1431
|
-
|
|
1432
|
-
|
|
1433
|
-
|
|
1434
|
-
|
|
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
|
-
|
|
1454
|
-
|
|
1455
|
-
|
|
1456
|
-
|
|
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
|
-
} //
|
|
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.
|
|
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
|
|
1478
|
-
var
|
|
1379
|
+
for (var _i10 = 0; _i10 < visibleRows.length; _i10 += 1) {
|
|
1380
|
+
var _row7 = visibleRows[_i10];
|
|
1479
1381
|
|
|
1480
|
-
var
|
|
1382
|
+
var _rowHeight6 = visibleRowHeights.get(_row7);
|
|
1481
1383
|
|
|
1482
|
-
|
|
1384
|
+
if (_rowHeight6 > 0) {
|
|
1385
|
+
var _rowY5 = visibleRowYs.get(_row7) + gridY;
|
|
1483
1386
|
|
|
1484
|
-
|
|
1485
|
-
|
|
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.
|
|
1393
|
+
context.restore();
|
|
1489
1394
|
}
|
|
1490
|
-
|
|
1491
|
-
|
|
1492
|
-
|
|
1493
|
-
|
|
1494
|
-
|
|
1495
|
-
|
|
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
|
-
|
|
1499
|
-
context.strokeStyle = headerSeparatorHoverColor;
|
|
1435
|
+
var isCursorVisible = model.isEditable && editingCell == null && draggingRow == null && draggingColumn == null && visibleColumnXs.has(column) && visibleRowYs.has(row);
|
|
1500
1436
|
|
|
1501
|
-
|
|
1502
|
-
|
|
1503
|
-
var
|
|
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
|
-
|
|
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
|
-
|
|
1514
|
-
|
|
1515
|
-
|
|
1516
|
-
|
|
1517
|
-
|
|
1518
|
-
|
|
1519
|
-
|
|
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.
|
|
1523
|
-
context.
|
|
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
|
-
|
|
1541
|
-
|
|
1542
|
-
|
|
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
|
-
|
|
1552
|
-
|
|
1553
|
-
|
|
1554
|
-
|
|
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
|
-
|
|
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.
|
|
1601
|
-
context.
|
|
1602
|
-
|
|
1603
|
-
|
|
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
|
-
|
|
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
|
-
|
|
1609
|
-
|
|
1610
|
-
|
|
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
|
-
|
|
1616
|
-
|
|
1617
|
-
|
|
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
|
-
|
|
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
|
-
|
|
1622
|
-
|
|
1623
|
-
|
|
1624
|
-
|
|
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 =
|
|
1628
|
-
context.
|
|
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.
|
|
1639
|
-
context.
|
|
1640
|
-
context.
|
|
1641
|
-
context.
|
|
1642
|
-
context.restore(); //
|
|
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.
|
|
1645
|
-
context.
|
|
1646
|
-
context.
|
|
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
|
-
|
|
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
|
-
|
|
1656
|
-
|
|
1657
|
-
|
|
1658
|
-
|
|
1659
|
-
|
|
1660
|
-
|
|
1661
|
-
|
|
1662
|
-
|
|
1663
|
-
|
|
1664
|
-
|
|
1665
|
-
|
|
1666
|
-
|
|
1667
|
-
|
|
1668
|
-
|
|
1669
|
-
|
|
1670
|
-
|
|
1671
|
-
|
|
1672
|
-
|
|
1673
|
-
|
|
1674
|
-
|
|
1675
|
-
|
|
1676
|
-
|
|
1677
|
-
|
|
1678
|
-
|
|
1679
|
-
|
|
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
|
-
|
|
1683
|
-
|
|
1684
|
-
|
|
1685
|
-
}
|
|
1721
|
+
if (hasHorizontalBar) {
|
|
1722
|
+
var x = scrollX;
|
|
1723
|
+
var y = height - columnHeaderHeight - hScrollBarSize; // scrollbar casing
|
|
1686
1724
|
|
|
1687
|
-
|
|
1688
|
-
|
|
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
|
-
|
|
1725
|
-
|
|
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
|
-
|
|
1738
|
-
|
|
1739
|
-
|
|
1740
|
-
|
|
1741
|
-
|
|
1742
|
-
|
|
1743
|
-
|
|
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
|
-
|
|
1782
|
-
|
|
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
|
-
|
|
1795
|
-
|
|
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
|
-
|
|
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
|
-
|
|
1854
|
-
|
|
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
|
-
|
|
1896
|
-
|
|
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
|
-
|
|
1900
|
-
|
|
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
|
-
|
|
1903
|
-
|
|
1761
|
+
context.fillRect(_x8 + scrollBarCasingWidth, _y10, vScrollBarSize - scrollBarCasingWidth, handleHeight);
|
|
1762
|
+
}
|
|
1904
1763
|
|
|
1905
|
-
|
|
1906
|
-
|
|
1907
|
-
|
|
1908
|
-
|
|
1909
|
-
|
|
1910
|
-
|
|
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
|
-
|
|
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
|
-
|
|
1917
|
-
var
|
|
1806
|
+
var lo = start;
|
|
1807
|
+
var hi = Math.min(str.length - 1, end);
|
|
1808
|
+
var result = str;
|
|
1918
1809
|
|
|
1919
|
-
|
|
1810
|
+
while (hi > lo) {
|
|
1811
|
+
var mid = Math.ceil((hi + lo) / 2);
|
|
1812
|
+
var truncatedStr = GridRenderer.truncate(str, mid);
|
|
1920
1813
|
|
|
1921
|
-
|
|
1922
|
-
|
|
1814
|
+
if (context.measureText(truncatedStr).width <= width) {
|
|
1815
|
+
result = truncatedStr;
|
|
1923
1816
|
|
|
1924
|
-
|
|
1925
|
-
|
|
1817
|
+
if (lo === mid) {
|
|
1818
|
+
break;
|
|
1819
|
+
}
|
|
1926
1820
|
|
|
1927
|
-
|
|
1928
|
-
|
|
1929
|
-
|
|
1930
|
-
|
|
1931
|
-
} else {
|
|
1932
|
-
context.fillStyle = scrollBarColor;
|
|
1821
|
+
lo = mid;
|
|
1822
|
+
} else {
|
|
1823
|
+
hi = mid - 1;
|
|
1824
|
+
}
|
|
1933
1825
|
}
|
|
1934
1826
|
|
|
1935
|
-
|
|
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
|
-
|
|
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
|
|