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