@deephaven/grid 0.17.1-beta.0 → 0.17.1-beta.1
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/GridRenderer.d.ts +1 -0
- package/dist/GridRenderer.d.ts.map +1 -1
- package/dist/GridRenderer.js +34 -24
- package/dist/GridRenderer.js.map +1 -1
- package/dist/GridTheme.d.ts +4 -2
- package/dist/GridTheme.d.ts.map +1 -1
- package/dist/GridTheme.js +4 -1
- package/dist/GridTheme.js.map +1 -1
- package/package.json +4 -3
package/dist/GridRenderer.d.ts
CHANGED
|
@@ -126,6 +126,7 @@ export declare class GridRenderer {
|
|
|
126
126
|
getCachedTruncatedString: ((context: CanvasRenderingContext2D, text: string, width: number, fontWidth: number, truncationChar?: string | undefined) => string) & import("memoizee").Memoized<(context: CanvasRenderingContext2D, text: string, width: number, fontWidth: number, truncationChar?: string | undefined) => string>;
|
|
127
127
|
getCachedBackgroundColors: ((backgroundColors: GridColorWay, maxDepth: number) => GridColor[][]) & import("memoizee").Memoized<(backgroundColors: GridColorWay, maxDepth: number) => GridColor[][]>;
|
|
128
128
|
getCachedColorWithAlpha: ((color: any, alpha: any) => string) & import("memoizee").Memoized<(color: any, alpha: any) => string>;
|
|
129
|
+
getCachedColorIsDark: ((color: string) => boolean) & import("memoizee").Memoized<(color: string) => boolean>;
|
|
129
130
|
drawHeaders(context: CanvasRenderingContext2D, state: GridRenderState): void;
|
|
130
131
|
drawFooters(context: CanvasRenderingContext2D, state: GridRenderState): void;
|
|
131
132
|
drawColumnHeaders(context: CanvasRenderingContext2D, state: GridRenderState): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GridRenderer.d.ts","sourceRoot":"","sources":["../src/GridRenderer.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"GridRenderer.d.ts","sourceRoot":"","sources":["../src/GridRenderer.ts"],"names":[],"mappings":"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"}
|
package/dist/GridRenderer.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
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; }
|
|
2
2
|
|
|
3
3
|
import clamp from 'lodash.clamp';
|
|
4
|
+
import { ColorUtils } from '@deephaven/utils';
|
|
4
5
|
import memoizeClear from "./memoizeClear.js";
|
|
5
6
|
import GridUtils from "./GridUtils.js";
|
|
6
7
|
import GridColorUtils from "./GridColorUtils.js";
|
|
@@ -41,6 +42,10 @@ export class GridRenderer {
|
|
|
41
42
|
_defineProperty(this, "getCachedColorWithAlpha", memoizeClear((color, alpha) => GridColorUtils.colorWithAlpha(color, alpha), {
|
|
42
43
|
max: 1000
|
|
43
44
|
}));
|
|
45
|
+
|
|
46
|
+
_defineProperty(this, "getCachedColorIsDark", memoizeClear(color => ColorUtils.isDark(color), {
|
|
47
|
+
max: 1000
|
|
48
|
+
}));
|
|
44
49
|
}
|
|
45
50
|
|
|
46
51
|
/**
|
|
@@ -1298,9 +1303,6 @@ export class GridRenderer {
|
|
|
1298
1303
|
movedColumns
|
|
1299
1304
|
} = metrics;
|
|
1300
1305
|
var {
|
|
1301
|
-
headerBackgroundColor,
|
|
1302
|
-
headerColor,
|
|
1303
|
-
headerSeparatorColor,
|
|
1304
1306
|
columnHeaderHeight,
|
|
1305
1307
|
columnWidth
|
|
1306
1308
|
} = theme;
|
|
@@ -1324,10 +1326,7 @@ export class GridRenderer {
|
|
|
1324
1326
|
|
|
1325
1327
|
if (depth === 0) {
|
|
1326
1328
|
// Make sure base column header background always goes to the right edge
|
|
1327
|
-
this.drawColumnHeader(context, state, '', minX, maxX
|
|
1328
|
-
backgroundColor: headerBackgroundColor,
|
|
1329
|
-
separatorColor: headerSeparatorColor
|
|
1330
|
-
}); // Draw base column headers
|
|
1329
|
+
this.drawColumnHeader(context, state, '', minX, maxX); // Draw base column headers
|
|
1331
1330
|
|
|
1332
1331
|
for (var i = startIndex; i <= endIndex; i += 1) {
|
|
1333
1332
|
this.drawColumnHeaderAtIndex(context, state, i, bounds);
|
|
@@ -1402,9 +1401,7 @@ export class GridRenderer {
|
|
|
1402
1401
|
}
|
|
1403
1402
|
|
|
1404
1403
|
this.drawColumnHeader(context, state, columnGroupName, x, Math.min(columnGroupRight - columnGroupLeft, visibleWidth), {
|
|
1405
|
-
backgroundColor: columnGroupColor !== null && columnGroupColor !== void 0 ? columnGroupColor :
|
|
1406
|
-
textColor: headerColor,
|
|
1407
|
-
separatorColor: headerSeparatorColor
|
|
1404
|
+
backgroundColor: columnGroupColor !== null && columnGroupColor !== void 0 ? columnGroupColor : undefined
|
|
1408
1405
|
}, bounds);
|
|
1409
1406
|
}
|
|
1410
1407
|
|
|
@@ -1428,8 +1425,7 @@ export class GridRenderer {
|
|
|
1428
1425
|
|
|
1429
1426
|
var {
|
|
1430
1427
|
metrics,
|
|
1431
|
-
model
|
|
1432
|
-
theme
|
|
1428
|
+
model
|
|
1433
1429
|
} = state;
|
|
1434
1430
|
var {
|
|
1435
1431
|
modelColumns,
|
|
@@ -1441,20 +1437,13 @@ export class GridRenderer {
|
|
|
1441
1437
|
var x = getOrThrow(visibleColumnXs, index) + gridX;
|
|
1442
1438
|
var modelColumn = getOrThrow(modelColumns, index);
|
|
1443
1439
|
var text = model.textForColumnHeader(modelColumn);
|
|
1444
|
-
var {
|
|
1445
|
-
headerBackgroundColor,
|
|
1446
|
-
headerColor,
|
|
1447
|
-
headerSeparatorColor
|
|
1448
|
-
} = theme;
|
|
1449
1440
|
|
|
1450
1441
|
if (text == null) {
|
|
1451
1442
|
return;
|
|
1452
1443
|
}
|
|
1453
1444
|
|
|
1454
1445
|
this.drawColumnHeader(context, state, text, x, width, {
|
|
1455
|
-
backgroundColor: (_model$colorForColumn = model.colorForColumnHeader(modelColumn)) !== null && _model$colorForColumn !== void 0 ? _model$colorForColumn :
|
|
1456
|
-
textColor: headerColor,
|
|
1457
|
-
separatorColor: headerSeparatorColor
|
|
1446
|
+
backgroundColor: (_model$colorForColumn = model.colorForColumnHeader(modelColumn)) !== null && _model$colorForColumn !== void 0 ? _model$colorForColumn : undefined
|
|
1458
1447
|
}, bounds);
|
|
1459
1448
|
}
|
|
1460
1449
|
|
|
@@ -1469,7 +1458,12 @@ export class GridRenderer {
|
|
|
1469
1458
|
} = state;
|
|
1470
1459
|
var {
|
|
1471
1460
|
headerHorizontalPadding,
|
|
1472
|
-
columnHeaderHeight
|
|
1461
|
+
columnHeaderHeight,
|
|
1462
|
+
headerBackgroundColor,
|
|
1463
|
+
headerColor,
|
|
1464
|
+
headerSeparatorColor,
|
|
1465
|
+
black,
|
|
1466
|
+
white
|
|
1473
1467
|
} = theme;
|
|
1474
1468
|
var {
|
|
1475
1469
|
fontWidths,
|
|
@@ -1479,10 +1473,26 @@ export class GridRenderer {
|
|
|
1479
1473
|
var maxWidth = columnWidth - headerHorizontalPadding * 2;
|
|
1480
1474
|
var maxLength = maxWidth / fontWidth;
|
|
1481
1475
|
var {
|
|
1482
|
-
backgroundColor,
|
|
1483
|
-
|
|
1484
|
-
|
|
1476
|
+
backgroundColor = headerBackgroundColor,
|
|
1477
|
+
separatorColor = headerSeparatorColor
|
|
1478
|
+
} = style !== null && style !== void 0 ? style : {};
|
|
1479
|
+
var {
|
|
1480
|
+
textColor = headerColor
|
|
1485
1481
|
} = style !== null && style !== void 0 ? style : {};
|
|
1482
|
+
|
|
1483
|
+
try {
|
|
1484
|
+
var isDarkBackground = this.getCachedColorIsDark(backgroundColor);
|
|
1485
|
+
var isDarkText = this.getCachedColorIsDark(textColor);
|
|
1486
|
+
|
|
1487
|
+
if (isDarkBackground && isDarkText) {
|
|
1488
|
+
textColor = white;
|
|
1489
|
+
} else if (!isDarkBackground && !isDarkText) {
|
|
1490
|
+
textColor = black;
|
|
1491
|
+
}
|
|
1492
|
+
} catch (_unused) {// Invalid color provided
|
|
1493
|
+
// no-op since we don't use logging in base grid
|
|
1494
|
+
}
|
|
1495
|
+
|
|
1486
1496
|
var {
|
|
1487
1497
|
minX = 0,
|
|
1488
1498
|
maxX = width
|
package/dist/GridRenderer.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GridRenderer.js","names":["clamp","memoizeClear","GridUtils","GridColorUtils","isExpandableGridModel","getOrThrow","isEditableGridModel","GridColumnSeparatorMouseHandler","GridRenderer","context","text","width","fontWidth","truncationChar","truncateToWidth","max","backgroundColors","maxDepth","split","map","color","colors","i","push","darkenForDepth","alpha","colorWithAlpha","truncate","str","len","length","substr","binaryTruncateToWidth","start","end","measureText","charWidth","repeat","Math","floor","lo","hi","min","result","mid","ceil","truncatedStr","DEFAULT_FONT_WIDTH","drawCanvas","state","save","configureContext","drawBackground","drawGrid","drawHeaders","drawFooters","drawDraggingColumn","drawDraggingRow","drawScrollBars","restore","theme","font","textBaseline","lineCap","metrics","height","fillStyle","backgroundColor","fillRect","draggingRow","draggingColumn","gridX","gridY","translate","drawGridBackground","drawCellContents","drawFloatingRows","drawFloatingColumns","floatingTopRowCount","floatingBottomRowCount","floatingRows","rowCount","visibleColumns","visibleRowYs","visibleRowHeights","floatingRowBackgroundColors","drawRowStripesForRows","drawFloatingMouseRowHover","drawGridLinesForItems","floatingGridColumnColor","floatingGridRowColor","drawCellBackgroundsForItems","drawFloatingBorders","drawSelectedRanges","top","bottom","maxY","minY","c","column","r","row","drawCellContent","floatingLeftColumnCount","floatingRightColumnCount","floatingLeftWidth","floatingRightWidth","floatingColumns","maxX","columnCount","visibleRows","visibleColumnXs","visibleColumnWidths","beginPath","rect","clip","left","right","minX","floatingDividerOuterColor","floatingDividerInnerColor","lineWidth","strokeStyle","y","moveTo","lineTo","x","stroke","drawHover","drawRowStripes","drawMouseColumnHover","drawMouseRowHover","drawGridLines","drawCellBackgrounds","has","rowBackgroundColors","rows","model","shadowBlur","shadowColor","colorSets","getCachedBackgroundColors","colorRowMap","Map","topShadowRows","bottomShadowRows","addRowToColorMap","rowAbove","depth","depthForRow","colorSet","set","get","depthAbove","undefined","forEach","colorRows","rowHeight","fill","startColor","getCachedColorWithAlpha","endColor","gradient","createLinearGradient","addColorStop","gradientY","mouseX","mouseY","mouseColumn","getColumnAtX","columnHoverBackgroundColor","columnWidth","rowHoverBackgroundColor","mouseRow","getRowAtY","drawMouseRowHoverForRow","rowFooterWidth","selectedRanges","startRow","endRow","selectedRowHoverBackgroundColor","gridColumnColor","gridRowColor","columns","columnColor","rowColor","drawGridLinesForColumns","drawGridLinesForRows","metricsMaxX","j","rowAfter","drawCellBackground","firstColumn","modelColumns","modelRows","modelRow","modelColumn","backgroundColorForCell","isFirstColumn","hasExpandableRows","drawCellRowTreeDepthLines","drawColumnCellContents","getTextRenderMetrics","textAlign","cellHorizontalPadding","treeDepthIndent","treeHorizontalPadding","treeIndent","textWidth","textX","textY","textOverride","fontWidths","textColor","textForCell","truncationCharForCell","textAlignForCell","colorForCell","truncatedText","getCachedTruncatedString","fillText","drawCellRowTreeMarker","visibleRowTreeBoxes","treeMarkerColor","treeMarkerHoverColor","columnX","rowY","isRowExpandable","treeBox","drawTreeMarker","isRowExpanded","isExpanded","x1","y1","x2","y2","markerText","treeLineColor","depthRowAfter","depthDiff","lineX","headerFont","drawColumnHeaders","drawRowHeaders","drawRowFooters","draggingColumnSeparator","isDragging","columnHeaderHeight","columnHeaderMaxDepth","headerHiddenSeparatorSize","headerHiddenSeparatorHoverColor","headerSeparatorColor","headerSeparatorHoverColor","hiddenSeparatorHeight","hiddenY","containsFrozenColumns","drawColumnHeadersForRange","hiddenColumns","entries","filter","_","w","index","highlightedSeparator","separator","getColumnSeparator","getGridPointFromXY","shouldDrawSeparator","columnIndex","nextColumnIndex","textForColumnHeader","visibleColumnIndex","indexOf","nextColumn","nextColumnWidth","isColumnHidden","isNextColumnHidden","range","bounds","d","drawColumnHeadersAtDepth","calculatedColumnWidths","userColumnWidths","movedColumns","headerBackgroundColor","headerColor","visibleWidth","startIndex","endIndex","drawColumnHeader","separatorColor","drawColumnHeaderAtIndex","columnGroupName","columnGroupColor","colorForColumnHeader","columnGroupLeft","columnGroupRight","prevColumnIndex","prevModelIndex","getModelIndex","prevColumnWidth","nextModelIndex","isFullWidth","columnText","style","headerHorizontalPadding","maxWidth","maxLength","renderText","substring","columnLeft","visibleLeft","columnRight","visibleRight","isBeyondLeft","isBeyondRight","draggingRowSeparator","rowHeaderWidth","hiddenSeparatorWidth","hiddenX","hiddenRows","isPreviousRowHidden","getRowSeparatorIndex","visibleRowIndex","nextRow","nextRowHeight","isRowHidden","isNextRowHidden","drawRowHeader","textForRowHeader","verticalBarWidth","textForRowFooter","viewport","cursorColumn","cursorRow","editingCell","isCursorVisible","isEditable","h","selectedRange","startColumn","endColumn","round","endX","endY","selectionColor","selectionOutlineCasingColor","selectionOutlineColor","drawActiveCell","borderWidth","ACTIVE_CELL_BORDER_WIDTH","cellX","cellY","cellW","cellH","drawRoundedRect","DEFAULT_EDGE_RADIUS","quadraticCurveTo","closePath","draggingColumnVisibleRange","draggingColumnDepth","draggingModelIndex","draggingGroup","getColumnHeaderGroup","originalLeft","originalRight","originalWidth","draggingLeft","reorderOffset","columnHeaderOffset","draggingRowOffset","isDraggingHorizontalScrollBar","isDraggingVerticalScrollBar","scrollBarSize","handleHeight","handleWidth","scrollX","scrollY","hasHorizontalBar","hasVerticalBar","barWidth","barHeight","scrollBarBackgroundColor","scrollBarHoverBackgroundColor","scrollBarCasingColor","scrollBarCornerColor","scrollBarColor","scrollBarHoverColor","scrollBarActiveColor","scrollBarHoverSize","scrollBarCasingWidth","scrollBarSelectionTick","scrollBarSelectionTickColor","scrollBarActiveSelectionTickColor","autoSelectRow","autoSelectColumn","isInbounds","isVerticalBarHover","isHorizontalBarHover","hScrollBarSize","vScrollBarSize","lastLeft","filteredRanges","value","sortedRanges","sort","compareRanges","mergedRanges","mergeSortedRanges","getTickX","tickX","tickWidth","trackHeight","lastTop","getTickY","tickY","trackWidth","tickHeight"],"sources":["../src/GridRenderer.ts"],"sourcesContent":["import clamp from 'lodash.clamp';\nimport memoizeClear from './memoizeClear';\nimport GridUtils from './GridUtils';\nimport GridColorUtils from './GridColorUtils';\nimport { isExpandableGridModel } from './ExpandableGridModel';\nimport {\n GridColor,\n GridColorWay,\n GridTheme,\n NullableGridColor,\n} from './GridTheme';\nimport GridModel from './GridModel';\nimport GridRange from './GridRange';\nimport GridMetrics, {\n BoxCoordinates,\n Coordinate,\n VisibleIndex,\n} from './GridMetrics';\nimport { getOrThrow } from './GridMetricCalculator';\nimport { isEditableGridModel } from './EditableGridModel';\nimport type { GridSeparator } from './mouse-handlers/GridSeparatorMouseHandler';\nimport { DraggingColumn } from './mouse-handlers/GridColumnMoveMouseHandler';\nimport GridColumnSeparatorMouseHandler from './mouse-handlers/GridColumnSeparatorMouseHandler';\nimport { BoundedAxisRange } from './GridAxisRange';\n\nexport type EditingCellTextSelectionRange = [start: number, end: number];\n\ntype NoneNullColumnRange = { startColumn: number; endColumn: number };\n\ntype NoneNullRowRange = { startRow: number; endRow: number };\n\nexport type EditingCell = {\n // Index of the editing cell\n column: VisibleIndex;\n row: VisibleIndex;\n\n // Selection within the text\n selectionRange?: EditingCellTextSelectionRange;\n\n // The value to use for the edit\n value: string;\n\n // Whether the selection was triggered with a quick edit action (e.g. Start typing with the cell in focus)\n isQuickEdit?: boolean;\n};\n\nexport type GridRenderState = {\n // The top/left cell of the scrolled viewport\n left: VisibleIndex;\n top: VisibleIndex;\n\n // Width and height of the total canvas area\n width: number;\n height: number;\n\n // The canvas context\n context: CanvasRenderingContext2D;\n\n // The grid theme\n theme: GridTheme;\n\n // The model used by the grid\n model: GridModel;\n\n // The grid metrics\n metrics: GridMetrics;\n\n // Location of the mouse on the grid\n mouseX: Coordinate | null;\n mouseY: Coordinate | null;\n\n // Where the keyboard cursor is located\n cursorColumn: VisibleIndex | null;\n cursorRow: VisibleIndex | null;\n\n // Currently selected ranges\n selectedRanges: GridRange[];\n\n // Currently dragged column/row information\n draggingColumn: DraggingColumn | null;\n draggingColumnSeparator: GridSeparator | null;\n draggingRow: VisibleIndex | null;\n draggingRowOffset: number | null;\n draggingRowSeparator: GridSeparator | null;\n\n // The currently editing cell\n editingCell: EditingCell | null;\n isDraggingHorizontalScrollBar: boolean;\n isDraggingVerticalScrollBar: boolean;\n isDragging: boolean;\n};\n\n/* eslint react/destructuring-assignment: \"off\" */\n/* eslint class-methods-use-this: \"off\" */\n/* eslint no-param-reassign: \"off\" */\n/**\n * A GridRenderer handles rendering the different parts of the grid\n * This default rendering just renders a basic grid. Extend this class and implement\n * your own methods to customize drawing of the grid (eg. Draw icons or special features)\n */\nexport class GridRenderer {\n // Default font width in pixels if it cannot be retrieved from the context\n static DEFAULT_FONT_WIDTH = 10;\n\n // Default radius in pixels for corners for some elements (like the active cell)\n static DEFAULT_EDGE_RADIUS = 2;\n\n // Default width in pixels for the border of the active cell\n static ACTIVE_CELL_BORDER_WIDTH = 2;\n\n /**\n * Truncate a string to the specified length and add ellipses if necessary\n * @param str The string to truncate\n * @param len The length to truncate the string to. If longer than the actual string, just returns the string\n * @returns The truncated string\n */\n static truncate(str: string, len: number): string {\n if (len < str.length) {\n // eslint-disable-next-line prefer-template\n return str.substr(0, len) + '…';\n }\n return str;\n }\n\n /**\n * Uses binary search to truncate a string to fit in the provided width\n * @param context The drawing context to measure the text in\n * @param str The string to get the maximum length it can draw\n * @param width The width to truncate it to\n * @param start The low boundary to start the search\n * @param end The high boundary to start the search\n * @param truncationChar This char will be repeated as the display string if the string is truncated instead of just adding an ellipsis\n * @returns The truncated string\n */\n static binaryTruncateToWidth(\n context: CanvasRenderingContext2D,\n str: string,\n width: number,\n start = 0,\n end = str.length,\n truncationChar?: string\n ): string {\n if (end >= str.length && context.measureText(str).width <= width) {\n // IDS-6069 If the whole string can fit, don't bother checking for truncation\n // The ellipses are actually slightly wider than other chars, and it's possible\n // that the \"truncation\" ends up being slightly longer, which messes up the search\n // algorithm below.\n // Besides, if we already fit, it's just faster to not bother checking other truncations.\n return str;\n }\n\n if (truncationChar) {\n const charWidth = context.measureText(truncationChar).width;\n return truncationChar.repeat(Math.max(1, Math.floor(width / charWidth)));\n }\n\n let lo = start;\n let hi = Math.min(str.length - 1, end);\n let result = str;\n while (hi >= lo) {\n const mid = Math.ceil((hi + lo) / 2);\n const truncatedStr = GridRenderer.truncate(str, mid);\n if (context.measureText(truncatedStr).width <= width) {\n result = truncatedStr;\n if (lo === mid) {\n break;\n }\n lo = mid;\n } else if (mid === 0) {\n // We already truncated to zero chars and it still doesn't fit, no need to keep looking\n result = truncatedStr;\n break;\n } else {\n hi = mid - 1;\n }\n }\n\n return result;\n }\n\n /**\n * Truncate a string (if necessary) to fit in the specified width.\n * First uses the estimated font width to calculate a lower/upper bound\n * Then uses binary search within those bounds to find the exact max length\n * @param context The drawing context\n * @param str The string to calculate max length for\n * @param width The width to truncate within\n * @param fontWidth The estimated width of each character\n * @param truncationChar This char will be repeated as the display string if the string is truncated instead of just adding an ellipsis\n * @returns The truncated string that fits within the width provided\n */\n static truncateToWidth(\n context: CanvasRenderingContext2D,\n str: string,\n width: number,\n fontWidth = GridRenderer.DEFAULT_FONT_WIDTH,\n truncationChar?: string\n ): string {\n if (width <= 0 || str.length <= 0) {\n return '';\n }\n\n // Estimate the possible low and high boundaries for truncating the text\n // Use the width of the space divided by the estimated width of each character,\n // and take half that as the low (minus 5 just to be extra safe), and double that as the high.\n const lo = Math.min(\n Math.max(0, Math.floor(width / fontWidth / 2) - 5),\n str.length\n );\n const hi = Math.min(Math.ceil((width / fontWidth) * 2), str.length);\n\n return GridRenderer.binaryTruncateToWidth(\n context,\n str,\n width,\n lo,\n hi,\n truncationChar\n );\n }\n\n /**\n * Draw the grid canvas with the state provided\n * @param state The state of the grid\n */\n drawCanvas(state: GridRenderState): void {\n const { context } = state;\n\n context.save();\n\n this.configureContext(context, state);\n\n this.drawBackground(context, state);\n\n this.drawGrid(context, state);\n\n this.drawHeaders(context, state);\n\n this.drawFooters(context, state);\n\n this.drawDraggingColumn(context, state);\n\n this.drawDraggingRow(context, state);\n\n this.drawScrollBars(context, state);\n\n context.restore();\n }\n\n configureContext(\n context: CanvasRenderingContext2D,\n state: GridRenderState\n ): void {\n const { theme } = state;\n context.font = theme.font;\n context.textBaseline = 'middle';\n context.lineCap = 'butt';\n }\n\n drawBackground(\n context: CanvasRenderingContext2D,\n state: GridRenderState\n ): void {\n const { theme, metrics } = state;\n const { width, height } = metrics;\n context.fillStyle = theme.backgroundColor;\n context.fillRect(0, 0, width, height);\n }\n\n drawGrid(context: CanvasRenderingContext2D, state: GridRenderState): void {\n const { metrics, draggingRow, draggingColumn } = state;\n const { gridX, gridY } = metrics;\n\n context.translate(gridX, gridY);\n\n this.drawGridBackground(\n context,\n state,\n draggingRow == null && draggingColumn == null\n );\n\n this.drawCellContents(context, state);\n\n this.drawFloatingRows(context, state);\n\n this.drawFloatingColumns(context, state);\n\n context.translate(-gridX, -gridY);\n }\n\n drawFloatingRows(\n context: CanvasRenderingContext2D,\n state: GridRenderState\n ): void {\n const { draggingRow, draggingColumn, metrics, theme } = state;\n const {\n floatingTopRowCount,\n floatingBottomRowCount,\n floatingRows,\n rowCount,\n visibleColumns,\n visibleRowYs,\n visibleRowHeights,\n } = metrics;\n\n if (floatingRows.length === 0) {\n return;\n }\n\n if (theme.floatingRowBackgroundColors) {\n this.drawRowStripesForRows(\n context,\n state,\n floatingRows,\n theme.floatingRowBackgroundColors\n );\n }\n\n if (draggingRow == null && draggingColumn == null) {\n this.drawFloatingMouseRowHover(context, state);\n }\n\n this.drawGridLinesForItems(\n context,\n state,\n visibleColumns,\n floatingRows,\n theme.floatingGridColumnColor,\n theme.floatingGridRowColor\n );\n\n this.drawCellBackgroundsForItems(\n context,\n state,\n visibleColumns,\n floatingRows\n );\n\n this.drawFloatingBorders(context, state);\n\n // Draw the floating row selection...\n if (floatingTopRowCount > 0) {\n this.drawSelectedRanges(context, state, {\n top: 0,\n bottom: floatingTopRowCount - 1,\n maxY:\n getOrThrow(visibleRowYs, floatingTopRowCount - 1) +\n getOrThrow(visibleRowHeights, floatingTopRowCount - 1) -\n 0.5,\n });\n }\n if (floatingBottomRowCount > 0) {\n this.drawSelectedRanges(context, state, {\n top: rowCount - floatingBottomRowCount - 1,\n bottom: rowCount - 1,\n minY: getOrThrow(visibleRowYs, rowCount - floatingBottomRowCount) + 0.5,\n maxY:\n getOrThrow(visibleRowYs, rowCount - 1) +\n getOrThrow(visibleRowHeights, rowCount - 1) -\n 0.5,\n });\n }\n\n // Draw the cell content...\n for (let c = 0; c < visibleColumns.length; c += 1) {\n const column = visibleColumns[c];\n for (let r = 0; r < floatingRows.length; r += 1) {\n const row = floatingRows[r];\n this.drawCellContent(context, state, column, row);\n }\n }\n }\n\n drawFloatingColumns(\n context: CanvasRenderingContext2D,\n state: GridRenderState\n ): void {\n const { draggingRow, draggingColumn, metrics, theme } = state;\n const {\n floatingLeftColumnCount,\n floatingRightColumnCount,\n floatingLeftWidth,\n floatingRightWidth,\n floatingColumns,\n gridX,\n maxX,\n columnCount,\n visibleRows,\n visibleColumnXs,\n visibleColumnWidths,\n width,\n height,\n } = metrics;\n\n if (floatingColumns.length === 0) {\n return;\n }\n\n if (theme.floatingRowBackgroundColors) {\n this.drawRowStripesForRows(\n context,\n state,\n visibleRows,\n theme.floatingRowBackgroundColors,\n 0,\n floatingLeftWidth\n );\n this.drawRowStripesForRows(\n context,\n state,\n visibleRows,\n theme.floatingRowBackgroundColors,\n width - gridX - floatingRightWidth,\n maxX\n );\n }\n\n if (draggingRow == null && draggingColumn == null) {\n this.drawFloatingMouseRowHover(context, state);\n }\n\n // Clip floated column grid lines.\n context.save();\n context.beginPath();\n context.rect(0, 0, floatingLeftWidth, height);\n context.clip();\n\n this.drawGridLinesForItems(\n context,\n state,\n floatingColumns,\n visibleRows,\n theme.floatingGridColumnColor,\n theme.floatingGridRowColor\n );\n\n context.restore();\n\n this.drawCellBackgroundsForItems(\n context,\n state,\n floatingColumns,\n visibleRows\n );\n\n this.drawFloatingBorders(context, state);\n\n // Draw the floating column selection...\n if (floatingLeftColumnCount > 0) {\n this.drawSelectedRanges(context, state, {\n left: 0,\n maxX:\n getOrThrow(visibleColumnXs, floatingLeftColumnCount - 1) +\n getOrThrow(visibleColumnWidths, floatingLeftColumnCount - 1),\n });\n }\n if (floatingRightColumnCount > 0) {\n this.drawSelectedRanges(context, state, {\n left: columnCount - floatingRightColumnCount,\n right: columnCount - 1,\n minX:\n getOrThrow(visibleColumnXs, columnCount - floatingRightColumnCount) +\n 0.5,\n maxX:\n getOrThrow(visibleColumnXs, columnCount - 1) +\n getOrThrow(visibleColumnWidths, columnCount - 1),\n });\n }\n\n // Draw the cell content...\n for (let c = 0; c < floatingColumns.length; c += 1) {\n const column = floatingColumns[c];\n for (let r = 0; r < visibleRows.length; r += 1) {\n const row = visibleRows[r];\n this.drawCellContent(context, state, column, row);\n }\n }\n }\n\n drawFloatingBorders(\n context: CanvasRenderingContext2D,\n state: GridRenderState\n ): void {\n const { metrics, theme } = state;\n const {\n floatingTopRowCount,\n floatingBottomRowCount,\n floatingLeftColumnCount,\n floatingRightColumnCount,\n rowCount,\n columnCount,\n visibleRowYs,\n visibleColumnXs,\n visibleRowHeights,\n visibleColumnWidths,\n maxX,\n maxY,\n } = metrics;\n const { floatingDividerOuterColor, floatingDividerInnerColor } = theme;\n\n context.lineWidth = 3;\n context.beginPath();\n context.strokeStyle = floatingDividerOuterColor;\n\n if (floatingTopRowCount > 0) {\n const y =\n getOrThrow(visibleRowYs, floatingTopRowCount - 1) +\n getOrThrow(visibleRowHeights, floatingTopRowCount - 1) +\n 0.5;\n context.moveTo(0, y);\n context.lineTo(maxX, y);\n }\n\n if (floatingBottomRowCount > 0) {\n const y =\n getOrThrow(visibleRowYs, rowCount - floatingBottomRowCount) - 0.5;\n context.moveTo(0, y);\n context.lineTo(maxX, y);\n }\n\n if (floatingLeftColumnCount > 0) {\n const x =\n getOrThrow(visibleColumnXs, floatingLeftColumnCount - 1) +\n getOrThrow(visibleColumnWidths, floatingLeftColumnCount - 1) +\n 0.5;\n context.moveTo(x, 0);\n context.lineTo(x, maxY);\n }\n\n if (floatingRightColumnCount > 0) {\n const x =\n getOrThrow(visibleColumnXs, columnCount - floatingRightColumnCount) -\n 0.5;\n context.moveTo(x, 0);\n context.lineTo(x, maxY);\n }\n\n context.stroke();\n\n context.beginPath();\n context.lineWidth = 1;\n context.strokeStyle = floatingDividerInnerColor;\n\n if (floatingTopRowCount > 0) {\n const y =\n getOrThrow(visibleRowYs, floatingTopRowCount - 1) +\n getOrThrow(visibleRowHeights, floatingTopRowCount - 1) +\n 0.5;\n context.moveTo(0, y);\n context.lineTo(maxX, y);\n }\n\n if (floatingBottomRowCount > 0) {\n const y =\n getOrThrow(visibleRowYs, rowCount - floatingBottomRowCount) - 0.5;\n context.moveTo(0, y);\n context.lineTo(maxX, y);\n }\n\n if (floatingLeftColumnCount > 0) {\n const x =\n getOrThrow(visibleColumnXs, floatingLeftColumnCount - 1) +\n getOrThrow(visibleColumnWidths, floatingLeftColumnCount - 1) +\n 0.5;\n context.moveTo(x, 0);\n context.lineTo(x, maxY);\n }\n\n if (floatingRightColumnCount > 0) {\n const x =\n getOrThrow(visibleColumnXs, columnCount - floatingRightColumnCount) -\n 0.5;\n context.moveTo(x, 0);\n context.lineTo(x, maxY);\n }\n\n context.stroke();\n }\n\n drawGridBackground(\n context: CanvasRenderingContext2D,\n state: GridRenderState,\n drawHover = false\n ): void {\n this.drawRowStripes(context, state);\n\n if (drawHover) {\n this.drawMouseColumnHover(context, state);\n\n this.drawMouseRowHover(context, state);\n }\n\n this.drawGridLines(context, state);\n\n this.drawCellBackgrounds(context, state);\n\n const { metrics } = state;\n const {\n bottom,\n right,\n floatingBottomRowCount,\n floatingLeftColumnCount,\n floatingRightColumnCount,\n floatingTopRowCount,\n columnCount,\n rowCount,\n visibleRowHeights,\n visibleRowYs,\n visibleColumnXs,\n visibleColumnWidths,\n width,\n height,\n } = metrics;\n this.drawSelectedRanges(context, state, {\n bottom: Math.min(bottom, rowCount - floatingBottomRowCount - 1),\n right: Math.min(right, columnCount - floatingRightColumnCount - 1),\n minX:\n floatingLeftColumnCount > 0 &&\n visibleColumnXs.has(floatingLeftColumnCount + 1)\n ? getOrThrow(visibleColumnXs, floatingLeftColumnCount + 1)\n : -10,\n minY:\n floatingTopRowCount > 0 && visibleRowYs.has(floatingTopRowCount + 1)\n ? getOrThrow(visibleRowYs, floatingTopRowCount + 1)\n : -10,\n maxX:\n floatingRightColumnCount > 0 &&\n visibleColumnXs.has(columnCount - floatingRightColumnCount - 1)\n ? getOrThrow(\n visibleColumnXs,\n columnCount - floatingRightColumnCount - 1\n ) +\n getOrThrow(\n visibleColumnWidths,\n columnCount - floatingRightColumnCount - 1\n ) -\n 0.5\n : width + 10,\n maxY:\n floatingBottomRowCount > 0 &&\n visibleRowYs.has(rowCount - floatingBottomRowCount - 1)\n ? getOrThrow(visibleRowYs, rowCount - floatingBottomRowCount - 1) +\n getOrThrow(\n visibleRowHeights,\n rowCount - floatingBottomRowCount - 1\n ) -\n 0.5\n : height + 10,\n });\n }\n\n drawRowStripes(\n context: CanvasRenderingContext2D,\n state: GridRenderState\n ): void {\n const { metrics, theme } = state;\n const { visibleRows } = metrics;\n const { rowBackgroundColors } = theme;\n if (!rowBackgroundColors) {\n return;\n }\n this.drawRowStripesForRows(\n context,\n state,\n visibleRows,\n rowBackgroundColors\n );\n }\n\n drawRowStripesForRows(\n context: CanvasRenderingContext2D,\n state: GridRenderState,\n rows: VisibleIndex[],\n rowBackgroundColors: GridColorWay,\n minX = 0,\n maxX = state.metrics.maxX\n ): void {\n const { theme, metrics, model } = state;\n const { maxDepth, shadowBlur, shadowColor } = theme;\n\n const colorSets = this.getCachedBackgroundColors(\n rowBackgroundColors,\n maxDepth\n );\n const { visibleRowYs, visibleRowHeights } = metrics;\n\n // Optimize by grouping together all rows that end up with the same color\n const colorRowMap = new Map();\n const topShadowRows: VisibleIndex[] = []; // Rows that are deeper than the row above them\n const bottomShadowRows: VisibleIndex[] = [];\n const addRowToColorMap = (\n row: VisibleIndex,\n rowAbove?: VisibleIndex\n ): void => {\n const depth = isExpandableGridModel(model) ? model.depthForRow(row) : 0;\n const colorSet = colorSets[row % colorSets.length];\n const color = colorSet[Math.min(depth, colorSet.length - 1)];\n if (!colorRowMap.has(color)) {\n colorRowMap.set(color, []);\n }\n colorRowMap.get(color).push(row);\n if (rowAbove != null) {\n const depthAbove = isExpandableGridModel(model)\n ? model.depthForRow(rowAbove)\n : 0;\n if (depthAbove < depth) {\n topShadowRows.push(row);\n } else if (depthAbove > depth) {\n bottomShadowRows.push(rowAbove);\n }\n }\n };\n\n // Add all the regular row stripes\n for (let i = 0; i < rows.length; i += 1) {\n const row = rows[i];\n const rowAbove = i > 0 ? rows[i - 1] : undefined;\n addRowToColorMap(row, rowAbove);\n }\n\n colorRowMap.forEach((colorRows, color) => {\n context.fillStyle = color;\n\n context.beginPath();\n\n for (let i = 0; i < colorRows.length; i += 1) {\n const row = colorRows[i];\n const y = getOrThrow(visibleRowYs, row);\n const rowHeight = getOrThrow(visibleRowHeights, row);\n context.rect(minX, y, maxX, rowHeight);\n }\n\n context.fill();\n });\n\n if (topShadowRows.length > 0) {\n context.save();\n\n const startColor = this.getCachedColorWithAlpha(shadowColor, 0.15);\n const endColor = this.getCachedColorWithAlpha(shadowColor, 0);\n const gradient = context.createLinearGradient(0, 0, 0, shadowBlur);\n gradient.addColorStop(0, startColor);\n gradient.addColorStop(1, endColor);\n context.fillStyle = gradient;\n\n for (let i = 0; i < topShadowRows.length; i += 1) {\n const row = topShadowRows[i];\n const y = getOrThrow(visibleRowYs, row);\n // Use a translate so we can reuse the gradient\n context.translate(0, y);\n context.fillRect(minX, 0, maxX, shadowBlur);\n context.translate(0, -y);\n }\n\n context.restore();\n }\n\n if (bottomShadowRows.length > 0) {\n context.save();\n\n const startColor = this.getCachedColorWithAlpha(shadowColor, 0);\n const endColor = this.getCachedColorWithAlpha(shadowColor, 0.15);\n const gradient = context.createLinearGradient(0, 0, 0, shadowBlur);\n gradient.addColorStop(0, startColor);\n gradient.addColorStop(1, endColor);\n context.fillStyle = gradient;\n\n for (let i = 0; i < bottomShadowRows.length; i += 1) {\n const row = bottomShadowRows[i];\n const y = getOrThrow(visibleRowYs, row);\n const rowHeight = getOrThrow(visibleRowHeights, row);\n const gradientY = y + rowHeight - shadowBlur;\n // Use a translate so we can reuse the gradient\n context.translate(0, gradientY);\n context.fillRect(minX, 0, maxX, shadowBlur);\n context.translate(0, -gradientY);\n }\n\n context.restore();\n }\n }\n\n drawMouseColumnHover(\n context: CanvasRenderingContext2D,\n state: GridRenderState\n ): void {\n const { mouseX, mouseY, theme, metrics } = state;\n if (mouseX == null || mouseY == null) return;\n\n const mouseColumn = GridUtils.getColumnAtX(mouseX, metrics);\n if (mouseColumn == null || !theme.columnHoverBackgroundColor) {\n return;\n }\n\n const { visibleColumnWidths, visibleColumnXs, maxY } = metrics;\n if (mouseY > maxY) {\n return;\n }\n\n const x = getOrThrow(visibleColumnXs, mouseColumn);\n const columnWidth = getOrThrow(visibleColumnWidths, mouseColumn);\n\n context.fillStyle = theme.columnHoverBackgroundColor;\n context.fillRect(x, 0, columnWidth, maxY);\n }\n\n drawMouseRowHover(\n context: CanvasRenderingContext2D,\n state: GridRenderState\n ): void {\n const { mouseX, mouseY, theme, metrics } = state;\n if (mouseX == null || mouseY == null) return;\n\n const { maxX } = metrics;\n if (mouseX > maxX || !theme.rowHoverBackgroundColor) {\n return;\n }\n\n const mouseRow = GridUtils.getRowAtY(mouseY, metrics);\n if (mouseRow == null) {\n return;\n }\n\n this.drawMouseRowHoverForRow(context, state, mouseRow);\n }\n\n drawFloatingMouseRowHover(\n context: CanvasRenderingContext2D,\n state: GridRenderState\n ): void {\n const { mouseX, mouseY, theme, metrics } = state;\n const {\n maxX,\n floatingTopRowCount,\n floatingBottomRowCount,\n rowCount,\n rowFooterWidth,\n } = metrics;\n if (\n mouseX == null ||\n mouseY == null ||\n mouseX > maxX + rowFooterWidth ||\n !theme.rowHoverBackgroundColor\n ) {\n return;\n }\n\n const mouseRow = GridUtils.getRowAtY(mouseY, metrics);\n if (\n mouseRow != null &&\n (mouseRow < floatingTopRowCount ||\n rowCount - floatingBottomRowCount <= mouseRow)\n ) {\n this.drawMouseRowHoverForRow(context, state, mouseRow);\n }\n }\n\n drawMouseRowHoverForRow(\n context: CanvasRenderingContext2D,\n state: GridRenderState,\n row: VisibleIndex\n ): void {\n const { metrics, selectedRanges, theme } = state;\n const { visibleRowHeights, visibleRowYs, maxX } = metrics;\n\n const y = getOrThrow(visibleRowYs, row);\n const rowHeight = getOrThrow(visibleRowHeights, row);\n\n if (theme.rowHoverBackgroundColor) {\n context.fillStyle = theme.rowHoverBackgroundColor;\n }\n for (let i = 0; i < selectedRanges.length; i += 1) {\n const { startRow, endRow } = selectedRanges[i];\n if (\n startRow != null &&\n endRow != null &&\n startRow <= row &&\n endRow >= row\n ) {\n if (theme.selectedRowHoverBackgroundColor) {\n context.fillStyle = theme.selectedRowHoverBackgroundColor;\n }\n break;\n }\n }\n context.fillRect(0, y, maxX, rowHeight);\n }\n\n drawGridLines(\n context: CanvasRenderingContext2D,\n state: GridRenderState\n ): void {\n const { metrics, theme } = state;\n const { visibleColumns, visibleRows } = metrics;\n\n this.drawGridLinesForItems(\n context,\n state,\n visibleColumns,\n visibleRows,\n theme.gridColumnColor,\n theme.gridRowColor\n );\n }\n\n drawGridLinesForItems(\n context: CanvasRenderingContext2D,\n state: GridRenderState,\n columns: VisibleIndex[],\n rows: VisibleIndex[],\n columnColor: NullableGridColor,\n rowColor: NullableGridColor\n ): void {\n if (!columnColor && !rowColor) {\n return;\n }\n\n context.lineWidth = 1;\n context.beginPath();\n\n if (columnColor) {\n context.strokeStyle = columnColor;\n this.drawGridLinesForColumns(context, state, columns);\n }\n if (rowColor) {\n context.strokeStyle = rowColor;\n this.drawGridLinesForRows(context, state, rows);\n }\n\n context.stroke();\n }\n\n drawGridLinesForColumns(\n context: CanvasRenderingContext2D,\n state: GridRenderState,\n columns: VisibleIndex[]\n ): void {\n const { metrics } = state;\n const { visibleColumnXs, maxY } = metrics;\n for (let i = 0; i < columns.length; i += 1) {\n const column = columns[i];\n const x = getOrThrow(visibleColumnXs, column) + 0.5;\n context.moveTo(x, 0);\n context.lineTo(x, maxY);\n }\n }\n\n drawGridLinesForRows(\n context: CanvasRenderingContext2D,\n state: GridRenderState,\n rows: VisibleIndex[]\n ): void {\n const { metrics } = state;\n const { visibleRowYs, maxX: metricsMaxX } = metrics;\n const maxX = metricsMaxX;\n\n // Draw row lines\n for (let i = 0; i < rows.length; i += 1) {\n const row = rows[i];\n const y = getOrThrow(visibleRowYs, row) + 0.5;\n context.moveTo(0.5, y);\n context.lineTo(maxX - 0.5, y);\n }\n }\n\n drawCellBackgrounds(\n context: CanvasRenderingContext2D,\n state: GridRenderState\n ): void {\n const { metrics } = state;\n const { visibleColumns, visibleRows } = metrics;\n this.drawCellBackgroundsForItems(\n context,\n state,\n visibleColumns,\n visibleRows\n );\n }\n\n drawCellBackgroundsForItems(\n context: CanvasRenderingContext2D,\n state: GridRenderState,\n columns: VisibleIndex[],\n rows: VisibleIndex[]\n ): void {\n context.save();\n\n for (let i = 0; i < columns.length; i += 1) {\n const column = columns[i];\n\n for (let j = 0; j < rows.length; j += 1) {\n const row = rows[j];\n const rowAfter = j + 1 < rows.length ? rows[j + 1] : undefined;\n this.drawCellBackground(context, state, column, row, rowAfter);\n }\n }\n\n context.restore();\n }\n\n drawCellBackground(\n context: CanvasRenderingContext2D,\n state: GridRenderState,\n column: VisibleIndex,\n row: VisibleIndex,\n rowAfter?: VisibleIndex\n ): void {\n const { metrics, model, theme } = state;\n const {\n firstColumn,\n modelColumns,\n modelRows,\n visibleColumnXs,\n visibleColumnWidths,\n visibleRowYs,\n visibleRowHeights,\n } = metrics;\n const modelRow = getOrThrow(modelRows, row);\n const modelColumn = getOrThrow(modelColumns, column);\n const backgroundColor = model.backgroundColorForCell(\n modelColumn,\n modelRow,\n theme\n );\n const isFirstColumn = column === firstColumn;\n const hasExpandableRows =\n isExpandableGridModel(model) && model.hasExpandableRows;\n\n if (backgroundColor) {\n const x = getOrThrow(visibleColumnXs, column) + 1;\n const y = getOrThrow(visibleRowYs, row) + 1;\n const columnWidth = getOrThrow(visibleColumnWidths, column) - 1;\n const rowHeight = getOrThrow(visibleRowHeights, row) - 1;\n context.fillStyle = backgroundColor;\n context.fillRect(x, y, columnWidth, rowHeight);\n }\n\n if (isFirstColumn && hasExpandableRows) {\n this.drawCellRowTreeDepthLines(context, state, row, rowAfter);\n }\n }\n\n drawCellContents(\n context: CanvasRenderingContext2D,\n state: GridRenderState\n ): void {\n const { metrics } = state;\n const { visibleColumns } = metrics;\n\n for (let i = 0; i < visibleColumns.length; i += 1) {\n const column = visibleColumns[i];\n this.drawColumnCellContents(context, state, column);\n }\n }\n\n drawColumnCellContents(\n context: CanvasRenderingContext2D,\n state: GridRenderState,\n column: VisibleIndex\n ): void {\n const { metrics } = state;\n const {\n visibleColumnXs,\n visibleColumnWidths,\n visibleRows,\n height,\n } = metrics;\n const x = getOrThrow(visibleColumnXs, column);\n const columnWidth = getOrThrow(visibleColumnWidths, column);\n\n context.save();\n\n context.beginPath();\n context.rect(x, 0, columnWidth, height);\n context.clip();\n\n for (let i = 0; i < visibleRows.length; i += 1) {\n const row = visibleRows[i];\n this.drawCellContent(context, state, column, row);\n }\n context.restore();\n }\n\n /**\n * Gets textWidth and X-Y position for a specific cell\n * The textWidth returned is the width that the text can occupy accounting for any other cell markings\n * The width accounts for tree table indents and cell padding, so it is the width the text may consume\n *\n * @param context Canvas context\n * @param state GridRenderState to get the text metrics for\n * @param column Column of cell to get text metrics for\n * @param row Row of cell to get text metrics for\n * @returns Object with width, x, and y of the text\n */\n getTextRenderMetrics(\n context: CanvasRenderingContext2D,\n state: GridRenderState,\n column: VisibleIndex,\n row: VisibleIndex\n ): {\n width: number;\n x: number;\n y: number;\n } {\n const { textAlign } = context;\n const { metrics, model, theme } = state;\n const {\n firstColumn,\n visibleColumnXs,\n visibleColumnWidths,\n visibleRowYs,\n visibleRowHeights,\n } = metrics;\n const {\n cellHorizontalPadding,\n treeDepthIndent,\n treeHorizontalPadding,\n } = theme;\n\n const x = getOrThrow(visibleColumnXs, column);\n const y = getOrThrow(visibleRowYs, row);\n const columnWidth = getOrThrow(visibleColumnWidths, column);\n const rowHeight = getOrThrow(visibleRowHeights, row);\n const isFirstColumn = column === firstColumn;\n let treeIndent = 0;\n if (\n isExpandableGridModel(model) &&\n model.hasExpandableRows &&\n isFirstColumn\n ) {\n treeIndent =\n treeDepthIndent * (model.depthForRow(row) + 1) + treeHorizontalPadding;\n }\n const textWidth = columnWidth - treeIndent;\n let textX = x + cellHorizontalPadding;\n const textY = y + rowHeight * 0.5;\n if (textAlign === 'right') {\n textX = x + textWidth - cellHorizontalPadding;\n } else if (textAlign === 'center') {\n textX = x + textWidth * 0.5;\n }\n textX += treeIndent;\n\n return {\n width: textWidth - cellHorizontalPadding * 2,\n x: textX,\n y: textY,\n };\n }\n\n drawCellContent(\n context: CanvasRenderingContext2D,\n state: GridRenderState,\n column: VisibleIndex,\n row: VisibleIndex,\n textOverride?: string\n ): void {\n const { metrics, model, theme } = state;\n const {\n firstColumn,\n fontWidths,\n modelColumns,\n modelRows,\n visibleRowHeights,\n } = metrics;\n const { textColor } = theme;\n const rowHeight = getOrThrow(visibleRowHeights, row);\n const modelRow = getOrThrow(modelRows, row);\n const modelColumn = getOrThrow(modelColumns, column);\n const text = textOverride ?? model.textForCell(modelColumn, modelRow);\n const truncationChar = model.truncationCharForCell(modelColumn, modelRow);\n const isFirstColumn = column === firstColumn;\n\n if (text && rowHeight > 0) {\n const textAlign = model.textAlignForCell(modelColumn, modelRow) || 'left';\n context.textAlign = textAlign;\n\n const color =\n model.colorForCell(modelColumn, modelRow, theme) || textColor;\n context.fillStyle = color;\n\n const {\n width: textWidth,\n x: textX,\n y: textY,\n } = this.getTextRenderMetrics(context, state, column, row);\n\n const fontWidth =\n fontWidths.get(context.font) ?? GridRenderer.DEFAULT_FONT_WIDTH;\n const truncatedText = this.getCachedTruncatedString(\n context,\n text,\n textWidth,\n fontWidth,\n truncationChar\n );\n if (truncatedText) {\n context.fillText(truncatedText, textX, textY);\n }\n }\n\n if (\n isFirstColumn &&\n isExpandableGridModel(model) &&\n model.hasExpandableRows\n ) {\n this.drawCellRowTreeMarker(context, state, row);\n }\n }\n\n drawCellRowTreeMarker(\n context: CanvasRenderingContext2D,\n state: GridRenderState,\n row: VisibleIndex\n ): void {\n const { metrics, model, mouseX, mouseY, theme } = state;\n const {\n firstColumn,\n gridX,\n gridY,\n visibleColumnXs,\n visibleColumnWidths,\n visibleRowYs,\n visibleRowHeights,\n visibleRowTreeBoxes,\n } = metrics;\n const { treeMarkerColor, treeMarkerHoverColor } = theme;\n const columnX = getOrThrow(visibleColumnXs, firstColumn);\n const columnWidth = getOrThrow(visibleColumnWidths, firstColumn);\n const rowY = getOrThrow(visibleRowYs, row);\n const rowHeight = getOrThrow(visibleRowHeights, row);\n if (!isExpandableGridModel(model) || !model.isRowExpandable(row)) {\n return;\n }\n\n const treeBox = getOrThrow(visibleRowTreeBoxes, row);\n const color =\n mouseX != null &&\n mouseY != null &&\n mouseX >= gridX + columnX &&\n mouseX <= gridX + columnX + columnWidth &&\n mouseY >= gridY + rowY &&\n mouseY <= gridY + rowY + rowHeight\n ? treeMarkerHoverColor\n : treeMarkerColor;\n\n this.drawTreeMarker(\n context,\n state,\n columnX,\n rowY,\n treeBox,\n color,\n model.isRowExpanded(row)\n );\n }\n\n drawTreeMarker(\n context: CanvasRenderingContext2D,\n state: GridRenderState,\n columnX: Coordinate,\n rowY: Coordinate,\n treeBox: BoxCoordinates,\n color: GridColor,\n isExpanded: boolean\n ): void {\n const { x1, y1, x2, y2 } = treeBox;\n const markerText = isExpanded ? '⊟' : '⊞';\n const textX = columnX + (x1 + x2) * 0.5 + 0.5;\n const textY = rowY + (y1 + y2) * 0.5 + 0.5;\n context.fillStyle = color;\n context.textAlign = 'center';\n context.fillText(markerText, textX, textY);\n }\n\n drawCellRowTreeDepthLines(\n context: CanvasRenderingContext2D,\n state: GridRenderState,\n row: VisibleIndex,\n rowAfter?: VisibleIndex\n ): void {\n const { metrics, model, theme } = state;\n\n if (!isExpandableGridModel(model)) return;\n\n const depth = model.depthForRow(row);\n if (depth === 0) return;\n\n const {\n firstColumn,\n visibleColumnXs,\n visibleRowYs,\n visibleRowHeights,\n } = metrics;\n const { treeDepthIndent, treeHorizontalPadding, treeLineColor } = theme;\n const columnX = getOrThrow(visibleColumnXs, firstColumn);\n const rowY = getOrThrow(visibleRowYs, row);\n const rowHeight = getOrThrow(visibleRowHeights, row);\n const depthRowAfter =\n rowAfter !== undefined ? model.depthForRow(rowAfter) : 0;\n const depthDiff = depth > depthRowAfter ? depth - depthRowAfter : 0;\n\n context.strokeStyle = treeLineColor;\n context.lineWidth = 1;\n\n // draw normal depth lines\n if (depth - depthDiff > 0) {\n context.beginPath();\n for (let i = 0; i < depth - depthDiff; i += 1) {\n const lineX =\n columnX +\n i * treeDepthIndent +\n treeDepthIndent * 0.5 +\n treeHorizontalPadding +\n 0.5;\n context.moveTo(lineX, rowY);\n context.lineTo(lineX, rowY + rowHeight);\n }\n context.stroke();\n }\n\n // draw as hockey stick if last row at depth\n if (depthDiff > 0) {\n context.beginPath();\n for (let i = depth - depthDiff; i < depth; i += 1) {\n const lineX =\n columnX +\n i * treeDepthIndent +\n treeDepthIndent * 0.5 +\n treeHorizontalPadding +\n 0.5;\n context.moveTo(lineX, rowY);\n context.lineTo(lineX, rowY + Math.ceil(rowHeight / 2));\n // extra moveTo prevents halfpixel in corner\n context.moveTo(lineX - 0.5, rowY + Math.ceil(rowHeight / 2) + 0.5);\n context.lineTo(\n lineX + treeDepthIndent - 0.5,\n rowY + Math.ceil(rowHeight / 2) + 0.5\n );\n }\n context.stroke();\n }\n }\n\n getCachedTruncatedString = memoizeClear(\n (\n context: CanvasRenderingContext2D,\n text: string,\n width: number,\n fontWidth: number,\n truncationChar?: string\n ): string =>\n GridRenderer.truncateToWidth(\n context,\n text,\n width,\n fontWidth,\n truncationChar\n ),\n { max: 10000 }\n );\n\n getCachedBackgroundColors = memoizeClear(\n (backgroundColors: GridColorWay, maxDepth: number): GridColor[][] =>\n backgroundColors.split(' ').map(color => {\n const colors = [];\n for (let i = 0; i < maxDepth; i += 1) {\n colors.push(GridColorUtils.darkenForDepth(color, i, maxDepth));\n }\n return colors;\n }),\n { max: 1000 }\n );\n\n getCachedColorWithAlpha = memoizeClear(\n (color, alpha) => GridColorUtils.colorWithAlpha(color, alpha),\n { max: 1000 }\n );\n\n drawHeaders(context: CanvasRenderingContext2D, state: GridRenderState): void {\n const { theme } = state;\n\n context.font = theme.headerFont;\n\n this.drawColumnHeaders(context, state);\n\n this.drawRowHeaders(context, state);\n }\n\n drawFooters(context: CanvasRenderingContext2D, state: GridRenderState): void {\n const { theme } = state;\n\n context.font = theme.headerFont;\n\n this.drawRowFooters(context, state);\n }\n\n drawColumnHeaders(\n context: CanvasRenderingContext2D,\n state: GridRenderState\n ): void {\n const {\n mouseX,\n mouseY,\n theme,\n metrics,\n draggingColumnSeparator,\n isDragging,\n model,\n } = state;\n const {\n columnHeaderHeight,\n floatingColumns,\n gridX,\n width,\n visibleColumns,\n visibleColumnWidths,\n visibleColumnXs,\n floatingLeftColumnCount,\n floatingLeftWidth,\n floatingRightWidth,\n modelColumns,\n columnHeaderMaxDepth,\n } = metrics;\n if (columnHeaderHeight <= 0) {\n return;\n }\n\n const {\n headerHiddenSeparatorSize,\n headerHiddenSeparatorHoverColor,\n headerSeparatorColor,\n headerSeparatorHoverColor,\n } = theme;\n const hiddenSeparatorHeight = columnHeaderHeight * 0.5;\n const hiddenY =\n columnHeaderHeight * (columnHeaderMaxDepth - 1) +\n columnHeaderHeight * 0.5 -\n hiddenSeparatorHeight * 0.5;\n const containsFrozenColumns = floatingLeftColumnCount > 0;\n\n context.save();\n\n this.drawColumnHeadersForRange(\n context,\n state,\n [visibleColumns[0], visibleColumns[visibleColumns.length - 1]],\n {\n minX: gridX + floatingLeftWidth,\n maxX: width - floatingRightWidth,\n }\n );\n\n if (containsFrozenColumns) {\n this.drawColumnHeadersForRange(\n context,\n state,\n [floatingColumns[0], floatingColumns[floatingColumns.length - 1]],\n {\n minX: gridX,\n maxX: gridX + floatingLeftWidth,\n }\n );\n }\n\n if (headerSeparatorColor) {\n context.strokeStyle = headerSeparatorColor;\n\n const hiddenColumns = [...visibleColumnWidths.entries()]\n .filter(([_, w]) => w === 0)\n .map(([index]) => index);\n\n // Now draw the hidden column separator boxes\n context.beginPath();\n context.fillStyle = headerSeparatorColor;\n for (let i = 0; i < hiddenColumns.length; i += 1) {\n const column = hiddenColumns[i];\n const columnX = getOrThrow(visibleColumnXs, column);\n const columnWidth = getOrThrow(visibleColumnWidths, column);\n const minX =\n gridX + columnX + columnWidth + 0.5 - headerHiddenSeparatorSize * 0.5;\n context.rect(\n minX,\n hiddenY,\n headerHiddenSeparatorSize,\n hiddenSeparatorHeight\n );\n }\n context.fill();\n }\n\n if (headerSeparatorHoverColor) {\n let { index: highlightedSeparator, depth } =\n draggingColumnSeparator ?? {};\n\n if (highlightedSeparator == null && mouseX != null && mouseY != null) {\n const separator = GridColumnSeparatorMouseHandler.getColumnSeparator(\n GridUtils.getGridPointFromXY(mouseX, mouseY, metrics),\n metrics,\n model,\n theme\n );\n highlightedSeparator = separator?.index;\n depth = separator?.depth;\n }\n\n let shouldDrawSeparator: boolean;\n\n if (highlightedSeparator == null) {\n shouldDrawSeparator = false;\n } else {\n const columnIndex = modelColumns.get(highlightedSeparator);\n const nextColumnIndex = modelColumns.get(highlightedSeparator + 1);\n if (columnIndex == null || nextColumnIndex == null) {\n shouldDrawSeparator = false;\n } else {\n shouldDrawSeparator =\n model.textForColumnHeader(columnIndex, depth) !==\n model.textForColumnHeader(nextColumnIndex, depth);\n }\n }\n\n if (\n shouldDrawSeparator &&\n highlightedSeparator != null &&\n depth != null &&\n (!isDragging || draggingColumnSeparator != null)\n ) {\n context.strokeStyle = headerSeparatorHoverColor;\n\n const columnX = getOrThrow(visibleColumnXs, highlightedSeparator);\n const columnWidth = getOrThrow(\n visibleColumnWidths,\n highlightedSeparator\n );\n const x = gridX + columnX + columnWidth + 0.5;\n const visibleColumnIndex = visibleColumns.indexOf(highlightedSeparator);\n const nextColumn =\n visibleColumnIndex < visibleColumns.length - 1\n ? visibleColumns[visibleColumnIndex + 1]\n : null;\n const nextColumnWidth =\n nextColumn != null ? visibleColumnWidths.get(nextColumn) : null;\n const isColumnHidden = columnWidth === 0;\n const isNextColumnHidden =\n nextColumnWidth != null && nextColumnWidth === 0;\n if (isColumnHidden) {\n context.strokeStyle = headerHiddenSeparatorHoverColor;\n context.fillStyle = headerHiddenSeparatorHoverColor;\n context.fillRect(\n x,\n hiddenY,\n headerHiddenSeparatorSize * 0.5,\n hiddenSeparatorHeight\n );\n } else if (isNextColumnHidden) {\n context.fillStyle = headerSeparatorHoverColor;\n context.fillRect(\n x - headerHiddenSeparatorSize * 0.5,\n hiddenY,\n headerHiddenSeparatorSize * 0.5,\n hiddenSeparatorHeight\n );\n }\n\n // column seperator hover line\n context.beginPath();\n context.moveTo(\n x,\n (columnHeaderMaxDepth - depth - 1) * columnHeaderHeight\n );\n context.lineTo(\n x,\n (columnHeaderMaxDepth - depth) * columnHeaderHeight - 1\n );\n context.stroke();\n }\n }\n\n context.restore();\n }\n\n drawColumnHeadersForRange(\n context: CanvasRenderingContext2D,\n state: GridRenderState,\n range: BoundedAxisRange,\n bounds: { minX: number; maxX: number }\n ): void {\n const { model } = state;\n const { columnHeaderMaxDepth } = model;\n\n if (columnHeaderMaxDepth === 0) {\n return;\n }\n\n for (let d = 0; d <= columnHeaderMaxDepth; d += 1) {\n this.drawColumnHeadersAtDepth(context, state, range, bounds, d);\n }\n }\n\n drawColumnHeadersAtDepth(\n context: CanvasRenderingContext2D,\n state: GridRenderState,\n range: BoundedAxisRange,\n bounds: { minX: number; maxX: number },\n depth: number\n ): void {\n const { metrics, model, theme } = state;\n const {\n modelColumns,\n visibleColumnXs,\n gridX,\n calculatedColumnWidths,\n userColumnWidths,\n visibleColumnWidths,\n movedColumns,\n } = metrics;\n const {\n headerBackgroundColor,\n headerColor,\n headerSeparatorColor,\n columnHeaderHeight,\n columnWidth,\n } = theme;\n const { columnHeaderMaxDepth } = model;\n const { minX, maxX } = bounds;\n const visibleWidth = maxX - minX;\n\n if (columnHeaderMaxDepth === 0) {\n return;\n }\n\n const startIndex = range[0];\n const endIndex = range[1];\n\n context.save();\n context.translate(\n 0,\n (columnHeaderMaxDepth - depth - 1) * columnHeaderHeight\n );\n\n if (depth === 0) {\n // Make sure base column header background always goes to the right edge\n this.drawColumnHeader(context, state, '', minX, maxX, {\n backgroundColor: headerBackgroundColor,\n separatorColor: headerSeparatorColor,\n });\n\n // Draw base column headers\n for (let i = startIndex; i <= endIndex; i += 1) {\n this.drawColumnHeaderAtIndex(context, state, i, bounds);\n }\n }\n\n // Draw column header group\n if (depth > 0) {\n let columnIndex = startIndex;\n\n while (columnIndex <= endIndex) {\n const { columnCount } = metrics;\n const modelColumn = getOrThrow(modelColumns, columnIndex);\n const columnGroupName = model.textForColumnHeader(modelColumn, depth);\n const columnGroupColor = model.colorForColumnHeader(modelColumn, depth);\n let columnGroupLeft = getOrThrow(visibleColumnXs, columnIndex) + gridX;\n let columnGroupRight =\n columnGroupLeft + getOrThrow(visibleColumnWidths, columnIndex);\n\n if (columnGroupName != null) {\n // Need to determine if the column group is at least the width of the bounds\n // And if the left/right of the group extend past the bounds\n // The group will be drawn as if it were a column with a max width of the bounds width\n let prevColumnIndex = columnIndex - 1;\n while (\n prevColumnIndex >= 0 &&\n (columnGroupRight - columnGroupLeft < visibleWidth ||\n columnGroupLeft > minX)\n ) {\n const prevModelIndex =\n modelColumns.get(prevColumnIndex) ??\n GridUtils.getModelIndex(prevColumnIndex, movedColumns);\n if (\n prevModelIndex == null ||\n model.textForColumnHeader(prevModelIndex, depth) !==\n columnGroupName\n ) {\n // Previous column not in the same group\n break;\n }\n\n // Use this instead of visibleColumnWidths b/c the columns may be off screen\n const prevColumnWidth =\n userColumnWidths.get(prevModelIndex) ??\n calculatedColumnWidths.get(prevModelIndex) ??\n columnWidth;\n\n columnGroupLeft -= prevColumnWidth;\n prevColumnIndex -= 1;\n }\n\n let nextColumnIndex = columnIndex + 1;\n while (\n nextColumnIndex < columnCount &&\n (columnGroupRight - columnGroupLeft < visibleWidth ||\n columnGroupRight < maxX)\n ) {\n const nextModelIndex =\n modelColumns.get(nextColumnIndex) ??\n GridUtils.getModelIndex(nextColumnIndex, movedColumns);\n if (\n model.textForColumnHeader(nextModelIndex, depth) !==\n columnGroupName\n ) {\n // Next column not in the same group\n break;\n }\n\n // Use this instead of visibleColumnWidths b/c the columns may be off screen\n const nextColumnWidth =\n userColumnWidths.get(nextModelIndex) ??\n calculatedColumnWidths.get(nextModelIndex) ??\n columnWidth;\n\n columnGroupRight += nextColumnWidth;\n nextColumnIndex += 1;\n }\n\n // Set column index to end of the current group\n columnIndex = nextColumnIndex - 1;\n\n const isFullWidth =\n columnGroupRight - columnGroupLeft >= visibleWidth;\n let x = columnGroupLeft;\n if (isFullWidth) {\n if (columnGroupRight < maxX) {\n x = columnGroupRight - visibleWidth;\n } else if (columnGroupLeft < minX) {\n x = minX;\n }\n }\n\n this.drawColumnHeader(\n context,\n state,\n columnGroupName,\n x,\n Math.min(columnGroupRight - columnGroupLeft, visibleWidth),\n {\n backgroundColor: columnGroupColor ?? headerBackgroundColor,\n textColor: headerColor,\n separatorColor: headerSeparatorColor,\n },\n bounds\n );\n }\n columnIndex += 1;\n }\n }\n context.restore();\n }\n\n /**\n * Draws the column header for the given visible index\n * @param context Canvas context\n * @param state Grid render state\n * @param index Visible index of the column header to draw\n * @param bounds The horizontal bounds the header can be drawn in\n */\n drawColumnHeaderAtIndex(\n context: CanvasRenderingContext2D,\n state: GridRenderState,\n index: VisibleIndex,\n bounds: { minX: number; maxX: number }\n ): void {\n const { metrics, model, theme } = state;\n const {\n modelColumns,\n visibleColumnWidths,\n visibleColumnXs,\n gridX,\n } = metrics;\n const width = getOrThrow(visibleColumnWidths, index);\n const x = getOrThrow(visibleColumnXs, index) + gridX;\n const modelColumn = getOrThrow(modelColumns, index);\n const text = model.textForColumnHeader(modelColumn);\n const { headerBackgroundColor, headerColor, headerSeparatorColor } = theme;\n\n if (text == null) {\n return;\n }\n\n this.drawColumnHeader(\n context,\n state,\n text,\n x,\n width,\n {\n backgroundColor:\n model.colorForColumnHeader(modelColumn) ?? headerBackgroundColor,\n textColor: headerColor,\n separatorColor: headerSeparatorColor,\n },\n bounds\n );\n }\n\n drawColumnHeader(\n context: CanvasRenderingContext2D,\n state: GridRenderState,\n columnText: string,\n columnX: Coordinate,\n columnWidth: number,\n style?: {\n backgroundColor?: string;\n textColor?: string;\n separatorColor?: string;\n },\n bounds?: { minX?: number; maxX?: number }\n ): void {\n if (columnWidth <= 0) {\n return;\n }\n const { metrics, theme } = state;\n\n const { headerHorizontalPadding, columnHeaderHeight } = theme;\n const { fontWidths, width } = metrics;\n const fontWidth =\n fontWidths.get(context.font) || GridRenderer.DEFAULT_FONT_WIDTH;\n\n const maxWidth = columnWidth - headerHorizontalPadding * 2;\n const maxLength = maxWidth / fontWidth;\n\n const { backgroundColor, textColor = '#ffffff', separatorColor } =\n style ?? {};\n let { minX = 0, maxX = width } = bounds ?? {};\n\n context.save();\n context.rect(minX, 0, maxX - minX, columnHeaderHeight);\n context.clip();\n\n // Fill background color if specified\n if (backgroundColor) {\n context.fillStyle = backgroundColor;\n context.fillRect(columnX, 0, columnWidth, columnHeaderHeight);\n }\n\n if (separatorColor) {\n context.strokeStyle = separatorColor;\n context.beginPath();\n\n // Don't draw left separator if column touches the left edge\n if (columnX > 0) {\n context.moveTo(columnX + 0.5, 0);\n context.lineTo(columnX + 0.5, columnHeaderHeight);\n }\n context.moveTo(columnX + columnWidth + 0.5, 0);\n context.lineTo(columnX + columnWidth + 0.5, columnHeaderHeight);\n\n // Bottom Border, should be interior to the header height\n context.moveTo(columnX, columnHeaderHeight - 0.5);\n context.lineTo(columnX + columnWidth, columnHeaderHeight - 0.5);\n context.stroke();\n }\n\n context.beginPath();\n context.rect(columnX, 0, columnWidth, columnHeaderHeight);\n context.clip();\n context.fillStyle = textColor;\n\n let renderText = columnText;\n\n if (maxLength <= 0) {\n renderText = '';\n } else if (renderText.length > maxLength) {\n renderText = `${renderText.substring(0, maxLength - 1)}…`;\n }\n\n const textWidth = renderText.length * fontWidth;\n let x = columnX + columnWidth * 0.5;\n const y = columnHeaderHeight * 0.5;\n minX += headerHorizontalPadding;\n maxX -= headerHorizontalPadding;\n\n const columnLeft = columnX + headerHorizontalPadding;\n const visibleLeft = clamp(columnLeft, minX, maxX);\n const columnRight = columnX + columnWidth - headerHorizontalPadding;\n const visibleRight = clamp(columnRight, minX, maxX);\n const visibleWidth = visibleRight - visibleLeft;\n\n const isBeyondLeft = x - textWidth * 0.5 < minX;\n const isBeyondRight = x + textWidth * 0.5 > maxX;\n\n if (isBeyondLeft) {\n // Column name would be off the left side of the canvas\n if (textWidth < visibleWidth) {\n // Can render the entire text in the visible space. Stick to left\n x = minX + textWidth * 0.5;\n } else {\n x = columnRight - textWidth * 0.5;\n }\n } else if (isBeyondRight) {\n if (textWidth < visibleWidth) {\n // Can render the entire text in the visible space. Stick to right\n x = maxX - textWidth * 0.5;\n } else {\n x = columnLeft + textWidth * 0.5;\n }\n }\n context.textAlign = 'center';\n context.fillText(renderText, x, y);\n\n context.restore();\n }\n\n drawRowHeaders(\n context: CanvasRenderingContext2D,\n state: GridRenderState\n ): void {\n const { mouseX, mouseY, metrics, theme, draggingRowSeparator } = state;\n const {\n gridY,\n rowHeaderWidth,\n height,\n visibleRows,\n visibleRowHeights,\n visibleRowYs,\n } = metrics;\n if (rowHeaderWidth <= 0) {\n return;\n }\n\n const {\n headerBackgroundColor,\n headerColor,\n headerHiddenSeparatorSize,\n headerHiddenSeparatorHoverColor,\n headerSeparatorColor,\n headerSeparatorHoverColor,\n } = theme;\n const hiddenSeparatorWidth = rowHeaderWidth * 0.5;\n const hiddenX = rowHeaderWidth * 0.5 - hiddenSeparatorWidth * 0.5;\n\n context.save();\n\n context.beginPath();\n\n // Fill in the background\n context.fillStyle = headerBackgroundColor;\n context.fillRect(0, 0, rowHeaderWidth, height);\n\n // Draw the separators\n if (headerSeparatorColor) {\n context.strokeStyle = headerSeparatorColor;\n context.beginPath();\n context.moveTo(0, gridY + 0.5);\n context.lineTo(rowHeaderWidth, gridY + 0.5);\n\n const hiddenRows = [];\n let isPreviousRowHidden = false;\n for (let i = 0; i < visibleRows.length; i += 1) {\n const row = visibleRows[i];\n const rowY = getOrThrow(visibleRowYs, row);\n const rowHeight = getOrThrow(visibleRowHeights, row);\n if (rowHeight > 0) {\n const y = gridY + rowY + rowHeight + 0.5;\n\n context.moveTo(0, y);\n context.lineTo(rowHeaderWidth, y);\n\n isPreviousRowHidden = false;\n } else if (!isPreviousRowHidden) {\n isPreviousRowHidden = true;\n hiddenRows.push(row);\n }\n }\n\n // border right, interior to the headerWidth\n context.moveTo(rowHeaderWidth - 0.5, 0);\n context.lineTo(rowHeaderWidth - 0.5, height);\n\n context.stroke();\n\n // Draw the hidden column separators\n context.beginPath();\n context.fillStyle = headerSeparatorColor;\n for (let i = 0; i < hiddenRows.length; i += 1) {\n const row = hiddenRows[i];\n const rowY = getOrThrow(visibleRowYs, row);\n const rowHeight = getOrThrow(visibleRowHeights, row);\n const minY =\n gridY + rowY + rowHeight + 0.5 - headerHiddenSeparatorSize * 0.5;\n context.rect(\n hiddenX,\n minY,\n hiddenSeparatorWidth,\n headerHiddenSeparatorSize\n );\n }\n\n context.fill();\n }\n\n if (headerSeparatorHoverColor) {\n let { index: highlightedSeparator = null } = draggingRowSeparator ?? {};\n if (highlightedSeparator == null && mouseX != null && mouseY != null) {\n highlightedSeparator = GridUtils.getRowSeparatorIndex(\n mouseX,\n mouseY,\n metrics,\n theme\n );\n }\n\n if (highlightedSeparator != null) {\n context.strokeStyle = headerSeparatorHoverColor;\n\n const rowY = getOrThrow(visibleRowYs, highlightedSeparator);\n const rowHeight = getOrThrow(visibleRowHeights, highlightedSeparator);\n const y = gridY + rowY + rowHeight + 0.5;\n\n const visibleRowIndex = visibleRows.indexOf(highlightedSeparator);\n const nextRow =\n visibleRowIndex < visibleRows.length - 1\n ? visibleRows[visibleRowIndex + 1]\n : null;\n const nextRowHeight =\n nextRow != null ? visibleRowHeights.get(nextRow) : null;\n const isRowHidden = rowHeight === 0;\n const isNextRowHidden = nextRowHeight != null && nextRowHeight === 0;\n if (isRowHidden) {\n context.strokeStyle = headerHiddenSeparatorHoverColor;\n context.fillStyle = headerHiddenSeparatorHoverColor;\n context.fillRect(\n hiddenX,\n y,\n hiddenSeparatorWidth,\n headerHiddenSeparatorSize * 0.5\n );\n } else if (isNextRowHidden) {\n context.fillStyle = headerSeparatorHoverColor;\n context.fillRect(\n hiddenX,\n y - headerHiddenSeparatorSize * 0.5,\n hiddenSeparatorWidth,\n headerHiddenSeparatorSize * 0.5\n );\n }\n\n context.beginPath();\n context.moveTo(0.5, y);\n context.lineTo(rowHeaderWidth + 0.5, y);\n context.stroke();\n }\n }\n\n // Fill in the text\n context.beginPath();\n context.rect(0, gridY, rowHeaderWidth, height);\n context.clip();\n\n context.fillStyle = headerColor;\n context.textAlign = 'right';\n\n for (let i = 0; i < visibleRows.length; i += 1) {\n const row = visibleRows[i];\n const rowHeight = getOrThrow(visibleRowHeights, row);\n const y = getOrThrow(visibleRowYs, row) + gridY;\n this.drawRowHeader(context, state, row, y, rowHeight);\n }\n\n context.restore();\n }\n\n drawRowHeader(\n context: CanvasRenderingContext2D,\n state: GridRenderState,\n row: VisibleIndex,\n rowY: Coordinate,\n rowHeight: number\n ): void {\n if (rowHeight <= 0) {\n return;\n }\n const { metrics, model, theme } = state;\n const { modelRows, rowHeaderWidth } = metrics;\n const modelRow = getOrThrow(modelRows, row);\n const x = rowHeaderWidth - theme.cellHorizontalPadding;\n const y = rowY + rowHeight * 0.5;\n context.fillText(model.textForRowHeader(modelRow), x, y);\n }\n\n drawRowFooters(\n context: CanvasRenderingContext2D,\n state: GridRenderState\n ): void {\n const {\n mouseX,\n mouseY,\n metrics,\n model,\n theme,\n draggingRowSeparator,\n } = state;\n const {\n gridY,\n gridX,\n maxX,\n modelRows,\n rowFooterWidth,\n height,\n verticalBarWidth,\n visibleRows,\n visibleRowHeights,\n visibleRowYs,\n width,\n } = metrics;\n if (rowFooterWidth <= 0) {\n return;\n }\n\n const {\n cellHorizontalPadding,\n headerBackgroundColor,\n headerColor,\n headerHiddenSeparatorSize,\n headerHiddenSeparatorHoverColor,\n headerSeparatorColor,\n headerSeparatorHoverColor,\n } = theme;\n const hiddenSeparatorWidth = rowFooterWidth * 0.5;\n const hiddenX = rowFooterWidth * 0.5 - hiddenSeparatorWidth * 0.5;\n const x = Math.min(gridX + maxX, width - rowFooterWidth - verticalBarWidth);\n\n context.save();\n\n context.beginPath();\n\n // Fill in the background\n context.fillStyle = headerBackgroundColor;\n context.fillRect(x, gridY, rowFooterWidth, height);\n\n // Draw the separators\n if (headerSeparatorColor) {\n context.strokeStyle = headerSeparatorColor;\n context.beginPath();\n context.moveTo(x, gridY + 0.5);\n context.lineTo(rowFooterWidth, gridY + 0.5);\n\n const hiddenRows = [];\n let isPreviousRowHidden = false;\n for (let i = 0; i < visibleRows.length; i += 1) {\n const row = visibleRows[i];\n const rowY = getOrThrow(visibleRowYs, row);\n const rowHeight = getOrThrow(visibleRowHeights, row);\n if (rowHeight > 0) {\n const y = gridY + rowY + rowHeight + 0.5;\n\n context.moveTo(x + 0.5, y);\n context.lineTo(x + rowFooterWidth - 0.5, y);\n\n isPreviousRowHidden = false;\n } else if (!isPreviousRowHidden) {\n isPreviousRowHidden = true;\n hiddenRows.push(row);\n }\n }\n\n // border left, interior to the headerWidth\n context.moveTo(x + 0.5, gridY);\n context.lineTo(x + 0.5, height);\n\n context.stroke();\n\n // Draw the hidden column separators\n context.beginPath();\n context.fillStyle = headerSeparatorColor;\n for (let i = 0; i < hiddenRows.length; i += 1) {\n const row = hiddenRows[i];\n const rowY = getOrThrow(visibleRowYs, row);\n const rowHeight = getOrThrow(visibleRowHeights, row);\n const minY =\n gridY + rowY + rowHeight + 0.5 - headerHiddenSeparatorSize * 0.5;\n context.rect(\n x + hiddenX,\n minY,\n hiddenSeparatorWidth,\n headerHiddenSeparatorSize\n );\n }\n\n context.fill();\n }\n\n if (headerSeparatorHoverColor) {\n let { index: highlightedSeparator = null } = draggingRowSeparator ?? {};\n if (highlightedSeparator == null && mouseX != null && mouseY != null) {\n highlightedSeparator = GridUtils.getRowSeparatorIndex(\n mouseX,\n mouseY,\n metrics,\n theme\n );\n }\n\n if (highlightedSeparator != null) {\n context.strokeStyle = headerSeparatorHoverColor;\n\n const rowY = getOrThrow(visibleRowYs, highlightedSeparator);\n const rowHeight = getOrThrow(visibleRowHeights, highlightedSeparator);\n const y = gridY + rowY + rowHeight + 0.5;\n\n const visibleRowIndex = visibleRows.indexOf(highlightedSeparator);\n const nextRow =\n visibleRowIndex < visibleRows.length - 1\n ? visibleRows[visibleRowIndex + 1]\n : null;\n const nextRowHeight =\n nextRow != null ? visibleRowHeights.get(nextRow) : null;\n const isRowHidden = rowHeight === 0;\n const isNextRowHidden = nextRowHeight != null && nextRowHeight === 0;\n if (isRowHidden) {\n context.strokeStyle = headerHiddenSeparatorHoverColor;\n context.fillStyle = headerHiddenSeparatorHoverColor;\n context.fillRect(\n hiddenX,\n y,\n hiddenSeparatorWidth,\n headerHiddenSeparatorSize * 0.5\n );\n } else if (isNextRowHidden) {\n context.fillStyle = headerSeparatorHoverColor;\n context.fillRect(\n hiddenX,\n y - headerHiddenSeparatorSize * 0.5,\n hiddenSeparatorWidth,\n headerHiddenSeparatorSize * 0.5\n );\n }\n\n context.beginPath();\n context.moveTo(x + 0.5, y);\n context.lineTo(x + rowFooterWidth + 0.5, y);\n context.stroke();\n }\n }\n\n // Fill in the text\n context.beginPath();\n context.rect(x, gridY, rowFooterWidth, height);\n context.clip();\n\n context.fillStyle = headerColor;\n context.textAlign = 'left';\n\n const textX = x + cellHorizontalPadding;\n for (let i = 0; i < visibleRows.length; i += 1) {\n const row = visibleRows[i];\n const rowHeight = getOrThrow(visibleRowHeights, row);\n if (rowHeight > 0) {\n const rowY = getOrThrow(visibleRowYs, row) + gridY;\n const modelRow = getOrThrow(modelRows, row);\n const textY = rowY + rowHeight * 0.5;\n context.fillText(model.textForRowFooter(modelRow), textX, textY);\n }\n }\n\n context.restore();\n }\n\n drawSelectedRanges(\n context: CanvasRenderingContext2D,\n state: GridRenderState,\n viewport: {\n left?: VisibleIndex;\n top?: VisibleIndex;\n right?: VisibleIndex;\n bottom?: VisibleIndex;\n minX?: Coordinate;\n minY?: Coordinate;\n maxX?: Coordinate;\n maxY?: Coordinate;\n } = {}\n ): void {\n const {\n cursorColumn: column,\n cursorRow: row,\n draggingRow,\n draggingColumn,\n editingCell,\n metrics,\n model,\n selectedRanges,\n theme,\n } = state;\n const {\n visibleColumnWidths,\n visibleColumnXs,\n visibleRowHeights,\n visibleRowYs,\n width,\n height,\n } = metrics;\n const {\n left = metrics.left,\n top = metrics.top,\n right = metrics.right,\n bottom = metrics.bottom,\n minY = -10,\n maxY = height + 10,\n minX = -10,\n maxX = width + 10,\n } = viewport;\n if (selectedRanges.length === 0) {\n return;\n }\n\n const isCursorVisible =\n isEditableGridModel(model) &&\n model.isEditable &&\n editingCell == null &&\n draggingRow == null &&\n draggingColumn == null &&\n column != null &&\n row != null &&\n visibleColumnXs.has(column) &&\n visibleRowYs.has(row);\n if (isCursorVisible) {\n // Punch a hole out where the active cell is, it gets styled differently.\n const x = getOrThrow(visibleColumnXs, column);\n const y = getOrThrow(visibleRowYs, row);\n const w = getOrThrow(visibleColumnWidths, column);\n const h = getOrThrow(visibleRowHeights, row);\n\n context.save();\n\n context.beginPath();\n\n context.rect(0, 0, width, height);\n context.rect(x, y, w, h);\n\n context.clip('evenodd');\n }\n\n // Draw selection ranges\n context.beginPath();\n for (let i = 0; i < selectedRanges.length; i += 1) {\n const selectedRange = selectedRanges[i];\n const startColumn =\n selectedRange.startColumn !== null ? selectedRange.startColumn : left;\n const startRow =\n selectedRange.startRow !== null ? selectedRange.startRow : top;\n const endColumn =\n selectedRange.endColumn !== null ? selectedRange.endColumn : right;\n const endRow =\n selectedRange.endRow !== null ? selectedRange.endRow : bottom;\n if (\n endRow >= top &&\n bottom >= startRow &&\n endColumn >= left &&\n right >= startColumn\n ) {\n // Need to offset the x/y coordinates so that the line draws nice and crisp\n const x =\n startColumn >= left && visibleColumnXs.has(startColumn)\n ? Math.round(getOrThrow(visibleColumnXs, startColumn)) + 0.5\n : minX;\n const y =\n startRow >= top && visibleRowYs.has(startRow)\n ? Math.max(\n Math.round(getOrThrow(visibleRowYs, startRow)) + 0.5,\n 0.5\n )\n : minY;\n\n const endX =\n endColumn <= right && visibleColumnXs.has(endColumn)\n ? Math.round(\n getOrThrow(visibleColumnXs, endColumn) +\n getOrThrow(visibleColumnWidths, endColumn)\n ) - 0.5\n : maxX;\n const endY =\n endRow <= bottom && visibleRowYs.has(endRow)\n ? Math.round(\n getOrThrow(visibleRowYs, endRow) +\n getOrThrow(visibleRowHeights, endRow)\n ) - 0.5\n : maxY;\n\n context.rect(x, y, endX - x, endY - y);\n }\n\n // draw the inner transparent fill\n context.fillStyle = theme.selectionColor;\n context.fill();\n\n /**\n * draw an \"inner stroke\" that's clipped to just inside of the rects\n * to act as a casing to the outer stroke. 3px width because 1px is outside\n * the rect (but clipped), 1px is \"on\" the rect (technically this pixel is\n * a half pixel clip as well due to rects offset, but we are immediately painting\n * over it), and then the 1px inside (which is the desired pixel).\n */\n context.save();\n context.clip();\n context.strokeStyle = theme.selectionOutlineCasingColor;\n context.lineWidth = 3;\n context.stroke();\n context.restore();\n\n // draw the outerstroke border on top of the inner stroke\n context.strokeStyle = theme.selectionOutlineColor;\n context.lineWidth = 1;\n context.stroke();\n }\n\n if (isCursorVisible && column != null && row != null) {\n context.restore();\n\n this.drawActiveCell(context, state, column, row);\n }\n }\n\n drawActiveCell(\n context: CanvasRenderingContext2D,\n state: GridRenderState,\n column: VisibleIndex,\n row: VisibleIndex,\n borderWidth = GridRenderer.ACTIVE_CELL_BORDER_WIDTH\n ): void {\n const { metrics, theme } = state;\n const {\n visibleColumnWidths,\n visibleColumnXs,\n visibleRowHeights,\n visibleRowYs,\n } = metrics;\n const cellX = getOrThrow(visibleColumnXs, column);\n const cellY = getOrThrow(visibleRowYs, row);\n const cellW = getOrThrow(visibleColumnWidths, column);\n const cellH = getOrThrow(visibleRowHeights, row);\n\n // Now get the outline for the active cell\n let x = cellX - borderWidth * 0.5;\n let y = cellY - borderWidth * 0.5;\n let w = cellW + borderWidth;\n let h = cellH + borderWidth;\n\n // Make sure the outline is interior on the edge\n if (x <= 0) {\n w += x - 1;\n x = 1;\n }\n if (y <= 0) {\n h += y - 1;\n y = 1;\n }\n\n const { lineWidth } = context;\n context.beginPath();\n context.lineWidth = borderWidth;\n context.strokeStyle = theme.selectionOutlineColor;\n this.drawRoundedRect(context, x, y, w, h);\n context.stroke();\n context.lineWidth = lineWidth;\n }\n\n /**\n * Draws a rounded rectangle using the current state of the canvas.\n *\n * @param context The canvas context\n * @param x coordinate of the left side\n * @param y coordinate of the top side\n * @param w width of the rectangle\n * @param h height of the rectangle\n * @param r corner radius of the rectangle\n */\n drawRoundedRect(\n context: CanvasRenderingContext2D,\n x: Coordinate,\n y: Coordinate,\n w: number,\n h: number,\n r = GridRenderer.DEFAULT_EDGE_RADIUS\n ): void {\n context.beginPath();\n context.moveTo(x + r, y);\n context.lineTo(x + w - r, y);\n context.quadraticCurveTo(x + w, y, x + w, y + r);\n context.lineTo(x + w, y + h - r);\n context.quadraticCurveTo(x + w, y + h, x + w - r, y + h);\n context.lineTo(x + r, y + h);\n context.quadraticCurveTo(x, y + h, x, y + h - r);\n context.lineTo(x, y + r);\n context.quadraticCurveTo(x, y, x + r, y);\n context.closePath();\n }\n\n drawDraggingColumn(\n context: CanvasRenderingContext2D,\n state: GridRenderState\n ): void {\n const { draggingColumn, metrics, mouseX, theme, model } = state;\n if (draggingColumn == null || mouseX == null) {\n return;\n }\n\n const {\n range: draggingColumnVisibleRange,\n depth: draggingColumnDepth,\n } = draggingColumn;\n\n const {\n gridX,\n gridY,\n visibleColumnXs,\n visibleColumnWidths,\n height,\n width,\n columnHeaderMaxDepth,\n columnHeaderHeight,\n movedColumns,\n modelColumns,\n floatingLeftWidth,\n } = metrics;\n\n const draggingModelIndex =\n modelColumns.get(draggingColumnVisibleRange[0]) ??\n GridUtils.getModelIndex(draggingColumnVisibleRange[0], movedColumns);\n\n const draggingGroup = model.getColumnHeaderGroup(\n draggingModelIndex,\n draggingColumnDepth\n );\n\n if (draggingColumnDepth > 0 && !draggingGroup) {\n return;\n }\n\n const [startIndex, endIndex] = draggingColumnVisibleRange;\n\n const originalLeft = getOrThrow(visibleColumnXs, startIndex);\n const originalRight =\n getOrThrow(visibleColumnXs, endIndex) +\n getOrThrow(visibleColumnWidths, endIndex);\n const originalWidth = originalRight - originalLeft;\n\n const draggingLeft = draggingColumn.left;\n\n const {\n backgroundColor,\n font,\n headerFont,\n reorderOffset,\n shadowBlur,\n shadowColor,\n } = theme;\n\n const columnHeaderOffset =\n (columnHeaderMaxDepth - draggingColumnDepth - 1) * columnHeaderHeight;\n\n context.save();\n\n context.translate(gridX, 0);\n\n context.save();\n context.beginPath();\n\n // Don't draw over frozen columns\n context.rect(floatingLeftWidth, 0, width, height);\n context.clip();\n\n // First, we need to draw over where the column is coming from\n context.fillStyle = backgroundColor;\n context.fillRect(originalLeft, columnHeaderOffset, originalWidth, height);\n context.restore();\n\n // Then draw the shadow of the moving column\n context.translate(0, reorderOffset);\n\n context.save();\n context.shadowColor = shadowColor;\n context.shadowBlur = shadowBlur;\n\n context.fillStyle = backgroundColor;\n context.fillRect(\n draggingColumn.left,\n columnHeaderOffset + reorderOffset,\n draggingColumn.width,\n height\n );\n context.restore(); // Reset style\n\n // Now set the clipping region and pretty much just redraw this column and all it's contents\n context.beginPath();\n context.rect(\n draggingColumn.left,\n columnHeaderOffset,\n draggingColumn.width + 1,\n height\n );\n context.clip();\n\n context.translate(draggingLeft - originalLeft, 0);\n context.font = headerFont;\n\n const visibleColumns: VisibleIndex[] = [];\n for (\n let i = draggingColumn.range[0];\n i <= draggingColumn.range[1];\n i += 1\n ) {\n visibleColumns.push(i);\n }\n\n /**\n * This will not draw the header text properly, but extensions of Grid\n * may draw extra things in the header like sorts and filters\n */\n this.drawColumnHeaders(context, state);\n\n // Ensure the column header gets drawn\n this.drawColumnHeadersForRange(\n context,\n state,\n [visibleColumns[0], visibleColumns[visibleColumns.length - 1]],\n {\n minX: originalLeft,\n maxX: width,\n }\n );\n\n context.translate(0, gridY);\n context.font = font;\n\n this.drawGridBackground(context, state);\n\n for (let i = startIndex; i <= endIndex; i += 1) {\n this.drawColumnCellContents(context, state, i);\n }\n\n context.restore();\n }\n\n drawDraggingRow(\n context: CanvasRenderingContext2D,\n state: GridRenderState\n ): void {\n const { draggingRow, draggingRowOffset, metrics, mouseY, theme } = state;\n if (draggingRow == null || mouseY == null) {\n return;\n }\n\n const { gridX, gridY, visibleRowYs, visibleRowHeights, width } = metrics;\n const y = getOrThrow(visibleRowYs, draggingRow);\n const rowHeight = getOrThrow(visibleRowHeights, draggingRow) + 1;\n const {\n backgroundColor,\n font,\n headerFont,\n reorderOffset,\n shadowBlur,\n shadowColor,\n } = theme;\n\n context.save();\n\n context.translate(0, gridY);\n\n // First, we need to draw over the row stripes where the row is coming from\n context.fillStyle = backgroundColor;\n context.fillRect(0, y, width, rowHeight);\n\n context.translate(\n gridX + reorderOffset,\n mouseY - y - gridY - (draggingRowOffset ?? 0)\n );\n\n // Then draw the shadow of the moving row\n context.save();\n\n context.shadowColor = shadowColor;\n context.shadowBlur = shadowBlur;\n\n context.fillStyle = backgroundColor;\n context.fillRect(-gridX, y, width, rowHeight);\n\n context.restore();\n\n // Now set the clipping region and pretty much just redraw this row and all it's contents\n context.beginPath();\n context.rect(-gridX, y, width, rowHeight);\n context.clip();\n\n context.font = font;\n\n this.drawGridBackground(context, state);\n\n this.drawCellContents(context, state);\n\n // Now translate it back up and draw the header\n context.translate(-gridX, -gridY);\n\n context.font = headerFont;\n\n this.drawRowHeaders(context, state);\n\n context.restore();\n }\n\n drawScrollBars(\n context: CanvasRenderingContext2D,\n state: GridRenderState\n ): void {\n const {\n isDraggingHorizontalScrollBar,\n isDraggingVerticalScrollBar,\n isDragging,\n metrics,\n mouseX,\n mouseY,\n theme,\n } = state;\n if (theme.scrollBarSize <= 0) {\n return;\n }\n\n const {\n rowHeaderWidth,\n columnHeaderHeight,\n width,\n height,\n handleHeight,\n handleWidth,\n scrollX,\n scrollY,\n hasHorizontalBar,\n hasVerticalBar,\n barWidth,\n barHeight,\n } = metrics;\n const {\n scrollBarBackgroundColor,\n scrollBarHoverBackgroundColor,\n scrollBarCasingColor,\n scrollBarCornerColor,\n scrollBarColor,\n scrollBarHoverColor,\n scrollBarActiveColor,\n scrollBarSize,\n scrollBarHoverSize,\n scrollBarCasingWidth,\n scrollBarSelectionTick,\n scrollBarSelectionTickColor,\n scrollBarActiveSelectionTickColor,\n autoSelectRow,\n autoSelectColumn,\n } = theme;\n\n const isInbounds =\n mouseX != null && mouseY != null && mouseX <= width && mouseY <= height;\n\n const isVerticalBarHover =\n isDraggingVerticalScrollBar ||\n (hasVerticalBar &&\n !isDraggingHorizontalScrollBar &&\n !isDragging &&\n mouseX != null &&\n mouseY != null &&\n mouseX >= width - scrollBarHoverSize &&\n mouseY <= barHeight + columnHeaderHeight &&\n isInbounds);\n\n const isHorizontalBarHover =\n isDraggingHorizontalScrollBar ||\n (hasHorizontalBar &&\n !isDraggingVerticalScrollBar &&\n !isDragging &&\n !isVerticalBarHover && // vert bar gets priorty in overlapped corner hover area\n mouseX != null &&\n mouseY != null &&\n mouseY >= height - scrollBarHoverSize &&\n mouseX <= barWidth - rowHeaderWidth &&\n isInbounds);\n\n const hScrollBarSize = isHorizontalBarHover\n ? scrollBarHoverSize\n : scrollBarSize;\n const vScrollBarSize = isVerticalBarHover\n ? scrollBarHoverSize\n : scrollBarSize;\n\n context.translate(rowHeaderWidth, columnHeaderHeight);\n\n if (hasHorizontalBar && hasVerticalBar) {\n // That little corner in the bottom right\n context.fillStyle = scrollBarCasingColor;\n context.fillRect(\n width - rowHeaderWidth - scrollBarSize,\n height - columnHeaderHeight - scrollBarSize,\n scrollBarSize,\n scrollBarSize\n );\n context.fillStyle = scrollBarCornerColor;\n context.fillRect(\n width - rowHeaderWidth - scrollBarSize + scrollBarCasingWidth,\n height - columnHeaderHeight - scrollBarSize + scrollBarCasingWidth,\n scrollBarSize - scrollBarCasingWidth,\n scrollBarSize - scrollBarCasingWidth\n );\n }\n\n if (hasHorizontalBar) {\n const x = scrollX;\n const y = height - columnHeaderHeight - hScrollBarSize;\n\n // scrollbar casing\n context.fillStyle = scrollBarCasingColor;\n context.fillRect(0, y, barWidth, hScrollBarSize - scrollBarCasingWidth);\n\n // scrollbar track\n context.fillStyle = isHorizontalBarHover\n ? scrollBarHoverBackgroundColor\n : scrollBarBackgroundColor;\n context.fillRect(\n 0,\n y + scrollBarCasingWidth,\n barWidth,\n hScrollBarSize - scrollBarCasingWidth\n );\n\n // scrollbar thumb\n if (isDraggingHorizontalScrollBar) {\n context.fillStyle = scrollBarActiveColor;\n } else if (isHorizontalBarHover) {\n context.fillStyle = scrollBarHoverColor;\n } else {\n context.fillStyle = scrollBarColor;\n }\n\n context.fillRect(\n x,\n y + scrollBarCasingWidth,\n handleWidth,\n hScrollBarSize - scrollBarCasingWidth\n );\n\n if (\n !autoSelectRow &&\n scrollBarSelectionTick &&\n scrollBarSelectionTickColor != null &&\n scrollBarActiveSelectionTickColor != null\n ) {\n context.fillStyle = scrollBarSelectionTickColor;\n // Scrollbar Selection Tick\n const { selectedRanges, cursorColumn } = state;\n const { lastLeft, columnCount } = metrics;\n\n const filteredRanges = [...selectedRanges].filter(\n value => value.startColumn != null && value.endColumn != null\n ) as NoneNullColumnRange[];\n\n const sortedRanges = filteredRanges\n .map(\n (value): BoundedAxisRange => [value.startColumn, value.endColumn]\n )\n .sort(GridUtils.compareRanges);\n\n const mergedRanges = GridUtils.mergeSortedRanges(sortedRanges);\n\n const getTickX = (index: number): number => {\n if (index <= lastLeft) {\n return (index / lastLeft) * (barWidth - handleWidth);\n }\n return (\n barWidth -\n handleWidth +\n ((index - lastLeft) / (columnCount - lastLeft)) * handleWidth\n );\n };\n for (let i = 0; i < mergedRanges.length; i += 1) {\n const range = mergedRanges[i];\n const startColumn = range[0];\n const endColumn = range[1];\n\n if (\n startColumn != null &&\n endColumn != null &&\n (startColumn !== cursorColumn || endColumn !== cursorColumn)\n ) {\n const tickX = getTickX(startColumn);\n const tickWidth = Math.max(\n 1,\n Math.round(getTickX(endColumn + 1) - tickX)\n );\n const trackHeight = hScrollBarSize - scrollBarCasingWidth;\n context.fillRect(\n tickX,\n y + scrollBarCasingWidth + Math.round(trackHeight / 3),\n tickWidth,\n Math.round(trackHeight / 3)\n );\n }\n }\n\n // Current Active Tick\n if (cursorColumn != null) {\n const tickX = getTickX(cursorColumn);\n const tickWidth = 2;\n const trackHeight = hScrollBarSize - scrollBarCasingWidth;\n context.fillStyle = scrollBarActiveSelectionTickColor;\n context.fillRect(\n tickX,\n y + scrollBarCasingWidth,\n tickWidth,\n trackHeight\n );\n }\n }\n }\n\n if (hasVerticalBar) {\n const x = width - rowHeaderWidth - vScrollBarSize;\n const y = scrollY;\n\n // scrollbar casing\n context.fillStyle = scrollBarCasingColor;\n context.fillRect(x, 0, vScrollBarSize - scrollBarCasingWidth, barHeight);\n\n // scrollbar track\n context.fillStyle = isVerticalBarHover\n ? scrollBarHoverBackgroundColor\n : scrollBarBackgroundColor;\n context.fillRect(\n x + scrollBarCasingWidth,\n 0,\n vScrollBarSize - scrollBarCasingWidth,\n barHeight\n );\n\n // scrollbar thumb\n if (isDraggingVerticalScrollBar) {\n context.fillStyle = scrollBarActiveColor;\n } else if (isVerticalBarHover) {\n context.fillStyle = scrollBarHoverColor;\n } else {\n context.fillStyle = scrollBarColor;\n }\n\n context.fillRect(\n x + scrollBarCasingWidth,\n y,\n vScrollBarSize - scrollBarCasingWidth,\n handleHeight\n );\n\n if (\n !autoSelectColumn &&\n scrollBarSelectionTick &&\n scrollBarSelectionTickColor != null &&\n scrollBarActiveSelectionTickColor != null\n ) {\n // Scrollbar Selection Tick\n const { selectedRanges, cursorRow } = state;\n const { lastTop, rowCount } = metrics;\n\n const getTickY = (index: number): number => {\n if (index <= lastTop) {\n return (index / lastTop) * (barHeight - handleHeight);\n }\n return (\n barHeight -\n handleHeight +\n ((index - lastTop) / (rowCount - lastTop)) * handleHeight\n );\n };\n\n context.fillStyle = scrollBarSelectionTickColor;\n\n const filteredRanges = [...selectedRanges].filter(\n value => value.startRow != null && value.endRow != null\n ) as NoneNullRowRange[];\n\n const sortedRanges = filteredRanges\n .map((value): BoundedAxisRange => [value.startRow, value.endRow])\n .sort(GridUtils.compareRanges);\n\n const mergedRanges = GridUtils.mergeSortedRanges(sortedRanges);\n\n for (let i = 0; i < mergedRanges.length; i += 1) {\n const range = mergedRanges[i];\n const startRow = range[0];\n const endRow = range[1];\n if (\n startRow != null &&\n endRow != null &&\n (startRow !== cursorRow || endRow !== cursorRow)\n ) {\n const tickY = getTickY(startRow);\n const trackWidth = vScrollBarSize - scrollBarCasingWidth;\n const tickHeight = Math.max(\n 1,\n Math.round(getTickY(endRow + 1) - tickY)\n );\n context.fillRect(\n x + scrollBarCasingWidth + Math.round(trackWidth / 3),\n tickY,\n Math.round(trackWidth / 3),\n tickHeight\n );\n }\n }\n\n // Current Active Tick\n if (cursorRow != null) {\n const tickY = Math.round(getTickY(cursorRow));\n\n const trackWidth = vScrollBarSize - scrollBarCasingWidth;\n const tickHeight = 2;\n\n context.fillStyle = scrollBarActiveSelectionTickColor;\n context.fillRect(\n x + scrollBarCasingWidth,\n tickY,\n trackWidth,\n tickHeight\n );\n }\n }\n }\n\n context.translate(-rowHeaderWidth, -columnHeaderHeight);\n }\n}\n\nexport default GridRenderer;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"GridRenderer.js","names":["clamp","ColorUtils","memoizeClear","GridUtils","GridColorUtils","isExpandableGridModel","getOrThrow","isEditableGridModel","GridColumnSeparatorMouseHandler","GridRenderer","context","text","width","fontWidth","truncationChar","truncateToWidth","max","backgroundColors","maxDepth","split","map","color","colors","i","push","darkenForDepth","alpha","colorWithAlpha","isDark","truncate","str","len","length","substr","binaryTruncateToWidth","start","end","measureText","charWidth","repeat","Math","floor","lo","hi","min","result","mid","ceil","truncatedStr","DEFAULT_FONT_WIDTH","drawCanvas","state","save","configureContext","drawBackground","drawGrid","drawHeaders","drawFooters","drawDraggingColumn","drawDraggingRow","drawScrollBars","restore","theme","font","textBaseline","lineCap","metrics","height","fillStyle","backgroundColor","fillRect","draggingRow","draggingColumn","gridX","gridY","translate","drawGridBackground","drawCellContents","drawFloatingRows","drawFloatingColumns","floatingTopRowCount","floatingBottomRowCount","floatingRows","rowCount","visibleColumns","visibleRowYs","visibleRowHeights","floatingRowBackgroundColors","drawRowStripesForRows","drawFloatingMouseRowHover","drawGridLinesForItems","floatingGridColumnColor","floatingGridRowColor","drawCellBackgroundsForItems","drawFloatingBorders","drawSelectedRanges","top","bottom","maxY","minY","c","column","r","row","drawCellContent","floatingLeftColumnCount","floatingRightColumnCount","floatingLeftWidth","floatingRightWidth","floatingColumns","maxX","columnCount","visibleRows","visibleColumnXs","visibleColumnWidths","beginPath","rect","clip","left","right","minX","floatingDividerOuterColor","floatingDividerInnerColor","lineWidth","strokeStyle","y","moveTo","lineTo","x","stroke","drawHover","drawRowStripes","drawMouseColumnHover","drawMouseRowHover","drawGridLines","drawCellBackgrounds","has","rowBackgroundColors","rows","model","shadowBlur","shadowColor","colorSets","getCachedBackgroundColors","colorRowMap","Map","topShadowRows","bottomShadowRows","addRowToColorMap","rowAbove","depth","depthForRow","colorSet","set","get","depthAbove","undefined","forEach","colorRows","rowHeight","fill","startColor","getCachedColorWithAlpha","endColor","gradient","createLinearGradient","addColorStop","gradientY","mouseX","mouseY","mouseColumn","getColumnAtX","columnHoverBackgroundColor","columnWidth","rowHoverBackgroundColor","mouseRow","getRowAtY","drawMouseRowHoverForRow","rowFooterWidth","selectedRanges","startRow","endRow","selectedRowHoverBackgroundColor","gridColumnColor","gridRowColor","columns","columnColor","rowColor","drawGridLinesForColumns","drawGridLinesForRows","metricsMaxX","j","rowAfter","drawCellBackground","firstColumn","modelColumns","modelRows","modelRow","modelColumn","backgroundColorForCell","isFirstColumn","hasExpandableRows","drawCellRowTreeDepthLines","drawColumnCellContents","getTextRenderMetrics","textAlign","cellHorizontalPadding","treeDepthIndent","treeHorizontalPadding","treeIndent","textWidth","textX","textY","textOverride","fontWidths","textColor","textForCell","truncationCharForCell","textAlignForCell","colorForCell","truncatedText","getCachedTruncatedString","fillText","drawCellRowTreeMarker","visibleRowTreeBoxes","treeMarkerColor","treeMarkerHoverColor","columnX","rowY","isRowExpandable","treeBox","drawTreeMarker","isRowExpanded","isExpanded","x1","y1","x2","y2","markerText","treeLineColor","depthRowAfter","depthDiff","lineX","headerFont","drawColumnHeaders","drawRowHeaders","drawRowFooters","draggingColumnSeparator","isDragging","columnHeaderHeight","columnHeaderMaxDepth","headerHiddenSeparatorSize","headerHiddenSeparatorHoverColor","headerSeparatorColor","headerSeparatorHoverColor","hiddenSeparatorHeight","hiddenY","containsFrozenColumns","drawColumnHeadersForRange","hiddenColumns","entries","filter","_","w","index","highlightedSeparator","separator","getColumnSeparator","getGridPointFromXY","shouldDrawSeparator","columnIndex","nextColumnIndex","textForColumnHeader","visibleColumnIndex","indexOf","nextColumn","nextColumnWidth","isColumnHidden","isNextColumnHidden","range","bounds","d","drawColumnHeadersAtDepth","calculatedColumnWidths","userColumnWidths","movedColumns","visibleWidth","startIndex","endIndex","drawColumnHeader","drawColumnHeaderAtIndex","columnGroupName","columnGroupColor","colorForColumnHeader","columnGroupLeft","columnGroupRight","prevColumnIndex","prevModelIndex","getModelIndex","prevColumnWidth","nextModelIndex","isFullWidth","columnText","style","headerHorizontalPadding","headerBackgroundColor","headerColor","black","white","maxWidth","maxLength","separatorColor","isDarkBackground","getCachedColorIsDark","isDarkText","renderText","substring","columnLeft","visibleLeft","columnRight","visibleRight","isBeyondLeft","isBeyondRight","draggingRowSeparator","rowHeaderWidth","hiddenSeparatorWidth","hiddenX","hiddenRows","isPreviousRowHidden","getRowSeparatorIndex","visibleRowIndex","nextRow","nextRowHeight","isRowHidden","isNextRowHidden","drawRowHeader","textForRowHeader","verticalBarWidth","textForRowFooter","viewport","cursorColumn","cursorRow","editingCell","isCursorVisible","isEditable","h","selectedRange","startColumn","endColumn","round","endX","endY","selectionColor","selectionOutlineCasingColor","selectionOutlineColor","drawActiveCell","borderWidth","ACTIVE_CELL_BORDER_WIDTH","cellX","cellY","cellW","cellH","drawRoundedRect","DEFAULT_EDGE_RADIUS","quadraticCurveTo","closePath","draggingColumnVisibleRange","draggingColumnDepth","draggingModelIndex","draggingGroup","getColumnHeaderGroup","originalLeft","originalRight","originalWidth","draggingLeft","reorderOffset","columnHeaderOffset","draggingRowOffset","isDraggingHorizontalScrollBar","isDraggingVerticalScrollBar","scrollBarSize","handleHeight","handleWidth","scrollX","scrollY","hasHorizontalBar","hasVerticalBar","barWidth","barHeight","scrollBarBackgroundColor","scrollBarHoverBackgroundColor","scrollBarCasingColor","scrollBarCornerColor","scrollBarColor","scrollBarHoverColor","scrollBarActiveColor","scrollBarHoverSize","scrollBarCasingWidth","scrollBarSelectionTick","scrollBarSelectionTickColor","scrollBarActiveSelectionTickColor","autoSelectRow","autoSelectColumn","isInbounds","isVerticalBarHover","isHorizontalBarHover","hScrollBarSize","vScrollBarSize","lastLeft","filteredRanges","value","sortedRanges","sort","compareRanges","mergedRanges","mergeSortedRanges","getTickX","tickX","tickWidth","trackHeight","lastTop","getTickY","tickY","trackWidth","tickHeight"],"sources":["../src/GridRenderer.ts"],"sourcesContent":["import clamp from 'lodash.clamp';\nimport { ColorUtils } from '@deephaven/utils';\nimport memoizeClear from './memoizeClear';\nimport GridUtils from './GridUtils';\nimport GridColorUtils from './GridColorUtils';\nimport { isExpandableGridModel } from './ExpandableGridModel';\nimport {\n GridColor,\n GridColorWay,\n GridTheme,\n NullableGridColor,\n} from './GridTheme';\nimport GridModel from './GridModel';\nimport GridRange from './GridRange';\nimport GridMetrics, {\n BoxCoordinates,\n Coordinate,\n VisibleIndex,\n} from './GridMetrics';\nimport { getOrThrow } from './GridMetricCalculator';\nimport { isEditableGridModel } from './EditableGridModel';\nimport type { GridSeparator } from './mouse-handlers/GridSeparatorMouseHandler';\nimport { DraggingColumn } from './mouse-handlers/GridColumnMoveMouseHandler';\nimport GridColumnSeparatorMouseHandler from './mouse-handlers/GridColumnSeparatorMouseHandler';\nimport { BoundedAxisRange } from './GridAxisRange';\n\nexport type EditingCellTextSelectionRange = [start: number, end: number];\n\ntype NoneNullColumnRange = { startColumn: number; endColumn: number };\n\ntype NoneNullRowRange = { startRow: number; endRow: number };\n\nexport type EditingCell = {\n // Index of the editing cell\n column: VisibleIndex;\n row: VisibleIndex;\n\n // Selection within the text\n selectionRange?: EditingCellTextSelectionRange;\n\n // The value to use for the edit\n value: string;\n\n // Whether the selection was triggered with a quick edit action (e.g. Start typing with the cell in focus)\n isQuickEdit?: boolean;\n};\n\nexport type GridRenderState = {\n // The top/left cell of the scrolled viewport\n left: VisibleIndex;\n top: VisibleIndex;\n\n // Width and height of the total canvas area\n width: number;\n height: number;\n\n // The canvas context\n context: CanvasRenderingContext2D;\n\n // The grid theme\n theme: GridTheme;\n\n // The model used by the grid\n model: GridModel;\n\n // The grid metrics\n metrics: GridMetrics;\n\n // Location of the mouse on the grid\n mouseX: Coordinate | null;\n mouseY: Coordinate | null;\n\n // Where the keyboard cursor is located\n cursorColumn: VisibleIndex | null;\n cursorRow: VisibleIndex | null;\n\n // Currently selected ranges\n selectedRanges: GridRange[];\n\n // Currently dragged column/row information\n draggingColumn: DraggingColumn | null;\n draggingColumnSeparator: GridSeparator | null;\n draggingRow: VisibleIndex | null;\n draggingRowOffset: number | null;\n draggingRowSeparator: GridSeparator | null;\n\n // The currently editing cell\n editingCell: EditingCell | null;\n isDraggingHorizontalScrollBar: boolean;\n isDraggingVerticalScrollBar: boolean;\n isDragging: boolean;\n};\n\n/* eslint react/destructuring-assignment: \"off\" */\n/* eslint class-methods-use-this: \"off\" */\n/* eslint no-param-reassign: \"off\" */\n/**\n * A GridRenderer handles rendering the different parts of the grid\n * This default rendering just renders a basic grid. Extend this class and implement\n * your own methods to customize drawing of the grid (eg. Draw icons or special features)\n */\nexport class GridRenderer {\n // Default font width in pixels if it cannot be retrieved from the context\n static DEFAULT_FONT_WIDTH = 10;\n\n // Default radius in pixels for corners for some elements (like the active cell)\n static DEFAULT_EDGE_RADIUS = 2;\n\n // Default width in pixels for the border of the active cell\n static ACTIVE_CELL_BORDER_WIDTH = 2;\n\n /**\n * Truncate a string to the specified length and add ellipses if necessary\n * @param str The string to truncate\n * @param len The length to truncate the string to. If longer than the actual string, just returns the string\n * @returns The truncated string\n */\n static truncate(str: string, len: number): string {\n if (len < str.length) {\n // eslint-disable-next-line prefer-template\n return str.substr(0, len) + '…';\n }\n return str;\n }\n\n /**\n * Uses binary search to truncate a string to fit in the provided width\n * @param context The drawing context to measure the text in\n * @param str The string to get the maximum length it can draw\n * @param width The width to truncate it to\n * @param start The low boundary to start the search\n * @param end The high boundary to start the search\n * @param truncationChar This char will be repeated as the display string if the string is truncated instead of just adding an ellipsis\n * @returns The truncated string\n */\n static binaryTruncateToWidth(\n context: CanvasRenderingContext2D,\n str: string,\n width: number,\n start = 0,\n end = str.length,\n truncationChar?: string\n ): string {\n if (end >= str.length && context.measureText(str).width <= width) {\n // IDS-6069 If the whole string can fit, don't bother checking for truncation\n // The ellipses are actually slightly wider than other chars, and it's possible\n // that the \"truncation\" ends up being slightly longer, which messes up the search\n // algorithm below.\n // Besides, if we already fit, it's just faster to not bother checking other truncations.\n return str;\n }\n\n if (truncationChar) {\n const charWidth = context.measureText(truncationChar).width;\n return truncationChar.repeat(Math.max(1, Math.floor(width / charWidth)));\n }\n\n let lo = start;\n let hi = Math.min(str.length - 1, end);\n let result = str;\n while (hi >= lo) {\n const mid = Math.ceil((hi + lo) / 2);\n const truncatedStr = GridRenderer.truncate(str, mid);\n if (context.measureText(truncatedStr).width <= width) {\n result = truncatedStr;\n if (lo === mid) {\n break;\n }\n lo = mid;\n } else if (mid === 0) {\n // We already truncated to zero chars and it still doesn't fit, no need to keep looking\n result = truncatedStr;\n break;\n } else {\n hi = mid - 1;\n }\n }\n\n return result;\n }\n\n /**\n * Truncate a string (if necessary) to fit in the specified width.\n * First uses the estimated font width to calculate a lower/upper bound\n * Then uses binary search within those bounds to find the exact max length\n * @param context The drawing context\n * @param str The string to calculate max length for\n * @param width The width to truncate within\n * @param fontWidth The estimated width of each character\n * @param truncationChar This char will be repeated as the display string if the string is truncated instead of just adding an ellipsis\n * @returns The truncated string that fits within the width provided\n */\n static truncateToWidth(\n context: CanvasRenderingContext2D,\n str: string,\n width: number,\n fontWidth = GridRenderer.DEFAULT_FONT_WIDTH,\n truncationChar?: string\n ): string {\n if (width <= 0 || str.length <= 0) {\n return '';\n }\n\n // Estimate the possible low and high boundaries for truncating the text\n // Use the width of the space divided by the estimated width of each character,\n // and take half that as the low (minus 5 just to be extra safe), and double that as the high.\n const lo = Math.min(\n Math.max(0, Math.floor(width / fontWidth / 2) - 5),\n str.length\n );\n const hi = Math.min(Math.ceil((width / fontWidth) * 2), str.length);\n\n return GridRenderer.binaryTruncateToWidth(\n context,\n str,\n width,\n lo,\n hi,\n truncationChar\n );\n }\n\n /**\n * Draw the grid canvas with the state provided\n * @param state The state of the grid\n */\n drawCanvas(state: GridRenderState): void {\n const { context } = state;\n\n context.save();\n\n this.configureContext(context, state);\n\n this.drawBackground(context, state);\n\n this.drawGrid(context, state);\n\n this.drawHeaders(context, state);\n\n this.drawFooters(context, state);\n\n this.drawDraggingColumn(context, state);\n\n this.drawDraggingRow(context, state);\n\n this.drawScrollBars(context, state);\n\n context.restore();\n }\n\n configureContext(\n context: CanvasRenderingContext2D,\n state: GridRenderState\n ): void {\n const { theme } = state;\n context.font = theme.font;\n context.textBaseline = 'middle';\n context.lineCap = 'butt';\n }\n\n drawBackground(\n context: CanvasRenderingContext2D,\n state: GridRenderState\n ): void {\n const { theme, metrics } = state;\n const { width, height } = metrics;\n context.fillStyle = theme.backgroundColor;\n context.fillRect(0, 0, width, height);\n }\n\n drawGrid(context: CanvasRenderingContext2D, state: GridRenderState): void {\n const { metrics, draggingRow, draggingColumn } = state;\n const { gridX, gridY } = metrics;\n\n context.translate(gridX, gridY);\n\n this.drawGridBackground(\n context,\n state,\n draggingRow == null && draggingColumn == null\n );\n\n this.drawCellContents(context, state);\n\n this.drawFloatingRows(context, state);\n\n this.drawFloatingColumns(context, state);\n\n context.translate(-gridX, -gridY);\n }\n\n drawFloatingRows(\n context: CanvasRenderingContext2D,\n state: GridRenderState\n ): void {\n const { draggingRow, draggingColumn, metrics, theme } = state;\n const {\n floatingTopRowCount,\n floatingBottomRowCount,\n floatingRows,\n rowCount,\n visibleColumns,\n visibleRowYs,\n visibleRowHeights,\n } = metrics;\n\n if (floatingRows.length === 0) {\n return;\n }\n\n if (theme.floatingRowBackgroundColors) {\n this.drawRowStripesForRows(\n context,\n state,\n floatingRows,\n theme.floatingRowBackgroundColors\n );\n }\n\n if (draggingRow == null && draggingColumn == null) {\n this.drawFloatingMouseRowHover(context, state);\n }\n\n this.drawGridLinesForItems(\n context,\n state,\n visibleColumns,\n floatingRows,\n theme.floatingGridColumnColor,\n theme.floatingGridRowColor\n );\n\n this.drawCellBackgroundsForItems(\n context,\n state,\n visibleColumns,\n floatingRows\n );\n\n this.drawFloatingBorders(context, state);\n\n // Draw the floating row selection...\n if (floatingTopRowCount > 0) {\n this.drawSelectedRanges(context, state, {\n top: 0,\n bottom: floatingTopRowCount - 1,\n maxY:\n getOrThrow(visibleRowYs, floatingTopRowCount - 1) +\n getOrThrow(visibleRowHeights, floatingTopRowCount - 1) -\n 0.5,\n });\n }\n if (floatingBottomRowCount > 0) {\n this.drawSelectedRanges(context, state, {\n top: rowCount - floatingBottomRowCount - 1,\n bottom: rowCount - 1,\n minY: getOrThrow(visibleRowYs, rowCount - floatingBottomRowCount) + 0.5,\n maxY:\n getOrThrow(visibleRowYs, rowCount - 1) +\n getOrThrow(visibleRowHeights, rowCount - 1) -\n 0.5,\n });\n }\n\n // Draw the cell content...\n for (let c = 0; c < visibleColumns.length; c += 1) {\n const column = visibleColumns[c];\n for (let r = 0; r < floatingRows.length; r += 1) {\n const row = floatingRows[r];\n this.drawCellContent(context, state, column, row);\n }\n }\n }\n\n drawFloatingColumns(\n context: CanvasRenderingContext2D,\n state: GridRenderState\n ): void {\n const { draggingRow, draggingColumn, metrics, theme } = state;\n const {\n floatingLeftColumnCount,\n floatingRightColumnCount,\n floatingLeftWidth,\n floatingRightWidth,\n floatingColumns,\n gridX,\n maxX,\n columnCount,\n visibleRows,\n visibleColumnXs,\n visibleColumnWidths,\n width,\n height,\n } = metrics;\n\n if (floatingColumns.length === 0) {\n return;\n }\n\n if (theme.floatingRowBackgroundColors) {\n this.drawRowStripesForRows(\n context,\n state,\n visibleRows,\n theme.floatingRowBackgroundColors,\n 0,\n floatingLeftWidth\n );\n this.drawRowStripesForRows(\n context,\n state,\n visibleRows,\n theme.floatingRowBackgroundColors,\n width - gridX - floatingRightWidth,\n maxX\n );\n }\n\n if (draggingRow == null && draggingColumn == null) {\n this.drawFloatingMouseRowHover(context, state);\n }\n\n // Clip floated column grid lines.\n context.save();\n context.beginPath();\n context.rect(0, 0, floatingLeftWidth, height);\n context.clip();\n\n this.drawGridLinesForItems(\n context,\n state,\n floatingColumns,\n visibleRows,\n theme.floatingGridColumnColor,\n theme.floatingGridRowColor\n );\n\n context.restore();\n\n this.drawCellBackgroundsForItems(\n context,\n state,\n floatingColumns,\n visibleRows\n );\n\n this.drawFloatingBorders(context, state);\n\n // Draw the floating column selection...\n if (floatingLeftColumnCount > 0) {\n this.drawSelectedRanges(context, state, {\n left: 0,\n maxX:\n getOrThrow(visibleColumnXs, floatingLeftColumnCount - 1) +\n getOrThrow(visibleColumnWidths, floatingLeftColumnCount - 1),\n });\n }\n if (floatingRightColumnCount > 0) {\n this.drawSelectedRanges(context, state, {\n left: columnCount - floatingRightColumnCount,\n right: columnCount - 1,\n minX:\n getOrThrow(visibleColumnXs, columnCount - floatingRightColumnCount) +\n 0.5,\n maxX:\n getOrThrow(visibleColumnXs, columnCount - 1) +\n getOrThrow(visibleColumnWidths, columnCount - 1),\n });\n }\n\n // Draw the cell content...\n for (let c = 0; c < floatingColumns.length; c += 1) {\n const column = floatingColumns[c];\n for (let r = 0; r < visibleRows.length; r += 1) {\n const row = visibleRows[r];\n this.drawCellContent(context, state, column, row);\n }\n }\n }\n\n drawFloatingBorders(\n context: CanvasRenderingContext2D,\n state: GridRenderState\n ): void {\n const { metrics, theme } = state;\n const {\n floatingTopRowCount,\n floatingBottomRowCount,\n floatingLeftColumnCount,\n floatingRightColumnCount,\n rowCount,\n columnCount,\n visibleRowYs,\n visibleColumnXs,\n visibleRowHeights,\n visibleColumnWidths,\n maxX,\n maxY,\n } = metrics;\n const { floatingDividerOuterColor, floatingDividerInnerColor } = theme;\n\n context.lineWidth = 3;\n context.beginPath();\n context.strokeStyle = floatingDividerOuterColor;\n\n if (floatingTopRowCount > 0) {\n const y =\n getOrThrow(visibleRowYs, floatingTopRowCount - 1) +\n getOrThrow(visibleRowHeights, floatingTopRowCount - 1) +\n 0.5;\n context.moveTo(0, y);\n context.lineTo(maxX, y);\n }\n\n if (floatingBottomRowCount > 0) {\n const y =\n getOrThrow(visibleRowYs, rowCount - floatingBottomRowCount) - 0.5;\n context.moveTo(0, y);\n context.lineTo(maxX, y);\n }\n\n if (floatingLeftColumnCount > 0) {\n const x =\n getOrThrow(visibleColumnXs, floatingLeftColumnCount - 1) +\n getOrThrow(visibleColumnWidths, floatingLeftColumnCount - 1) +\n 0.5;\n context.moveTo(x, 0);\n context.lineTo(x, maxY);\n }\n\n if (floatingRightColumnCount > 0) {\n const x =\n getOrThrow(visibleColumnXs, columnCount - floatingRightColumnCount) -\n 0.5;\n context.moveTo(x, 0);\n context.lineTo(x, maxY);\n }\n\n context.stroke();\n\n context.beginPath();\n context.lineWidth = 1;\n context.strokeStyle = floatingDividerInnerColor;\n\n if (floatingTopRowCount > 0) {\n const y =\n getOrThrow(visibleRowYs, floatingTopRowCount - 1) +\n getOrThrow(visibleRowHeights, floatingTopRowCount - 1) +\n 0.5;\n context.moveTo(0, y);\n context.lineTo(maxX, y);\n }\n\n if (floatingBottomRowCount > 0) {\n const y =\n getOrThrow(visibleRowYs, rowCount - floatingBottomRowCount) - 0.5;\n context.moveTo(0, y);\n context.lineTo(maxX, y);\n }\n\n if (floatingLeftColumnCount > 0) {\n const x =\n getOrThrow(visibleColumnXs, floatingLeftColumnCount - 1) +\n getOrThrow(visibleColumnWidths, floatingLeftColumnCount - 1) +\n 0.5;\n context.moveTo(x, 0);\n context.lineTo(x, maxY);\n }\n\n if (floatingRightColumnCount > 0) {\n const x =\n getOrThrow(visibleColumnXs, columnCount - floatingRightColumnCount) -\n 0.5;\n context.moveTo(x, 0);\n context.lineTo(x, maxY);\n }\n\n context.stroke();\n }\n\n drawGridBackground(\n context: CanvasRenderingContext2D,\n state: GridRenderState,\n drawHover = false\n ): void {\n this.drawRowStripes(context, state);\n\n if (drawHover) {\n this.drawMouseColumnHover(context, state);\n\n this.drawMouseRowHover(context, state);\n }\n\n this.drawGridLines(context, state);\n\n this.drawCellBackgrounds(context, state);\n\n const { metrics } = state;\n const {\n bottom,\n right,\n floatingBottomRowCount,\n floatingLeftColumnCount,\n floatingRightColumnCount,\n floatingTopRowCount,\n columnCount,\n rowCount,\n visibleRowHeights,\n visibleRowYs,\n visibleColumnXs,\n visibleColumnWidths,\n width,\n height,\n } = metrics;\n this.drawSelectedRanges(context, state, {\n bottom: Math.min(bottom, rowCount - floatingBottomRowCount - 1),\n right: Math.min(right, columnCount - floatingRightColumnCount - 1),\n minX:\n floatingLeftColumnCount > 0 &&\n visibleColumnXs.has(floatingLeftColumnCount + 1)\n ? getOrThrow(visibleColumnXs, floatingLeftColumnCount + 1)\n : -10,\n minY:\n floatingTopRowCount > 0 && visibleRowYs.has(floatingTopRowCount + 1)\n ? getOrThrow(visibleRowYs, floatingTopRowCount + 1)\n : -10,\n maxX:\n floatingRightColumnCount > 0 &&\n visibleColumnXs.has(columnCount - floatingRightColumnCount - 1)\n ? getOrThrow(\n visibleColumnXs,\n columnCount - floatingRightColumnCount - 1\n ) +\n getOrThrow(\n visibleColumnWidths,\n columnCount - floatingRightColumnCount - 1\n ) -\n 0.5\n : width + 10,\n maxY:\n floatingBottomRowCount > 0 &&\n visibleRowYs.has(rowCount - floatingBottomRowCount - 1)\n ? getOrThrow(visibleRowYs, rowCount - floatingBottomRowCount - 1) +\n getOrThrow(\n visibleRowHeights,\n rowCount - floatingBottomRowCount - 1\n ) -\n 0.5\n : height + 10,\n });\n }\n\n drawRowStripes(\n context: CanvasRenderingContext2D,\n state: GridRenderState\n ): void {\n const { metrics, theme } = state;\n const { visibleRows } = metrics;\n const { rowBackgroundColors } = theme;\n if (!rowBackgroundColors) {\n return;\n }\n this.drawRowStripesForRows(\n context,\n state,\n visibleRows,\n rowBackgroundColors\n );\n }\n\n drawRowStripesForRows(\n context: CanvasRenderingContext2D,\n state: GridRenderState,\n rows: VisibleIndex[],\n rowBackgroundColors: GridColorWay,\n minX = 0,\n maxX = state.metrics.maxX\n ): void {\n const { theme, metrics, model } = state;\n const { maxDepth, shadowBlur, shadowColor } = theme;\n\n const colorSets = this.getCachedBackgroundColors(\n rowBackgroundColors,\n maxDepth\n );\n const { visibleRowYs, visibleRowHeights } = metrics;\n\n // Optimize by grouping together all rows that end up with the same color\n const colorRowMap = new Map();\n const topShadowRows: VisibleIndex[] = []; // Rows that are deeper than the row above them\n const bottomShadowRows: VisibleIndex[] = [];\n const addRowToColorMap = (\n row: VisibleIndex,\n rowAbove?: VisibleIndex\n ): void => {\n const depth = isExpandableGridModel(model) ? model.depthForRow(row) : 0;\n const colorSet = colorSets[row % colorSets.length];\n const color = colorSet[Math.min(depth, colorSet.length - 1)];\n if (!colorRowMap.has(color)) {\n colorRowMap.set(color, []);\n }\n colorRowMap.get(color).push(row);\n if (rowAbove != null) {\n const depthAbove = isExpandableGridModel(model)\n ? model.depthForRow(rowAbove)\n : 0;\n if (depthAbove < depth) {\n topShadowRows.push(row);\n } else if (depthAbove > depth) {\n bottomShadowRows.push(rowAbove);\n }\n }\n };\n\n // Add all the regular row stripes\n for (let i = 0; i < rows.length; i += 1) {\n const row = rows[i];\n const rowAbove = i > 0 ? rows[i - 1] : undefined;\n addRowToColorMap(row, rowAbove);\n }\n\n colorRowMap.forEach((colorRows, color) => {\n context.fillStyle = color;\n\n context.beginPath();\n\n for (let i = 0; i < colorRows.length; i += 1) {\n const row = colorRows[i];\n const y = getOrThrow(visibleRowYs, row);\n const rowHeight = getOrThrow(visibleRowHeights, row);\n context.rect(minX, y, maxX, rowHeight);\n }\n\n context.fill();\n });\n\n if (topShadowRows.length > 0) {\n context.save();\n\n const startColor = this.getCachedColorWithAlpha(shadowColor, 0.15);\n const endColor = this.getCachedColorWithAlpha(shadowColor, 0);\n const gradient = context.createLinearGradient(0, 0, 0, shadowBlur);\n gradient.addColorStop(0, startColor);\n gradient.addColorStop(1, endColor);\n context.fillStyle = gradient;\n\n for (let i = 0; i < topShadowRows.length; i += 1) {\n const row = topShadowRows[i];\n const y = getOrThrow(visibleRowYs, row);\n // Use a translate so we can reuse the gradient\n context.translate(0, y);\n context.fillRect(minX, 0, maxX, shadowBlur);\n context.translate(0, -y);\n }\n\n context.restore();\n }\n\n if (bottomShadowRows.length > 0) {\n context.save();\n\n const startColor = this.getCachedColorWithAlpha(shadowColor, 0);\n const endColor = this.getCachedColorWithAlpha(shadowColor, 0.15);\n const gradient = context.createLinearGradient(0, 0, 0, shadowBlur);\n gradient.addColorStop(0, startColor);\n gradient.addColorStop(1, endColor);\n context.fillStyle = gradient;\n\n for (let i = 0; i < bottomShadowRows.length; i += 1) {\n const row = bottomShadowRows[i];\n const y = getOrThrow(visibleRowYs, row);\n const rowHeight = getOrThrow(visibleRowHeights, row);\n const gradientY = y + rowHeight - shadowBlur;\n // Use a translate so we can reuse the gradient\n context.translate(0, gradientY);\n context.fillRect(minX, 0, maxX, shadowBlur);\n context.translate(0, -gradientY);\n }\n\n context.restore();\n }\n }\n\n drawMouseColumnHover(\n context: CanvasRenderingContext2D,\n state: GridRenderState\n ): void {\n const { mouseX, mouseY, theme, metrics } = state;\n if (mouseX == null || mouseY == null) return;\n\n const mouseColumn = GridUtils.getColumnAtX(mouseX, metrics);\n if (mouseColumn == null || !theme.columnHoverBackgroundColor) {\n return;\n }\n\n const { visibleColumnWidths, visibleColumnXs, maxY } = metrics;\n if (mouseY > maxY) {\n return;\n }\n\n const x = getOrThrow(visibleColumnXs, mouseColumn);\n const columnWidth = getOrThrow(visibleColumnWidths, mouseColumn);\n\n context.fillStyle = theme.columnHoverBackgroundColor;\n context.fillRect(x, 0, columnWidth, maxY);\n }\n\n drawMouseRowHover(\n context: CanvasRenderingContext2D,\n state: GridRenderState\n ): void {\n const { mouseX, mouseY, theme, metrics } = state;\n if (mouseX == null || mouseY == null) return;\n\n const { maxX } = metrics;\n if (mouseX > maxX || !theme.rowHoverBackgroundColor) {\n return;\n }\n\n const mouseRow = GridUtils.getRowAtY(mouseY, metrics);\n if (mouseRow == null) {\n return;\n }\n\n this.drawMouseRowHoverForRow(context, state, mouseRow);\n }\n\n drawFloatingMouseRowHover(\n context: CanvasRenderingContext2D,\n state: GridRenderState\n ): void {\n const { mouseX, mouseY, theme, metrics } = state;\n const {\n maxX,\n floatingTopRowCount,\n floatingBottomRowCount,\n rowCount,\n rowFooterWidth,\n } = metrics;\n if (\n mouseX == null ||\n mouseY == null ||\n mouseX > maxX + rowFooterWidth ||\n !theme.rowHoverBackgroundColor\n ) {\n return;\n }\n\n const mouseRow = GridUtils.getRowAtY(mouseY, metrics);\n if (\n mouseRow != null &&\n (mouseRow < floatingTopRowCount ||\n rowCount - floatingBottomRowCount <= mouseRow)\n ) {\n this.drawMouseRowHoverForRow(context, state, mouseRow);\n }\n }\n\n drawMouseRowHoverForRow(\n context: CanvasRenderingContext2D,\n state: GridRenderState,\n row: VisibleIndex\n ): void {\n const { metrics, selectedRanges, theme } = state;\n const { visibleRowHeights, visibleRowYs, maxX } = metrics;\n\n const y = getOrThrow(visibleRowYs, row);\n const rowHeight = getOrThrow(visibleRowHeights, row);\n\n if (theme.rowHoverBackgroundColor) {\n context.fillStyle = theme.rowHoverBackgroundColor;\n }\n for (let i = 0; i < selectedRanges.length; i += 1) {\n const { startRow, endRow } = selectedRanges[i];\n if (\n startRow != null &&\n endRow != null &&\n startRow <= row &&\n endRow >= row\n ) {\n if (theme.selectedRowHoverBackgroundColor) {\n context.fillStyle = theme.selectedRowHoverBackgroundColor;\n }\n break;\n }\n }\n context.fillRect(0, y, maxX, rowHeight);\n }\n\n drawGridLines(\n context: CanvasRenderingContext2D,\n state: GridRenderState\n ): void {\n const { metrics, theme } = state;\n const { visibleColumns, visibleRows } = metrics;\n\n this.drawGridLinesForItems(\n context,\n state,\n visibleColumns,\n visibleRows,\n theme.gridColumnColor,\n theme.gridRowColor\n );\n }\n\n drawGridLinesForItems(\n context: CanvasRenderingContext2D,\n state: GridRenderState,\n columns: VisibleIndex[],\n rows: VisibleIndex[],\n columnColor: NullableGridColor,\n rowColor: NullableGridColor\n ): void {\n if (!columnColor && !rowColor) {\n return;\n }\n\n context.lineWidth = 1;\n context.beginPath();\n\n if (columnColor) {\n context.strokeStyle = columnColor;\n this.drawGridLinesForColumns(context, state, columns);\n }\n if (rowColor) {\n context.strokeStyle = rowColor;\n this.drawGridLinesForRows(context, state, rows);\n }\n\n context.stroke();\n }\n\n drawGridLinesForColumns(\n context: CanvasRenderingContext2D,\n state: GridRenderState,\n columns: VisibleIndex[]\n ): void {\n const { metrics } = state;\n const { visibleColumnXs, maxY } = metrics;\n for (let i = 0; i < columns.length; i += 1) {\n const column = columns[i];\n const x = getOrThrow(visibleColumnXs, column) + 0.5;\n context.moveTo(x, 0);\n context.lineTo(x, maxY);\n }\n }\n\n drawGridLinesForRows(\n context: CanvasRenderingContext2D,\n state: GridRenderState,\n rows: VisibleIndex[]\n ): void {\n const { metrics } = state;\n const { visibleRowYs, maxX: metricsMaxX } = metrics;\n const maxX = metricsMaxX;\n\n // Draw row lines\n for (let i = 0; i < rows.length; i += 1) {\n const row = rows[i];\n const y = getOrThrow(visibleRowYs, row) + 0.5;\n context.moveTo(0.5, y);\n context.lineTo(maxX - 0.5, y);\n }\n }\n\n drawCellBackgrounds(\n context: CanvasRenderingContext2D,\n state: GridRenderState\n ): void {\n const { metrics } = state;\n const { visibleColumns, visibleRows } = metrics;\n this.drawCellBackgroundsForItems(\n context,\n state,\n visibleColumns,\n visibleRows\n );\n }\n\n drawCellBackgroundsForItems(\n context: CanvasRenderingContext2D,\n state: GridRenderState,\n columns: VisibleIndex[],\n rows: VisibleIndex[]\n ): void {\n context.save();\n\n for (let i = 0; i < columns.length; i += 1) {\n const column = columns[i];\n\n for (let j = 0; j < rows.length; j += 1) {\n const row = rows[j];\n const rowAfter = j + 1 < rows.length ? rows[j + 1] : undefined;\n this.drawCellBackground(context, state, column, row, rowAfter);\n }\n }\n\n context.restore();\n }\n\n drawCellBackground(\n context: CanvasRenderingContext2D,\n state: GridRenderState,\n column: VisibleIndex,\n row: VisibleIndex,\n rowAfter?: VisibleIndex\n ): void {\n const { metrics, model, theme } = state;\n const {\n firstColumn,\n modelColumns,\n modelRows,\n visibleColumnXs,\n visibleColumnWidths,\n visibleRowYs,\n visibleRowHeights,\n } = metrics;\n const modelRow = getOrThrow(modelRows, row);\n const modelColumn = getOrThrow(modelColumns, column);\n const backgroundColor = model.backgroundColorForCell(\n modelColumn,\n modelRow,\n theme\n );\n const isFirstColumn = column === firstColumn;\n const hasExpandableRows =\n isExpandableGridModel(model) && model.hasExpandableRows;\n\n if (backgroundColor) {\n const x = getOrThrow(visibleColumnXs, column) + 1;\n const y = getOrThrow(visibleRowYs, row) + 1;\n const columnWidth = getOrThrow(visibleColumnWidths, column) - 1;\n const rowHeight = getOrThrow(visibleRowHeights, row) - 1;\n context.fillStyle = backgroundColor;\n context.fillRect(x, y, columnWidth, rowHeight);\n }\n\n if (isFirstColumn && hasExpandableRows) {\n this.drawCellRowTreeDepthLines(context, state, row, rowAfter);\n }\n }\n\n drawCellContents(\n context: CanvasRenderingContext2D,\n state: GridRenderState\n ): void {\n const { metrics } = state;\n const { visibleColumns } = metrics;\n\n for (let i = 0; i < visibleColumns.length; i += 1) {\n const column = visibleColumns[i];\n this.drawColumnCellContents(context, state, column);\n }\n }\n\n drawColumnCellContents(\n context: CanvasRenderingContext2D,\n state: GridRenderState,\n column: VisibleIndex\n ): void {\n const { metrics } = state;\n const {\n visibleColumnXs,\n visibleColumnWidths,\n visibleRows,\n height,\n } = metrics;\n const x = getOrThrow(visibleColumnXs, column);\n const columnWidth = getOrThrow(visibleColumnWidths, column);\n\n context.save();\n\n context.beginPath();\n context.rect(x, 0, columnWidth, height);\n context.clip();\n\n for (let i = 0; i < visibleRows.length; i += 1) {\n const row = visibleRows[i];\n this.drawCellContent(context, state, column, row);\n }\n context.restore();\n }\n\n /**\n * Gets textWidth and X-Y position for a specific cell\n * The textWidth returned is the width that the text can occupy accounting for any other cell markings\n * The width accounts for tree table indents and cell padding, so it is the width the text may consume\n *\n * @param context Canvas context\n * @param state GridRenderState to get the text metrics for\n * @param column Column of cell to get text metrics for\n * @param row Row of cell to get text metrics for\n * @returns Object with width, x, and y of the text\n */\n getTextRenderMetrics(\n context: CanvasRenderingContext2D,\n state: GridRenderState,\n column: VisibleIndex,\n row: VisibleIndex\n ): {\n width: number;\n x: number;\n y: number;\n } {\n const { textAlign } = context;\n const { metrics, model, theme } = state;\n const {\n firstColumn,\n visibleColumnXs,\n visibleColumnWidths,\n visibleRowYs,\n visibleRowHeights,\n } = metrics;\n const {\n cellHorizontalPadding,\n treeDepthIndent,\n treeHorizontalPadding,\n } = theme;\n\n const x = getOrThrow(visibleColumnXs, column);\n const y = getOrThrow(visibleRowYs, row);\n const columnWidth = getOrThrow(visibleColumnWidths, column);\n const rowHeight = getOrThrow(visibleRowHeights, row);\n const isFirstColumn = column === firstColumn;\n let treeIndent = 0;\n if (\n isExpandableGridModel(model) &&\n model.hasExpandableRows &&\n isFirstColumn\n ) {\n treeIndent =\n treeDepthIndent * (model.depthForRow(row) + 1) + treeHorizontalPadding;\n }\n const textWidth = columnWidth - treeIndent;\n let textX = x + cellHorizontalPadding;\n const textY = y + rowHeight * 0.5;\n if (textAlign === 'right') {\n textX = x + textWidth - cellHorizontalPadding;\n } else if (textAlign === 'center') {\n textX = x + textWidth * 0.5;\n }\n textX += treeIndent;\n\n return {\n width: textWidth - cellHorizontalPadding * 2,\n x: textX,\n y: textY,\n };\n }\n\n drawCellContent(\n context: CanvasRenderingContext2D,\n state: GridRenderState,\n column: VisibleIndex,\n row: VisibleIndex,\n textOverride?: string\n ): void {\n const { metrics, model, theme } = state;\n const {\n firstColumn,\n fontWidths,\n modelColumns,\n modelRows,\n visibleRowHeights,\n } = metrics;\n const { textColor } = theme;\n const rowHeight = getOrThrow(visibleRowHeights, row);\n const modelRow = getOrThrow(modelRows, row);\n const modelColumn = getOrThrow(modelColumns, column);\n const text = textOverride ?? model.textForCell(modelColumn, modelRow);\n const truncationChar = model.truncationCharForCell(modelColumn, modelRow);\n const isFirstColumn = column === firstColumn;\n\n if (text && rowHeight > 0) {\n const textAlign = model.textAlignForCell(modelColumn, modelRow) || 'left';\n context.textAlign = textAlign;\n\n const color =\n model.colorForCell(modelColumn, modelRow, theme) || textColor;\n context.fillStyle = color;\n\n const {\n width: textWidth,\n x: textX,\n y: textY,\n } = this.getTextRenderMetrics(context, state, column, row);\n\n const fontWidth =\n fontWidths.get(context.font) ?? GridRenderer.DEFAULT_FONT_WIDTH;\n const truncatedText = this.getCachedTruncatedString(\n context,\n text,\n textWidth,\n fontWidth,\n truncationChar\n );\n if (truncatedText) {\n context.fillText(truncatedText, textX, textY);\n }\n }\n\n if (\n isFirstColumn &&\n isExpandableGridModel(model) &&\n model.hasExpandableRows\n ) {\n this.drawCellRowTreeMarker(context, state, row);\n }\n }\n\n drawCellRowTreeMarker(\n context: CanvasRenderingContext2D,\n state: GridRenderState,\n row: VisibleIndex\n ): void {\n const { metrics, model, mouseX, mouseY, theme } = state;\n const {\n firstColumn,\n gridX,\n gridY,\n visibleColumnXs,\n visibleColumnWidths,\n visibleRowYs,\n visibleRowHeights,\n visibleRowTreeBoxes,\n } = metrics;\n const { treeMarkerColor, treeMarkerHoverColor } = theme;\n const columnX = getOrThrow(visibleColumnXs, firstColumn);\n const columnWidth = getOrThrow(visibleColumnWidths, firstColumn);\n const rowY = getOrThrow(visibleRowYs, row);\n const rowHeight = getOrThrow(visibleRowHeights, row);\n if (!isExpandableGridModel(model) || !model.isRowExpandable(row)) {\n return;\n }\n\n const treeBox = getOrThrow(visibleRowTreeBoxes, row);\n const color =\n mouseX != null &&\n mouseY != null &&\n mouseX >= gridX + columnX &&\n mouseX <= gridX + columnX + columnWidth &&\n mouseY >= gridY + rowY &&\n mouseY <= gridY + rowY + rowHeight\n ? treeMarkerHoverColor\n : treeMarkerColor;\n\n this.drawTreeMarker(\n context,\n state,\n columnX,\n rowY,\n treeBox,\n color,\n model.isRowExpanded(row)\n );\n }\n\n drawTreeMarker(\n context: CanvasRenderingContext2D,\n state: GridRenderState,\n columnX: Coordinate,\n rowY: Coordinate,\n treeBox: BoxCoordinates,\n color: GridColor,\n isExpanded: boolean\n ): void {\n const { x1, y1, x2, y2 } = treeBox;\n const markerText = isExpanded ? '⊟' : '⊞';\n const textX = columnX + (x1 + x2) * 0.5 + 0.5;\n const textY = rowY + (y1 + y2) * 0.5 + 0.5;\n context.fillStyle = color;\n context.textAlign = 'center';\n context.fillText(markerText, textX, textY);\n }\n\n drawCellRowTreeDepthLines(\n context: CanvasRenderingContext2D,\n state: GridRenderState,\n row: VisibleIndex,\n rowAfter?: VisibleIndex\n ): void {\n const { metrics, model, theme } = state;\n\n if (!isExpandableGridModel(model)) return;\n\n const depth = model.depthForRow(row);\n if (depth === 0) return;\n\n const {\n firstColumn,\n visibleColumnXs,\n visibleRowYs,\n visibleRowHeights,\n } = metrics;\n const { treeDepthIndent, treeHorizontalPadding, treeLineColor } = theme;\n const columnX = getOrThrow(visibleColumnXs, firstColumn);\n const rowY = getOrThrow(visibleRowYs, row);\n const rowHeight = getOrThrow(visibleRowHeights, row);\n const depthRowAfter =\n rowAfter !== undefined ? model.depthForRow(rowAfter) : 0;\n const depthDiff = depth > depthRowAfter ? depth - depthRowAfter : 0;\n\n context.strokeStyle = treeLineColor;\n context.lineWidth = 1;\n\n // draw normal depth lines\n if (depth - depthDiff > 0) {\n context.beginPath();\n for (let i = 0; i < depth - depthDiff; i += 1) {\n const lineX =\n columnX +\n i * treeDepthIndent +\n treeDepthIndent * 0.5 +\n treeHorizontalPadding +\n 0.5;\n context.moveTo(lineX, rowY);\n context.lineTo(lineX, rowY + rowHeight);\n }\n context.stroke();\n }\n\n // draw as hockey stick if last row at depth\n if (depthDiff > 0) {\n context.beginPath();\n for (let i = depth - depthDiff; i < depth; i += 1) {\n const lineX =\n columnX +\n i * treeDepthIndent +\n treeDepthIndent * 0.5 +\n treeHorizontalPadding +\n 0.5;\n context.moveTo(lineX, rowY);\n context.lineTo(lineX, rowY + Math.ceil(rowHeight / 2));\n // extra moveTo prevents halfpixel in corner\n context.moveTo(lineX - 0.5, rowY + Math.ceil(rowHeight / 2) + 0.5);\n context.lineTo(\n lineX + treeDepthIndent - 0.5,\n rowY + Math.ceil(rowHeight / 2) + 0.5\n );\n }\n context.stroke();\n }\n }\n\n getCachedTruncatedString = memoizeClear(\n (\n context: CanvasRenderingContext2D,\n text: string,\n width: number,\n fontWidth: number,\n truncationChar?: string\n ): string =>\n GridRenderer.truncateToWidth(\n context,\n text,\n width,\n fontWidth,\n truncationChar\n ),\n { max: 10000 }\n );\n\n getCachedBackgroundColors = memoizeClear(\n (backgroundColors: GridColorWay, maxDepth: number): GridColor[][] =>\n backgroundColors.split(' ').map(color => {\n const colors = [];\n for (let i = 0; i < maxDepth; i += 1) {\n colors.push(GridColorUtils.darkenForDepth(color, i, maxDepth));\n }\n return colors;\n }),\n { max: 1000 }\n );\n\n getCachedColorWithAlpha = memoizeClear(\n (color, alpha) => GridColorUtils.colorWithAlpha(color, alpha),\n { max: 1000 }\n );\n\n getCachedColorIsDark = memoizeClear(\n (color: string) => ColorUtils.isDark(color),\n { max: 1000 }\n );\n\n drawHeaders(context: CanvasRenderingContext2D, state: GridRenderState): void {\n const { theme } = state;\n\n context.font = theme.headerFont;\n\n this.drawColumnHeaders(context, state);\n\n this.drawRowHeaders(context, state);\n }\n\n drawFooters(context: CanvasRenderingContext2D, state: GridRenderState): void {\n const { theme } = state;\n\n context.font = theme.headerFont;\n\n this.drawRowFooters(context, state);\n }\n\n drawColumnHeaders(\n context: CanvasRenderingContext2D,\n state: GridRenderState\n ): void {\n const {\n mouseX,\n mouseY,\n theme,\n metrics,\n draggingColumnSeparator,\n isDragging,\n model,\n } = state;\n const {\n columnHeaderHeight,\n floatingColumns,\n gridX,\n width,\n visibleColumns,\n visibleColumnWidths,\n visibleColumnXs,\n floatingLeftColumnCount,\n floatingLeftWidth,\n floatingRightWidth,\n modelColumns,\n columnHeaderMaxDepth,\n } = metrics;\n if (columnHeaderHeight <= 0) {\n return;\n }\n\n const {\n headerHiddenSeparatorSize,\n headerHiddenSeparatorHoverColor,\n headerSeparatorColor,\n headerSeparatorHoverColor,\n } = theme;\n const hiddenSeparatorHeight = columnHeaderHeight * 0.5;\n const hiddenY =\n columnHeaderHeight * (columnHeaderMaxDepth - 1) +\n columnHeaderHeight * 0.5 -\n hiddenSeparatorHeight * 0.5;\n const containsFrozenColumns = floatingLeftColumnCount > 0;\n\n context.save();\n\n this.drawColumnHeadersForRange(\n context,\n state,\n [visibleColumns[0], visibleColumns[visibleColumns.length - 1]],\n {\n minX: gridX + floatingLeftWidth,\n maxX: width - floatingRightWidth,\n }\n );\n\n if (containsFrozenColumns) {\n this.drawColumnHeadersForRange(\n context,\n state,\n [floatingColumns[0], floatingColumns[floatingColumns.length - 1]],\n {\n minX: gridX,\n maxX: gridX + floatingLeftWidth,\n }\n );\n }\n\n if (headerSeparatorColor) {\n context.strokeStyle = headerSeparatorColor;\n\n const hiddenColumns = [...visibleColumnWidths.entries()]\n .filter(([_, w]) => w === 0)\n .map(([index]) => index);\n\n // Now draw the hidden column separator boxes\n context.beginPath();\n context.fillStyle = headerSeparatorColor;\n for (let i = 0; i < hiddenColumns.length; i += 1) {\n const column = hiddenColumns[i];\n const columnX = getOrThrow(visibleColumnXs, column);\n const columnWidth = getOrThrow(visibleColumnWidths, column);\n const minX =\n gridX + columnX + columnWidth + 0.5 - headerHiddenSeparatorSize * 0.5;\n context.rect(\n minX,\n hiddenY,\n headerHiddenSeparatorSize,\n hiddenSeparatorHeight\n );\n }\n context.fill();\n }\n\n if (headerSeparatorHoverColor) {\n let { index: highlightedSeparator, depth } =\n draggingColumnSeparator ?? {};\n\n if (highlightedSeparator == null && mouseX != null && mouseY != null) {\n const separator = GridColumnSeparatorMouseHandler.getColumnSeparator(\n GridUtils.getGridPointFromXY(mouseX, mouseY, metrics),\n metrics,\n model,\n theme\n );\n highlightedSeparator = separator?.index;\n depth = separator?.depth;\n }\n\n let shouldDrawSeparator: boolean;\n\n if (highlightedSeparator == null) {\n shouldDrawSeparator = false;\n } else {\n const columnIndex = modelColumns.get(highlightedSeparator);\n const nextColumnIndex = modelColumns.get(highlightedSeparator + 1);\n if (columnIndex == null || nextColumnIndex == null) {\n shouldDrawSeparator = false;\n } else {\n shouldDrawSeparator =\n model.textForColumnHeader(columnIndex, depth) !==\n model.textForColumnHeader(nextColumnIndex, depth);\n }\n }\n\n if (\n shouldDrawSeparator &&\n highlightedSeparator != null &&\n depth != null &&\n (!isDragging || draggingColumnSeparator != null)\n ) {\n context.strokeStyle = headerSeparatorHoverColor;\n\n const columnX = getOrThrow(visibleColumnXs, highlightedSeparator);\n const columnWidth = getOrThrow(\n visibleColumnWidths,\n highlightedSeparator\n );\n const x = gridX + columnX + columnWidth + 0.5;\n const visibleColumnIndex = visibleColumns.indexOf(highlightedSeparator);\n const nextColumn =\n visibleColumnIndex < visibleColumns.length - 1\n ? visibleColumns[visibleColumnIndex + 1]\n : null;\n const nextColumnWidth =\n nextColumn != null ? visibleColumnWidths.get(nextColumn) : null;\n const isColumnHidden = columnWidth === 0;\n const isNextColumnHidden =\n nextColumnWidth != null && nextColumnWidth === 0;\n if (isColumnHidden) {\n context.strokeStyle = headerHiddenSeparatorHoverColor;\n context.fillStyle = headerHiddenSeparatorHoverColor;\n context.fillRect(\n x,\n hiddenY,\n headerHiddenSeparatorSize * 0.5,\n hiddenSeparatorHeight\n );\n } else if (isNextColumnHidden) {\n context.fillStyle = headerSeparatorHoverColor;\n context.fillRect(\n x - headerHiddenSeparatorSize * 0.5,\n hiddenY,\n headerHiddenSeparatorSize * 0.5,\n hiddenSeparatorHeight\n );\n }\n\n // column seperator hover line\n context.beginPath();\n context.moveTo(\n x,\n (columnHeaderMaxDepth - depth - 1) * columnHeaderHeight\n );\n context.lineTo(\n x,\n (columnHeaderMaxDepth - depth) * columnHeaderHeight - 1\n );\n context.stroke();\n }\n }\n\n context.restore();\n }\n\n drawColumnHeadersForRange(\n context: CanvasRenderingContext2D,\n state: GridRenderState,\n range: BoundedAxisRange,\n bounds: { minX: number; maxX: number }\n ): void {\n const { model } = state;\n const { columnHeaderMaxDepth } = model;\n\n if (columnHeaderMaxDepth === 0) {\n return;\n }\n\n for (let d = 0; d <= columnHeaderMaxDepth; d += 1) {\n this.drawColumnHeadersAtDepth(context, state, range, bounds, d);\n }\n }\n\n drawColumnHeadersAtDepth(\n context: CanvasRenderingContext2D,\n state: GridRenderState,\n range: BoundedAxisRange,\n bounds: { minX: number; maxX: number },\n depth: number\n ): void {\n const { metrics, model, theme } = state;\n const {\n modelColumns,\n visibleColumnXs,\n gridX,\n calculatedColumnWidths,\n userColumnWidths,\n visibleColumnWidths,\n movedColumns,\n } = metrics;\n const { columnHeaderHeight, columnWidth } = theme;\n const { columnHeaderMaxDepth } = model;\n const { minX, maxX } = bounds;\n const visibleWidth = maxX - minX;\n\n if (columnHeaderMaxDepth === 0) {\n return;\n }\n\n const startIndex = range[0];\n const endIndex = range[1];\n\n context.save();\n context.translate(\n 0,\n (columnHeaderMaxDepth - depth - 1) * columnHeaderHeight\n );\n\n if (depth === 0) {\n // Make sure base column header background always goes to the right edge\n this.drawColumnHeader(context, state, '', minX, maxX);\n\n // Draw base column headers\n for (let i = startIndex; i <= endIndex; i += 1) {\n this.drawColumnHeaderAtIndex(context, state, i, bounds);\n }\n }\n\n // Draw column header group\n if (depth > 0) {\n let columnIndex = startIndex;\n\n while (columnIndex <= endIndex) {\n const { columnCount } = metrics;\n const modelColumn = getOrThrow(modelColumns, columnIndex);\n const columnGroupName = model.textForColumnHeader(modelColumn, depth);\n const columnGroupColor = model.colorForColumnHeader(modelColumn, depth);\n let columnGroupLeft = getOrThrow(visibleColumnXs, columnIndex) + gridX;\n let columnGroupRight =\n columnGroupLeft + getOrThrow(visibleColumnWidths, columnIndex);\n\n if (columnGroupName != null) {\n // Need to determine if the column group is at least the width of the bounds\n // And if the left/right of the group extend past the bounds\n // The group will be drawn as if it were a column with a max width of the bounds width\n let prevColumnIndex = columnIndex - 1;\n while (\n prevColumnIndex >= 0 &&\n (columnGroupRight - columnGroupLeft < visibleWidth ||\n columnGroupLeft > minX)\n ) {\n const prevModelIndex =\n modelColumns.get(prevColumnIndex) ??\n GridUtils.getModelIndex(prevColumnIndex, movedColumns);\n if (\n prevModelIndex == null ||\n model.textForColumnHeader(prevModelIndex, depth) !==\n columnGroupName\n ) {\n // Previous column not in the same group\n break;\n }\n\n // Use this instead of visibleColumnWidths b/c the columns may be off screen\n const prevColumnWidth =\n userColumnWidths.get(prevModelIndex) ??\n calculatedColumnWidths.get(prevModelIndex) ??\n columnWidth;\n\n columnGroupLeft -= prevColumnWidth;\n prevColumnIndex -= 1;\n }\n\n let nextColumnIndex = columnIndex + 1;\n while (\n nextColumnIndex < columnCount &&\n (columnGroupRight - columnGroupLeft < visibleWidth ||\n columnGroupRight < maxX)\n ) {\n const nextModelIndex =\n modelColumns.get(nextColumnIndex) ??\n GridUtils.getModelIndex(nextColumnIndex, movedColumns);\n if (\n model.textForColumnHeader(nextModelIndex, depth) !==\n columnGroupName\n ) {\n // Next column not in the same group\n break;\n }\n\n // Use this instead of visibleColumnWidths b/c the columns may be off screen\n const nextColumnWidth =\n userColumnWidths.get(nextModelIndex) ??\n calculatedColumnWidths.get(nextModelIndex) ??\n columnWidth;\n\n columnGroupRight += nextColumnWidth;\n nextColumnIndex += 1;\n }\n\n // Set column index to end of the current group\n columnIndex = nextColumnIndex - 1;\n\n const isFullWidth =\n columnGroupRight - columnGroupLeft >= visibleWidth;\n let x = columnGroupLeft;\n if (isFullWidth) {\n if (columnGroupRight < maxX) {\n x = columnGroupRight - visibleWidth;\n } else if (columnGroupLeft < minX) {\n x = minX;\n }\n }\n\n this.drawColumnHeader(\n context,\n state,\n columnGroupName,\n x,\n Math.min(columnGroupRight - columnGroupLeft, visibleWidth),\n {\n backgroundColor: columnGroupColor ?? undefined,\n },\n bounds\n );\n }\n columnIndex += 1;\n }\n }\n context.restore();\n }\n\n /**\n * Draws the column header for the given visible index\n * @param context Canvas context\n * @param state Grid render state\n * @param index Visible index of the column header to draw\n * @param bounds The horizontal bounds the header can be drawn in\n */\n drawColumnHeaderAtIndex(\n context: CanvasRenderingContext2D,\n state: GridRenderState,\n index: VisibleIndex,\n bounds: { minX: number; maxX: number }\n ): void {\n const { metrics, model } = state;\n const {\n modelColumns,\n visibleColumnWidths,\n visibleColumnXs,\n gridX,\n } = metrics;\n const width = getOrThrow(visibleColumnWidths, index);\n const x = getOrThrow(visibleColumnXs, index) + gridX;\n const modelColumn = getOrThrow(modelColumns, index);\n const text = model.textForColumnHeader(modelColumn);\n\n if (text == null) {\n return;\n }\n\n this.drawColumnHeader(\n context,\n state,\n text,\n x,\n width,\n {\n backgroundColor: model.colorForColumnHeader(modelColumn) ?? undefined,\n },\n bounds\n );\n }\n\n drawColumnHeader(\n context: CanvasRenderingContext2D,\n state: GridRenderState,\n columnText: string,\n columnX: Coordinate,\n columnWidth: number,\n style?: {\n backgroundColor?: string;\n textColor?: string;\n separatorColor?: string;\n },\n bounds?: { minX?: number; maxX?: number }\n ): void {\n if (columnWidth <= 0) {\n return;\n }\n const { metrics, theme } = state;\n\n const {\n headerHorizontalPadding,\n columnHeaderHeight,\n headerBackgroundColor,\n headerColor,\n headerSeparatorColor,\n black,\n white,\n } = theme;\n const { fontWidths, width } = metrics;\n const fontWidth =\n fontWidths.get(context.font) || GridRenderer.DEFAULT_FONT_WIDTH;\n\n const maxWidth = columnWidth - headerHorizontalPadding * 2;\n const maxLength = maxWidth / fontWidth;\n\n const {\n backgroundColor = headerBackgroundColor,\n separatorColor = headerSeparatorColor,\n } = style ?? {};\n\n let { textColor = headerColor } = style ?? {};\n\n try {\n const isDarkBackground = this.getCachedColorIsDark(backgroundColor);\n const isDarkText = this.getCachedColorIsDark(textColor);\n if (isDarkBackground && isDarkText) {\n textColor = white;\n } else if (!isDarkBackground && !isDarkText) {\n textColor = black;\n }\n } catch {\n // Invalid color provided\n // no-op since we don't use logging in base grid\n }\n\n let { minX = 0, maxX = width } = bounds ?? {};\n\n context.save();\n context.rect(minX, 0, maxX - minX, columnHeaderHeight);\n context.clip();\n\n // Fill background color if specified\n if (backgroundColor) {\n context.fillStyle = backgroundColor;\n context.fillRect(columnX, 0, columnWidth, columnHeaderHeight);\n }\n\n if (separatorColor) {\n context.strokeStyle = separatorColor;\n context.beginPath();\n\n // Don't draw left separator if column touches the left edge\n if (columnX > 0) {\n context.moveTo(columnX + 0.5, 0);\n context.lineTo(columnX + 0.5, columnHeaderHeight);\n }\n context.moveTo(columnX + columnWidth + 0.5, 0);\n context.lineTo(columnX + columnWidth + 0.5, columnHeaderHeight);\n\n // Bottom Border, should be interior to the header height\n context.moveTo(columnX, columnHeaderHeight - 0.5);\n context.lineTo(columnX + columnWidth, columnHeaderHeight - 0.5);\n context.stroke();\n }\n\n context.beginPath();\n context.rect(columnX, 0, columnWidth, columnHeaderHeight);\n context.clip();\n context.fillStyle = textColor;\n\n let renderText = columnText;\n\n if (maxLength <= 0) {\n renderText = '';\n } else if (renderText.length > maxLength) {\n renderText = `${renderText.substring(0, maxLength - 1)}…`;\n }\n\n const textWidth = renderText.length * fontWidth;\n let x = columnX + columnWidth * 0.5;\n const y = columnHeaderHeight * 0.5;\n minX += headerHorizontalPadding;\n maxX -= headerHorizontalPadding;\n\n const columnLeft = columnX + headerHorizontalPadding;\n const visibleLeft = clamp(columnLeft, minX, maxX);\n const columnRight = columnX + columnWidth - headerHorizontalPadding;\n const visibleRight = clamp(columnRight, minX, maxX);\n const visibleWidth = visibleRight - visibleLeft;\n\n const isBeyondLeft = x - textWidth * 0.5 < minX;\n const isBeyondRight = x + textWidth * 0.5 > maxX;\n\n if (isBeyondLeft) {\n // Column name would be off the left side of the canvas\n if (textWidth < visibleWidth) {\n // Can render the entire text in the visible space. Stick to left\n x = minX + textWidth * 0.5;\n } else {\n x = columnRight - textWidth * 0.5;\n }\n } else if (isBeyondRight) {\n if (textWidth < visibleWidth) {\n // Can render the entire text in the visible space. Stick to right\n x = maxX - textWidth * 0.5;\n } else {\n x = columnLeft + textWidth * 0.5;\n }\n }\n context.textAlign = 'center';\n context.fillText(renderText, x, y);\n\n context.restore();\n }\n\n drawRowHeaders(\n context: CanvasRenderingContext2D,\n state: GridRenderState\n ): void {\n const { mouseX, mouseY, metrics, theme, draggingRowSeparator } = state;\n const {\n gridY,\n rowHeaderWidth,\n height,\n visibleRows,\n visibleRowHeights,\n visibleRowYs,\n } = metrics;\n if (rowHeaderWidth <= 0) {\n return;\n }\n\n const {\n headerBackgroundColor,\n headerColor,\n headerHiddenSeparatorSize,\n headerHiddenSeparatorHoverColor,\n headerSeparatorColor,\n headerSeparatorHoverColor,\n } = theme;\n const hiddenSeparatorWidth = rowHeaderWidth * 0.5;\n const hiddenX = rowHeaderWidth * 0.5 - hiddenSeparatorWidth * 0.5;\n\n context.save();\n\n context.beginPath();\n\n // Fill in the background\n context.fillStyle = headerBackgroundColor;\n context.fillRect(0, 0, rowHeaderWidth, height);\n\n // Draw the separators\n if (headerSeparatorColor) {\n context.strokeStyle = headerSeparatorColor;\n context.beginPath();\n context.moveTo(0, gridY + 0.5);\n context.lineTo(rowHeaderWidth, gridY + 0.5);\n\n const hiddenRows = [];\n let isPreviousRowHidden = false;\n for (let i = 0; i < visibleRows.length; i += 1) {\n const row = visibleRows[i];\n const rowY = getOrThrow(visibleRowYs, row);\n const rowHeight = getOrThrow(visibleRowHeights, row);\n if (rowHeight > 0) {\n const y = gridY + rowY + rowHeight + 0.5;\n\n context.moveTo(0, y);\n context.lineTo(rowHeaderWidth, y);\n\n isPreviousRowHidden = false;\n } else if (!isPreviousRowHidden) {\n isPreviousRowHidden = true;\n hiddenRows.push(row);\n }\n }\n\n // border right, interior to the headerWidth\n context.moveTo(rowHeaderWidth - 0.5, 0);\n context.lineTo(rowHeaderWidth - 0.5, height);\n\n context.stroke();\n\n // Draw the hidden column separators\n context.beginPath();\n context.fillStyle = headerSeparatorColor;\n for (let i = 0; i < hiddenRows.length; i += 1) {\n const row = hiddenRows[i];\n const rowY = getOrThrow(visibleRowYs, row);\n const rowHeight = getOrThrow(visibleRowHeights, row);\n const minY =\n gridY + rowY + rowHeight + 0.5 - headerHiddenSeparatorSize * 0.5;\n context.rect(\n hiddenX,\n minY,\n hiddenSeparatorWidth,\n headerHiddenSeparatorSize\n );\n }\n\n context.fill();\n }\n\n if (headerSeparatorHoverColor) {\n let { index: highlightedSeparator = null } = draggingRowSeparator ?? {};\n if (highlightedSeparator == null && mouseX != null && mouseY != null) {\n highlightedSeparator = GridUtils.getRowSeparatorIndex(\n mouseX,\n mouseY,\n metrics,\n theme\n );\n }\n\n if (highlightedSeparator != null) {\n context.strokeStyle = headerSeparatorHoverColor;\n\n const rowY = getOrThrow(visibleRowYs, highlightedSeparator);\n const rowHeight = getOrThrow(visibleRowHeights, highlightedSeparator);\n const y = gridY + rowY + rowHeight + 0.5;\n\n const visibleRowIndex = visibleRows.indexOf(highlightedSeparator);\n const nextRow =\n visibleRowIndex < visibleRows.length - 1\n ? visibleRows[visibleRowIndex + 1]\n : null;\n const nextRowHeight =\n nextRow != null ? visibleRowHeights.get(nextRow) : null;\n const isRowHidden = rowHeight === 0;\n const isNextRowHidden = nextRowHeight != null && nextRowHeight === 0;\n if (isRowHidden) {\n context.strokeStyle = headerHiddenSeparatorHoverColor;\n context.fillStyle = headerHiddenSeparatorHoverColor;\n context.fillRect(\n hiddenX,\n y,\n hiddenSeparatorWidth,\n headerHiddenSeparatorSize * 0.5\n );\n } else if (isNextRowHidden) {\n context.fillStyle = headerSeparatorHoverColor;\n context.fillRect(\n hiddenX,\n y - headerHiddenSeparatorSize * 0.5,\n hiddenSeparatorWidth,\n headerHiddenSeparatorSize * 0.5\n );\n }\n\n context.beginPath();\n context.moveTo(0.5, y);\n context.lineTo(rowHeaderWidth + 0.5, y);\n context.stroke();\n }\n }\n\n // Fill in the text\n context.beginPath();\n context.rect(0, gridY, rowHeaderWidth, height);\n context.clip();\n\n context.fillStyle = headerColor;\n context.textAlign = 'right';\n\n for (let i = 0; i < visibleRows.length; i += 1) {\n const row = visibleRows[i];\n const rowHeight = getOrThrow(visibleRowHeights, row);\n const y = getOrThrow(visibleRowYs, row) + gridY;\n this.drawRowHeader(context, state, row, y, rowHeight);\n }\n\n context.restore();\n }\n\n drawRowHeader(\n context: CanvasRenderingContext2D,\n state: GridRenderState,\n row: VisibleIndex,\n rowY: Coordinate,\n rowHeight: number\n ): void {\n if (rowHeight <= 0) {\n return;\n }\n const { metrics, model, theme } = state;\n const { modelRows, rowHeaderWidth } = metrics;\n const modelRow = getOrThrow(modelRows, row);\n const x = rowHeaderWidth - theme.cellHorizontalPadding;\n const y = rowY + rowHeight * 0.5;\n context.fillText(model.textForRowHeader(modelRow), x, y);\n }\n\n drawRowFooters(\n context: CanvasRenderingContext2D,\n state: GridRenderState\n ): void {\n const {\n mouseX,\n mouseY,\n metrics,\n model,\n theme,\n draggingRowSeparator,\n } = state;\n const {\n gridY,\n gridX,\n maxX,\n modelRows,\n rowFooterWidth,\n height,\n verticalBarWidth,\n visibleRows,\n visibleRowHeights,\n visibleRowYs,\n width,\n } = metrics;\n if (rowFooterWidth <= 0) {\n return;\n }\n\n const {\n cellHorizontalPadding,\n headerBackgroundColor,\n headerColor,\n headerHiddenSeparatorSize,\n headerHiddenSeparatorHoverColor,\n headerSeparatorColor,\n headerSeparatorHoverColor,\n } = theme;\n const hiddenSeparatorWidth = rowFooterWidth * 0.5;\n const hiddenX = rowFooterWidth * 0.5 - hiddenSeparatorWidth * 0.5;\n const x = Math.min(gridX + maxX, width - rowFooterWidth - verticalBarWidth);\n\n context.save();\n\n context.beginPath();\n\n // Fill in the background\n context.fillStyle = headerBackgroundColor;\n context.fillRect(x, gridY, rowFooterWidth, height);\n\n // Draw the separators\n if (headerSeparatorColor) {\n context.strokeStyle = headerSeparatorColor;\n context.beginPath();\n context.moveTo(x, gridY + 0.5);\n context.lineTo(rowFooterWidth, gridY + 0.5);\n\n const hiddenRows = [];\n let isPreviousRowHidden = false;\n for (let i = 0; i < visibleRows.length; i += 1) {\n const row = visibleRows[i];\n const rowY = getOrThrow(visibleRowYs, row);\n const rowHeight = getOrThrow(visibleRowHeights, row);\n if (rowHeight > 0) {\n const y = gridY + rowY + rowHeight + 0.5;\n\n context.moveTo(x + 0.5, y);\n context.lineTo(x + rowFooterWidth - 0.5, y);\n\n isPreviousRowHidden = false;\n } else if (!isPreviousRowHidden) {\n isPreviousRowHidden = true;\n hiddenRows.push(row);\n }\n }\n\n // border left, interior to the headerWidth\n context.moveTo(x + 0.5, gridY);\n context.lineTo(x + 0.5, height);\n\n context.stroke();\n\n // Draw the hidden column separators\n context.beginPath();\n context.fillStyle = headerSeparatorColor;\n for (let i = 0; i < hiddenRows.length; i += 1) {\n const row = hiddenRows[i];\n const rowY = getOrThrow(visibleRowYs, row);\n const rowHeight = getOrThrow(visibleRowHeights, row);\n const minY =\n gridY + rowY + rowHeight + 0.5 - headerHiddenSeparatorSize * 0.5;\n context.rect(\n x + hiddenX,\n minY,\n hiddenSeparatorWidth,\n headerHiddenSeparatorSize\n );\n }\n\n context.fill();\n }\n\n if (headerSeparatorHoverColor) {\n let { index: highlightedSeparator = null } = draggingRowSeparator ?? {};\n if (highlightedSeparator == null && mouseX != null && mouseY != null) {\n highlightedSeparator = GridUtils.getRowSeparatorIndex(\n mouseX,\n mouseY,\n metrics,\n theme\n );\n }\n\n if (highlightedSeparator != null) {\n context.strokeStyle = headerSeparatorHoverColor;\n\n const rowY = getOrThrow(visibleRowYs, highlightedSeparator);\n const rowHeight = getOrThrow(visibleRowHeights, highlightedSeparator);\n const y = gridY + rowY + rowHeight + 0.5;\n\n const visibleRowIndex = visibleRows.indexOf(highlightedSeparator);\n const nextRow =\n visibleRowIndex < visibleRows.length - 1\n ? visibleRows[visibleRowIndex + 1]\n : null;\n const nextRowHeight =\n nextRow != null ? visibleRowHeights.get(nextRow) : null;\n const isRowHidden = rowHeight === 0;\n const isNextRowHidden = nextRowHeight != null && nextRowHeight === 0;\n if (isRowHidden) {\n context.strokeStyle = headerHiddenSeparatorHoverColor;\n context.fillStyle = headerHiddenSeparatorHoverColor;\n context.fillRect(\n hiddenX,\n y,\n hiddenSeparatorWidth,\n headerHiddenSeparatorSize * 0.5\n );\n } else if (isNextRowHidden) {\n context.fillStyle = headerSeparatorHoverColor;\n context.fillRect(\n hiddenX,\n y - headerHiddenSeparatorSize * 0.5,\n hiddenSeparatorWidth,\n headerHiddenSeparatorSize * 0.5\n );\n }\n\n context.beginPath();\n context.moveTo(x + 0.5, y);\n context.lineTo(x + rowFooterWidth + 0.5, y);\n context.stroke();\n }\n }\n\n // Fill in the text\n context.beginPath();\n context.rect(x, gridY, rowFooterWidth, height);\n context.clip();\n\n context.fillStyle = headerColor;\n context.textAlign = 'left';\n\n const textX = x + cellHorizontalPadding;\n for (let i = 0; i < visibleRows.length; i += 1) {\n const row = visibleRows[i];\n const rowHeight = getOrThrow(visibleRowHeights, row);\n if (rowHeight > 0) {\n const rowY = getOrThrow(visibleRowYs, row) + gridY;\n const modelRow = getOrThrow(modelRows, row);\n const textY = rowY + rowHeight * 0.5;\n context.fillText(model.textForRowFooter(modelRow), textX, textY);\n }\n }\n\n context.restore();\n }\n\n drawSelectedRanges(\n context: CanvasRenderingContext2D,\n state: GridRenderState,\n viewport: {\n left?: VisibleIndex;\n top?: VisibleIndex;\n right?: VisibleIndex;\n bottom?: VisibleIndex;\n minX?: Coordinate;\n minY?: Coordinate;\n maxX?: Coordinate;\n maxY?: Coordinate;\n } = {}\n ): void {\n const {\n cursorColumn: column,\n cursorRow: row,\n draggingRow,\n draggingColumn,\n editingCell,\n metrics,\n model,\n selectedRanges,\n theme,\n } = state;\n const {\n visibleColumnWidths,\n visibleColumnXs,\n visibleRowHeights,\n visibleRowYs,\n width,\n height,\n } = metrics;\n const {\n left = metrics.left,\n top = metrics.top,\n right = metrics.right,\n bottom = metrics.bottom,\n minY = -10,\n maxY = height + 10,\n minX = -10,\n maxX = width + 10,\n } = viewport;\n if (selectedRanges.length === 0) {\n return;\n }\n\n const isCursorVisible =\n isEditableGridModel(model) &&\n model.isEditable &&\n editingCell == null &&\n draggingRow == null &&\n draggingColumn == null &&\n column != null &&\n row != null &&\n visibleColumnXs.has(column) &&\n visibleRowYs.has(row);\n if (isCursorVisible) {\n // Punch a hole out where the active cell is, it gets styled differently.\n const x = getOrThrow(visibleColumnXs, column);\n const y = getOrThrow(visibleRowYs, row);\n const w = getOrThrow(visibleColumnWidths, column);\n const h = getOrThrow(visibleRowHeights, row);\n\n context.save();\n\n context.beginPath();\n\n context.rect(0, 0, width, height);\n context.rect(x, y, w, h);\n\n context.clip('evenodd');\n }\n\n // Draw selection ranges\n context.beginPath();\n for (let i = 0; i < selectedRanges.length; i += 1) {\n const selectedRange = selectedRanges[i];\n const startColumn =\n selectedRange.startColumn !== null ? selectedRange.startColumn : left;\n const startRow =\n selectedRange.startRow !== null ? selectedRange.startRow : top;\n const endColumn =\n selectedRange.endColumn !== null ? selectedRange.endColumn : right;\n const endRow =\n selectedRange.endRow !== null ? selectedRange.endRow : bottom;\n if (\n endRow >= top &&\n bottom >= startRow &&\n endColumn >= left &&\n right >= startColumn\n ) {\n // Need to offset the x/y coordinates so that the line draws nice and crisp\n const x =\n startColumn >= left && visibleColumnXs.has(startColumn)\n ? Math.round(getOrThrow(visibleColumnXs, startColumn)) + 0.5\n : minX;\n const y =\n startRow >= top && visibleRowYs.has(startRow)\n ? Math.max(\n Math.round(getOrThrow(visibleRowYs, startRow)) + 0.5,\n 0.5\n )\n : minY;\n\n const endX =\n endColumn <= right && visibleColumnXs.has(endColumn)\n ? Math.round(\n getOrThrow(visibleColumnXs, endColumn) +\n getOrThrow(visibleColumnWidths, endColumn)\n ) - 0.5\n : maxX;\n const endY =\n endRow <= bottom && visibleRowYs.has(endRow)\n ? Math.round(\n getOrThrow(visibleRowYs, endRow) +\n getOrThrow(visibleRowHeights, endRow)\n ) - 0.5\n : maxY;\n\n context.rect(x, y, endX - x, endY - y);\n }\n\n // draw the inner transparent fill\n context.fillStyle = theme.selectionColor;\n context.fill();\n\n /**\n * draw an \"inner stroke\" that's clipped to just inside of the rects\n * to act as a casing to the outer stroke. 3px width because 1px is outside\n * the rect (but clipped), 1px is \"on\" the rect (technically this pixel is\n * a half pixel clip as well due to rects offset, but we are immediately painting\n * over it), and then the 1px inside (which is the desired pixel).\n */\n context.save();\n context.clip();\n context.strokeStyle = theme.selectionOutlineCasingColor;\n context.lineWidth = 3;\n context.stroke();\n context.restore();\n\n // draw the outerstroke border on top of the inner stroke\n context.strokeStyle = theme.selectionOutlineColor;\n context.lineWidth = 1;\n context.stroke();\n }\n\n if (isCursorVisible && column != null && row != null) {\n context.restore();\n\n this.drawActiveCell(context, state, column, row);\n }\n }\n\n drawActiveCell(\n context: CanvasRenderingContext2D,\n state: GridRenderState,\n column: VisibleIndex,\n row: VisibleIndex,\n borderWidth = GridRenderer.ACTIVE_CELL_BORDER_WIDTH\n ): void {\n const { metrics, theme } = state;\n const {\n visibleColumnWidths,\n visibleColumnXs,\n visibleRowHeights,\n visibleRowYs,\n } = metrics;\n const cellX = getOrThrow(visibleColumnXs, column);\n const cellY = getOrThrow(visibleRowYs, row);\n const cellW = getOrThrow(visibleColumnWidths, column);\n const cellH = getOrThrow(visibleRowHeights, row);\n\n // Now get the outline for the active cell\n let x = cellX - borderWidth * 0.5;\n let y = cellY - borderWidth * 0.5;\n let w = cellW + borderWidth;\n let h = cellH + borderWidth;\n\n // Make sure the outline is interior on the edge\n if (x <= 0) {\n w += x - 1;\n x = 1;\n }\n if (y <= 0) {\n h += y - 1;\n y = 1;\n }\n\n const { lineWidth } = context;\n context.beginPath();\n context.lineWidth = borderWidth;\n context.strokeStyle = theme.selectionOutlineColor;\n this.drawRoundedRect(context, x, y, w, h);\n context.stroke();\n context.lineWidth = lineWidth;\n }\n\n /**\n * Draws a rounded rectangle using the current state of the canvas.\n *\n * @param context The canvas context\n * @param x coordinate of the left side\n * @param y coordinate of the top side\n * @param w width of the rectangle\n * @param h height of the rectangle\n * @param r corner radius of the rectangle\n */\n drawRoundedRect(\n context: CanvasRenderingContext2D,\n x: Coordinate,\n y: Coordinate,\n w: number,\n h: number,\n r = GridRenderer.DEFAULT_EDGE_RADIUS\n ): void {\n context.beginPath();\n context.moveTo(x + r, y);\n context.lineTo(x + w - r, y);\n context.quadraticCurveTo(x + w, y, x + w, y + r);\n context.lineTo(x + w, y + h - r);\n context.quadraticCurveTo(x + w, y + h, x + w - r, y + h);\n context.lineTo(x + r, y + h);\n context.quadraticCurveTo(x, y + h, x, y + h - r);\n context.lineTo(x, y + r);\n context.quadraticCurveTo(x, y, x + r, y);\n context.closePath();\n }\n\n drawDraggingColumn(\n context: CanvasRenderingContext2D,\n state: GridRenderState\n ): void {\n const { draggingColumn, metrics, mouseX, theme, model } = state;\n if (draggingColumn == null || mouseX == null) {\n return;\n }\n\n const {\n range: draggingColumnVisibleRange,\n depth: draggingColumnDepth,\n } = draggingColumn;\n\n const {\n gridX,\n gridY,\n visibleColumnXs,\n visibleColumnWidths,\n height,\n width,\n columnHeaderMaxDepth,\n columnHeaderHeight,\n movedColumns,\n modelColumns,\n floatingLeftWidth,\n } = metrics;\n\n const draggingModelIndex =\n modelColumns.get(draggingColumnVisibleRange[0]) ??\n GridUtils.getModelIndex(draggingColumnVisibleRange[0], movedColumns);\n\n const draggingGroup = model.getColumnHeaderGroup(\n draggingModelIndex,\n draggingColumnDepth\n );\n\n if (draggingColumnDepth > 0 && !draggingGroup) {\n return;\n }\n\n const [startIndex, endIndex] = draggingColumnVisibleRange;\n\n const originalLeft = getOrThrow(visibleColumnXs, startIndex);\n const originalRight =\n getOrThrow(visibleColumnXs, endIndex) +\n getOrThrow(visibleColumnWidths, endIndex);\n const originalWidth = originalRight - originalLeft;\n\n const draggingLeft = draggingColumn.left;\n\n const {\n backgroundColor,\n font,\n headerFont,\n reorderOffset,\n shadowBlur,\n shadowColor,\n } = theme;\n\n const columnHeaderOffset =\n (columnHeaderMaxDepth - draggingColumnDepth - 1) * columnHeaderHeight;\n\n context.save();\n\n context.translate(gridX, 0);\n\n context.save();\n context.beginPath();\n\n // Don't draw over frozen columns\n context.rect(floatingLeftWidth, 0, width, height);\n context.clip();\n\n // First, we need to draw over where the column is coming from\n context.fillStyle = backgroundColor;\n context.fillRect(originalLeft, columnHeaderOffset, originalWidth, height);\n context.restore();\n\n // Then draw the shadow of the moving column\n context.translate(0, reorderOffset);\n\n context.save();\n context.shadowColor = shadowColor;\n context.shadowBlur = shadowBlur;\n\n context.fillStyle = backgroundColor;\n context.fillRect(\n draggingColumn.left,\n columnHeaderOffset + reorderOffset,\n draggingColumn.width,\n height\n );\n context.restore(); // Reset style\n\n // Now set the clipping region and pretty much just redraw this column and all it's contents\n context.beginPath();\n context.rect(\n draggingColumn.left,\n columnHeaderOffset,\n draggingColumn.width + 1,\n height\n );\n context.clip();\n\n context.translate(draggingLeft - originalLeft, 0);\n context.font = headerFont;\n\n const visibleColumns: VisibleIndex[] = [];\n for (\n let i = draggingColumn.range[0];\n i <= draggingColumn.range[1];\n i += 1\n ) {\n visibleColumns.push(i);\n }\n\n /**\n * This will not draw the header text properly, but extensions of Grid\n * may draw extra things in the header like sorts and filters\n */\n this.drawColumnHeaders(context, state);\n\n // Ensure the column header gets drawn\n this.drawColumnHeadersForRange(\n context,\n state,\n [visibleColumns[0], visibleColumns[visibleColumns.length - 1]],\n {\n minX: originalLeft,\n maxX: width,\n }\n );\n\n context.translate(0, gridY);\n context.font = font;\n\n this.drawGridBackground(context, state);\n\n for (let i = startIndex; i <= endIndex; i += 1) {\n this.drawColumnCellContents(context, state, i);\n }\n\n context.restore();\n }\n\n drawDraggingRow(\n context: CanvasRenderingContext2D,\n state: GridRenderState\n ): void {\n const { draggingRow, draggingRowOffset, metrics, mouseY, theme } = state;\n if (draggingRow == null || mouseY == null) {\n return;\n }\n\n const { gridX, gridY, visibleRowYs, visibleRowHeights, width } = metrics;\n const y = getOrThrow(visibleRowYs, draggingRow);\n const rowHeight = getOrThrow(visibleRowHeights, draggingRow) + 1;\n const {\n backgroundColor,\n font,\n headerFont,\n reorderOffset,\n shadowBlur,\n shadowColor,\n } = theme;\n\n context.save();\n\n context.translate(0, gridY);\n\n // First, we need to draw over the row stripes where the row is coming from\n context.fillStyle = backgroundColor;\n context.fillRect(0, y, width, rowHeight);\n\n context.translate(\n gridX + reorderOffset,\n mouseY - y - gridY - (draggingRowOffset ?? 0)\n );\n\n // Then draw the shadow of the moving row\n context.save();\n\n context.shadowColor = shadowColor;\n context.shadowBlur = shadowBlur;\n\n context.fillStyle = backgroundColor;\n context.fillRect(-gridX, y, width, rowHeight);\n\n context.restore();\n\n // Now set the clipping region and pretty much just redraw this row and all it's contents\n context.beginPath();\n context.rect(-gridX, y, width, rowHeight);\n context.clip();\n\n context.font = font;\n\n this.drawGridBackground(context, state);\n\n this.drawCellContents(context, state);\n\n // Now translate it back up and draw the header\n context.translate(-gridX, -gridY);\n\n context.font = headerFont;\n\n this.drawRowHeaders(context, state);\n\n context.restore();\n }\n\n drawScrollBars(\n context: CanvasRenderingContext2D,\n state: GridRenderState\n ): void {\n const {\n isDraggingHorizontalScrollBar,\n isDraggingVerticalScrollBar,\n isDragging,\n metrics,\n mouseX,\n mouseY,\n theme,\n } = state;\n if (theme.scrollBarSize <= 0) {\n return;\n }\n\n const {\n rowHeaderWidth,\n columnHeaderHeight,\n width,\n height,\n handleHeight,\n handleWidth,\n scrollX,\n scrollY,\n hasHorizontalBar,\n hasVerticalBar,\n barWidth,\n barHeight,\n } = metrics;\n const {\n scrollBarBackgroundColor,\n scrollBarHoverBackgroundColor,\n scrollBarCasingColor,\n scrollBarCornerColor,\n scrollBarColor,\n scrollBarHoverColor,\n scrollBarActiveColor,\n scrollBarSize,\n scrollBarHoverSize,\n scrollBarCasingWidth,\n scrollBarSelectionTick,\n scrollBarSelectionTickColor,\n scrollBarActiveSelectionTickColor,\n autoSelectRow,\n autoSelectColumn,\n } = theme;\n\n const isInbounds =\n mouseX != null && mouseY != null && mouseX <= width && mouseY <= height;\n\n const isVerticalBarHover =\n isDraggingVerticalScrollBar ||\n (hasVerticalBar &&\n !isDraggingHorizontalScrollBar &&\n !isDragging &&\n mouseX != null &&\n mouseY != null &&\n mouseX >= width - scrollBarHoverSize &&\n mouseY <= barHeight + columnHeaderHeight &&\n isInbounds);\n\n const isHorizontalBarHover =\n isDraggingHorizontalScrollBar ||\n (hasHorizontalBar &&\n !isDraggingVerticalScrollBar &&\n !isDragging &&\n !isVerticalBarHover && // vert bar gets priorty in overlapped corner hover area\n mouseX != null &&\n mouseY != null &&\n mouseY >= height - scrollBarHoverSize &&\n mouseX <= barWidth - rowHeaderWidth &&\n isInbounds);\n\n const hScrollBarSize = isHorizontalBarHover\n ? scrollBarHoverSize\n : scrollBarSize;\n const vScrollBarSize = isVerticalBarHover\n ? scrollBarHoverSize\n : scrollBarSize;\n\n context.translate(rowHeaderWidth, columnHeaderHeight);\n\n if (hasHorizontalBar && hasVerticalBar) {\n // That little corner in the bottom right\n context.fillStyle = scrollBarCasingColor;\n context.fillRect(\n width - rowHeaderWidth - scrollBarSize,\n height - columnHeaderHeight - scrollBarSize,\n scrollBarSize,\n scrollBarSize\n );\n context.fillStyle = scrollBarCornerColor;\n context.fillRect(\n width - rowHeaderWidth - scrollBarSize + scrollBarCasingWidth,\n height - columnHeaderHeight - scrollBarSize + scrollBarCasingWidth,\n scrollBarSize - scrollBarCasingWidth,\n scrollBarSize - scrollBarCasingWidth\n );\n }\n\n if (hasHorizontalBar) {\n const x = scrollX;\n const y = height - columnHeaderHeight - hScrollBarSize;\n\n // scrollbar casing\n context.fillStyle = scrollBarCasingColor;\n context.fillRect(0, y, barWidth, hScrollBarSize - scrollBarCasingWidth);\n\n // scrollbar track\n context.fillStyle = isHorizontalBarHover\n ? scrollBarHoverBackgroundColor\n : scrollBarBackgroundColor;\n context.fillRect(\n 0,\n y + scrollBarCasingWidth,\n barWidth,\n hScrollBarSize - scrollBarCasingWidth\n );\n\n // scrollbar thumb\n if (isDraggingHorizontalScrollBar) {\n context.fillStyle = scrollBarActiveColor;\n } else if (isHorizontalBarHover) {\n context.fillStyle = scrollBarHoverColor;\n } else {\n context.fillStyle = scrollBarColor;\n }\n\n context.fillRect(\n x,\n y + scrollBarCasingWidth,\n handleWidth,\n hScrollBarSize - scrollBarCasingWidth\n );\n\n if (\n !autoSelectRow &&\n scrollBarSelectionTick &&\n scrollBarSelectionTickColor != null &&\n scrollBarActiveSelectionTickColor != null\n ) {\n context.fillStyle = scrollBarSelectionTickColor;\n // Scrollbar Selection Tick\n const { selectedRanges, cursorColumn } = state;\n const { lastLeft, columnCount } = metrics;\n\n const filteredRanges = [...selectedRanges].filter(\n value => value.startColumn != null && value.endColumn != null\n ) as NoneNullColumnRange[];\n\n const sortedRanges = filteredRanges\n .map(\n (value): BoundedAxisRange => [value.startColumn, value.endColumn]\n )\n .sort(GridUtils.compareRanges);\n\n const mergedRanges = GridUtils.mergeSortedRanges(sortedRanges);\n\n const getTickX = (index: number): number => {\n if (index <= lastLeft) {\n return (index / lastLeft) * (barWidth - handleWidth);\n }\n return (\n barWidth -\n handleWidth +\n ((index - lastLeft) / (columnCount - lastLeft)) * handleWidth\n );\n };\n for (let i = 0; i < mergedRanges.length; i += 1) {\n const range = mergedRanges[i];\n const startColumn = range[0];\n const endColumn = range[1];\n\n if (\n startColumn != null &&\n endColumn != null &&\n (startColumn !== cursorColumn || endColumn !== cursorColumn)\n ) {\n const tickX = getTickX(startColumn);\n const tickWidth = Math.max(\n 1,\n Math.round(getTickX(endColumn + 1) - tickX)\n );\n const trackHeight = hScrollBarSize - scrollBarCasingWidth;\n context.fillRect(\n tickX,\n y + scrollBarCasingWidth + Math.round(trackHeight / 3),\n tickWidth,\n Math.round(trackHeight / 3)\n );\n }\n }\n\n // Current Active Tick\n if (cursorColumn != null) {\n const tickX = getTickX(cursorColumn);\n const tickWidth = 2;\n const trackHeight = hScrollBarSize - scrollBarCasingWidth;\n context.fillStyle = scrollBarActiveSelectionTickColor;\n context.fillRect(\n tickX,\n y + scrollBarCasingWidth,\n tickWidth,\n trackHeight\n );\n }\n }\n }\n\n if (hasVerticalBar) {\n const x = width - rowHeaderWidth - vScrollBarSize;\n const y = scrollY;\n\n // scrollbar casing\n context.fillStyle = scrollBarCasingColor;\n context.fillRect(x, 0, vScrollBarSize - scrollBarCasingWidth, barHeight);\n\n // scrollbar track\n context.fillStyle = isVerticalBarHover\n ? scrollBarHoverBackgroundColor\n : scrollBarBackgroundColor;\n context.fillRect(\n x + scrollBarCasingWidth,\n 0,\n vScrollBarSize - scrollBarCasingWidth,\n barHeight\n );\n\n // scrollbar thumb\n if (isDraggingVerticalScrollBar) {\n context.fillStyle = scrollBarActiveColor;\n } else if (isVerticalBarHover) {\n context.fillStyle = scrollBarHoverColor;\n } else {\n context.fillStyle = scrollBarColor;\n }\n\n context.fillRect(\n x + scrollBarCasingWidth,\n y,\n vScrollBarSize - scrollBarCasingWidth,\n handleHeight\n );\n\n if (\n !autoSelectColumn &&\n scrollBarSelectionTick &&\n scrollBarSelectionTickColor != null &&\n scrollBarActiveSelectionTickColor != null\n ) {\n // Scrollbar Selection Tick\n const { selectedRanges, cursorRow } = state;\n const { lastTop, rowCount } = metrics;\n\n const getTickY = (index: number): number => {\n if (index <= lastTop) {\n return (index / lastTop) * (barHeight - handleHeight);\n }\n return (\n barHeight -\n handleHeight +\n ((index - lastTop) / (rowCount - lastTop)) * handleHeight\n );\n };\n\n context.fillStyle = scrollBarSelectionTickColor;\n\n const filteredRanges = [...selectedRanges].filter(\n value => value.startRow != null && value.endRow != null\n ) as NoneNullRowRange[];\n\n const sortedRanges = filteredRanges\n .map((value): BoundedAxisRange => [value.startRow, value.endRow])\n .sort(GridUtils.compareRanges);\n\n const mergedRanges = GridUtils.mergeSortedRanges(sortedRanges);\n\n for (let i = 0; i < mergedRanges.length; i += 1) {\n const range = mergedRanges[i];\n const startRow = range[0];\n const endRow = range[1];\n if (\n startRow != null &&\n endRow != null &&\n (startRow !== cursorRow || endRow !== cursorRow)\n ) {\n const tickY = getTickY(startRow);\n const trackWidth = vScrollBarSize - scrollBarCasingWidth;\n const tickHeight = Math.max(\n 1,\n Math.round(getTickY(endRow + 1) - tickY)\n );\n context.fillRect(\n x + scrollBarCasingWidth + Math.round(trackWidth / 3),\n tickY,\n Math.round(trackWidth / 3),\n tickHeight\n );\n }\n }\n\n // Current Active Tick\n if (cursorRow != null) {\n const tickY = Math.round(getTickY(cursorRow));\n\n const trackWidth = vScrollBarSize - scrollBarCasingWidth;\n const tickHeight = 2;\n\n context.fillStyle = scrollBarActiveSelectionTickColor;\n context.fillRect(\n x + scrollBarCasingWidth,\n tickY,\n trackWidth,\n tickHeight\n );\n }\n }\n }\n\n context.translate(-rowHeaderWidth, -columnHeaderHeight);\n }\n}\n\nexport default GridRenderer;\n"],"mappings":"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"}
|
package/dist/GridTheme.d.ts
CHANGED
|
@@ -15,6 +15,8 @@ export declare type GridTheme = {
|
|
|
15
15
|
autoSizeRows: boolean;
|
|
16
16
|
backgroundColor: GridColor;
|
|
17
17
|
textColor: GridColor;
|
|
18
|
+
black: GridColor;
|
|
19
|
+
white: GridColor;
|
|
18
20
|
cellHorizontalPadding: number;
|
|
19
21
|
headerHorizontalPadding: number;
|
|
20
22
|
font: GridFont;
|
|
@@ -78,9 +80,9 @@ export declare type GridTheme = {
|
|
|
78
80
|
floatingDividerOuterColor: GridColor;
|
|
79
81
|
floatingDividerInnerColor: GridColor;
|
|
80
82
|
};
|
|
81
|
-
declare const _default: GridTheme;
|
|
82
83
|
/**
|
|
83
84
|
* Default theme for a Grid.
|
|
84
85
|
*/
|
|
85
|
-
|
|
86
|
+
declare const defaultTheme: GridTheme;
|
|
87
|
+
export default defaultTheme;
|
|
86
88
|
//# sourceMappingURL=GridTheme.d.ts.map
|
package/dist/GridTheme.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GridTheme.d.ts","sourceRoot":"","sources":["../src/GridTheme.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"GridTheme.d.ts","sourceRoot":"","sources":["../src/GridTheme.ts"],"names":[],"mappings":"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"}
|
package/dist/GridTheme.js
CHANGED
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
/**
|
|
10
10
|
* Default theme for a Grid.
|
|
11
11
|
*/
|
|
12
|
-
|
|
12
|
+
var defaultTheme = Object.freeze({
|
|
13
13
|
allowColumnResize: true,
|
|
14
14
|
allowRowResize: true,
|
|
15
15
|
autoSelectRow: false,
|
|
@@ -20,6 +20,8 @@ export default Object.freeze({
|
|
|
20
20
|
// Automatically size the columns to fit content
|
|
21
21
|
autoSizeRows: true,
|
|
22
22
|
backgroundColor: '#000000',
|
|
23
|
+
black: '#000000',
|
|
24
|
+
white: '#ffffff',
|
|
23
25
|
cellHorizontalPadding: 5,
|
|
24
26
|
headerHorizontalPadding: 5,
|
|
25
27
|
font: '12px Arial, sans serif',
|
|
@@ -88,4 +90,5 @@ export default Object.freeze({
|
|
|
88
90
|
floatingDividerOuterColor: '#000000',
|
|
89
91
|
floatingDividerInnerColor: '#cccccc'
|
|
90
92
|
});
|
|
93
|
+
export default defaultTheme;
|
|
91
94
|
//# sourceMappingURL=GridTheme.js.map
|
package/dist/GridTheme.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GridTheme.js","names":["Object","freeze","allowColumnResize","allowRowResize","autoSelectRow","autoSelectColumn","autoSizeColumns","autoSizeRows","backgroundColor","cellHorizontalPadding","headerHorizontalPadding","font","gridColumnColor","gridRowColor","headerBackgroundColor","headerSeparatorColor","headerSeparatorHoverColor","headerSeparatorHandleSize","headerHiddenSeparatorSize","headerHiddenSeparatorHoverColor","headerColor","headerFont","columnHoverBackgroundColor","selectedColumnHoverBackgroundColor","rowBackgroundColors","rowHoverBackgroundColor","selectedRowHoverBackgroundColor","minScrollHandleSize","scrollBarBackgroundColor","scrollBarHoverBackgroundColor","scrollBarCasingColor","scrollBarCornerColor","scrollBarColor","scrollBarHoverColor","scrollBarActiveColor","scrollBarSize","scrollBarHoverSize","scrollBarCasingWidth","scrollSnapToColumn","scrollSnapToRow","selectionColor","selectionOutlineColor","selectionOutlineCasingColor","scrollBarSelectionTick","scrollBarSelectionTickColor","scrollBarActiveSelectionTickColor","shadowBlur","shadowColor","textColor","maxDepth","treeDepthIndent","treeHorizontalPadding","treeLineColor","treeMarkerColor","treeMarkerHoverColor","rowHeight","columnWidth","minRowHeight","minColumnWidth","columnHeaderHeight","rowHeaderWidth","rowFooterWidth","headerResizeSnapThreshold","headerResizeHiddenSnapThreshold","allowColumnReorder","allowRowReorder","reorderOffset","floatingGridColumnColor","floatingGridRowColor","floatingRowBackgroundColors","floatingDividerOuterColor","floatingDividerInnerColor"],"sources":["../src/GridTheme.ts"],"sourcesContent":["/** A color parsed as CSS color value, eg. '#FF0000' */\nexport type GridColor = string;\n\n/** A nullable color, eg. pass `null` to skip drawing this item */\nexport type NullableGridColor = GridColor | null;\n\n/** One or more colors parsed as CSS color value separated by space, eg. '#FF0000 #00FF00' */\nexport type GridColorWay = string;\n\n/** A font parsed as CSS font value */\nexport type GridFont = string;\n\nexport type GridTheme = {\n // Allow column/row resizing\n allowColumnResize: boolean;\n allowRowResize: boolean;\n\n // Select the full row/column upon selection\n autoSelectRow: boolean;\n autoSelectColumn: boolean;\n\n // Automatically size rows/columns to fit contents\n autoSizeColumns: boolean;\n autoSizeRows: boolean;\n\n // The background color for the whole grid\n backgroundColor: GridColor;\n\n // Color to draw text\n textColor: GridColor;\n\n // Amount of padding within a cell and header\n cellHorizontalPadding: number;\n headerHorizontalPadding: number;\n\n // The font to use in the grid\n font: GridFont;\n\n // Colors to draw grid lines between columns and rows\n gridColumnColor: NullableGridColor;\n gridRowColor: NullableGridColor;\n\n // Colors for drawing the column and row headers\n headerBackgroundColor: GridColor;\n headerSeparatorColor: GridColor;\n headerSeparatorHoverColor: GridColor;\n headerSeparatorHandleSize: number;\n headerHiddenSeparatorSize: number;\n headerHiddenSeparatorHoverColor: GridColor;\n headerColor: GridColor;\n headerFont: GridFont;\n\n // Background color to highlight entire column/row if set\n columnHoverBackgroundColor: NullableGridColor;\n selectedColumnHoverBackgroundColor: NullableGridColor;\n rowHoverBackgroundColor: NullableGridColor;\n selectedRowHoverBackgroundColor: NullableGridColor;\n\n // Background colors to draw for each row, cycling through each value (eg. alternating stripes)\n rowBackgroundColors: GridColorWay;\n\n // Scroll bar look and sizing\n minScrollHandleSize: number;\n scrollBarBackgroundColor: GridColor;\n scrollBarHoverBackgroundColor: GridColor;\n scrollBarCasingColor: GridColor;\n scrollBarCornerColor: GridColor;\n scrollBarColor: GridColor;\n scrollBarHoverColor: GridColor;\n scrollBarActiveColor: GridColor;\n scrollBarSize: number;\n scrollBarHoverSize: number;\n scrollBarCasingWidth: number;\n scrollSnapToColumn: boolean;\n scrollSnapToRow: boolean;\n\n scrollBarSelectionTick: boolean;\n scrollBarSelectionTickColor: NullableGridColor;\n scrollBarActiveSelectionTickColor: NullableGridColor;\n\n // Look of the current selection\n selectionColor: GridColor;\n selectionOutlineColor: GridColor;\n selectionOutlineCasingColor: GridColor;\n\n // Shadows to draw when representing a hierarchy, eg. when one row is a higher \"depth\" than the row above it\n shadowBlur: number;\n shadowColor: GridColor;\n maxDepth: number; // max depth of the shadowing\n\n // Other tree table metrics\n treeDepthIndent: number;\n treeHorizontalPadding: number;\n treeLineColor: GridColor;\n treeMarkerColor: GridColor;\n treeMarkerHoverColor: GridColor;\n\n // Default row height/column width\n rowHeight: number;\n columnWidth: number;\n minRowHeight: number;\n minColumnWidth: number;\n\n // Default row/column header/footers width/height\n columnHeaderHeight: number;\n rowHeaderWidth: number;\n rowFooterWidth: number;\n\n // When resizing the header, will snap to the auto size of the header within this threshold\n headerResizeSnapThreshold: number;\n headerResizeHiddenSnapThreshold: number;\n\n // Allow moving/reordering columns/rows\n allowColumnReorder: boolean;\n allowRowReorder: boolean;\n\n // The number of pixels to offset a column/row while it is being dragged to move\n reorderOffset: number;\n\n // Colors for the grid in floating sections\n floatingGridColumnColor: NullableGridColor;\n floatingGridRowColor: NullableGridColor;\n\n // Background row colors for grid in the floating sections\n floatingRowBackgroundColors: GridColorWay;\n\n // Divider colors between the floating parts and the grid\n floatingDividerOuterColor: GridColor;\n floatingDividerInnerColor: GridColor;\n};\n\n/**\n * Default theme for a Grid.\n */\nexport default Object.freeze({\n allowColumnResize: true,\n allowRowResize: true,\n autoSelectRow: false, // Select the full row upon selection\n autoSelectColumn: false, // Select the full column upon selection\n autoSizeColumns: true, // Automatically size the columns to fit content\n autoSizeRows: true,\n backgroundColor: '#000000',\n cellHorizontalPadding: 5,\n headerHorizontalPadding: 5,\n font: '12px Arial, sans serif',\n gridColumnColor: '#8f8f8f66',\n gridRowColor: '#8f8f8f66',\n headerBackgroundColor: '#222222',\n headerSeparatorColor: '#000000',\n headerSeparatorHoverColor: '#888888',\n headerSeparatorHandleSize: 5,\n headerHiddenSeparatorSize: 5,\n headerHiddenSeparatorHoverColor: '#8888FF',\n headerColor: '#d5d5d5',\n headerFont: '10px Arial, sans serif',\n columnHoverBackgroundColor: '#444444',\n selectedColumnHoverBackgroundColor: '#494949',\n rowBackgroundColors: '#333333 #222222',\n rowHoverBackgroundColor: '#444444',\n selectedRowHoverBackgroundColor: '#494949',\n minScrollHandleSize: 50,\n scrollBarBackgroundColor: '#111111',\n scrollBarHoverBackgroundColor: '#333333',\n scrollBarCasingColor: '#000000',\n scrollBarCornerColor: '#000000',\n scrollBarColor: '#555555',\n scrollBarHoverColor: '#888888',\n scrollBarActiveColor: '#AAAAAA',\n scrollBarSize: 12,\n scrollBarHoverSize: 16,\n scrollBarCasingWidth: 1,\n scrollSnapToColumn: false,\n scrollSnapToRow: false,\n selectionColor: '#4286f433',\n selectionOutlineColor: '#4286f4',\n selectionOutlineCasingColor: '#222222',\n scrollBarSelectionTick: true,\n scrollBarSelectionTickColor: '#4286f433',\n scrollBarActiveSelectionTickColor: '#4286f480',\n shadowBlur: 8,\n shadowColor: '#000000',\n textColor: '#ffffff',\n maxDepth: 6,\n treeDepthIndent: 10,\n treeHorizontalPadding: 5,\n treeLineColor: '#888888',\n treeMarkerColor: '#cccccc',\n treeMarkerHoverColor: '#ffffff',\n\n rowHeight: 20,\n columnWidth: 100,\n minRowHeight: 20,\n minColumnWidth: 55,\n columnHeaderHeight: 20,\n rowHeaderWidth: 30,\n rowFooterWidth: 0,\n\n // When resizing the header, will snap to the auto size of the header within this threshold\n headerResizeSnapThreshold: 10,\n headerResizeHiddenSnapThreshold: 8,\n\n allowColumnReorder: true,\n allowRowReorder: true,\n reorderOffset: 2,\n\n // Colors for the grid in floating sections\n floatingGridColumnColor: '#8f8f8f66',\n floatingGridRowColor: '#8f8f8f66',\n\n // Background row colors for grid in the floating sections\n floatingRowBackgroundColors: '#393939 #292929',\n\n // Divider colors between the floating parts and the grid\n floatingDividerOuterColor: '#000000',\n floatingDividerInnerColor: '#cccccc',\n}) as GridTheme;\n"],"mappings":"AAAA;;AAGA;;AAGA;;AAGA;;AA0HA;AACA;AACA;AACA,eAAeA,MAAM,CAACC,MAAP,CAAc;EAC3BC,iBAAiB,EAAE,IADQ;EAE3BC,cAAc,EAAE,IAFW;EAG3BC,aAAa,EAAE,KAHY;EAGL;EACtBC,gBAAgB,EAAE,KAJS;EAIF;EACzBC,eAAe,EAAE,IALU;EAKJ;EACvBC,YAAY,EAAE,IANa;EAO3BC,eAAe,EAAE,SAPU;EAQ3BC,qBAAqB,EAAE,CARI;EAS3BC,uBAAuB,EAAE,CATE;EAU3BC,IAAI,EAAE,wBAVqB;EAW3BC,eAAe,EAAE,WAXU;EAY3BC,YAAY,EAAE,WAZa;EAa3BC,qBAAqB,EAAE,SAbI;EAc3BC,oBAAoB,EAAE,SAdK;EAe3BC,yBAAyB,EAAE,SAfA;EAgB3BC,yBAAyB,EAAE,CAhBA;EAiB3BC,yBAAyB,EAAE,CAjBA;EAkB3BC,+BAA+B,EAAE,SAlBN;EAmB3BC,WAAW,EAAE,SAnBc;EAoB3BC,UAAU,EAAE,wBApBe;EAqB3BC,0BAA0B,EAAE,SArBD;EAsB3BC,kCAAkC,EAAE,SAtBT;EAuB3BC,mBAAmB,EAAE,iBAvBM;EAwB3BC,uBAAuB,EAAE,SAxBE;EAyB3BC,+BAA+B,EAAE,SAzBN;EA0B3BC,mBAAmB,EAAE,EA1BM;EA2B3BC,wBAAwB,EAAE,SA3BC;EA4B3BC,6BAA6B,EAAE,SA5BJ;EA6B3BC,oBAAoB,EAAE,SA7BK;EA8B3BC,oBAAoB,EAAE,SA9BK;EA+B3BC,cAAc,EAAE,SA/BW;EAgC3BC,mBAAmB,EAAE,SAhCM;EAiC3BC,oBAAoB,EAAE,SAjCK;EAkC3BC,aAAa,EAAE,EAlCY;EAmC3BC,kBAAkB,EAAE,EAnCO;EAoC3BC,oBAAoB,EAAE,CApCK;EAqC3BC,kBAAkB,EAAE,KArCO;EAsC3BC,eAAe,EAAE,KAtCU;EAuC3BC,cAAc,EAAE,WAvCW;EAwC3BC,qBAAqB,EAAE,SAxCI;EAyC3BC,2BAA2B,EAAE,SAzCF;EA0C3BC,sBAAsB,EAAE,IA1CG;EA2C3BC,2BAA2B,EAAE,WA3CF;EA4C3BC,iCAAiC,EAAE,WA5CR;EA6C3BC,UAAU,EAAE,CA7Ce;EA8C3BC,WAAW,EAAE,SA9Cc;EA+C3BC,SAAS,EAAE,SA/CgB;EAgD3BC,QAAQ,EAAE,CAhDiB;EAiD3BC,eAAe,EAAE,EAjDU;EAkD3BC,qBAAqB,EAAE,CAlDI;EAmD3BC,aAAa,EAAE,SAnDY;EAoD3BC,eAAe,EAAE,SApDU;EAqD3BC,oBAAoB,EAAE,SArDK;EAuD3BC,SAAS,EAAE,EAvDgB;EAwD3BC,WAAW,EAAE,GAxDc;EAyD3BC,YAAY,EAAE,EAzDa;EA0D3BC,cAAc,EAAE,EA1DW;EA2D3BC,kBAAkB,EAAE,EA3DO;EA4D3BC,cAAc,EAAE,EA5DW;EA6D3BC,cAAc,EAAE,CA7DW;EA+D3B;EACAC,yBAAyB,EAAE,EAhEA;EAiE3BC,+BAA+B,EAAE,CAjEN;EAmE3BC,kBAAkB,EAAE,IAnEO;EAoE3BC,eAAe,EAAE,IApEU;EAqE3BC,aAAa,EAAE,CArEY;EAuE3B;EACAC,uBAAuB,EAAE,WAxEE;EAyE3BC,oBAAoB,EAAE,WAzEK;EA2E3B;EACAC,2BAA2B,EAAE,iBA5EF;EA8E3B;EACAC,yBAAyB,EAAE,SA/EA;EAgF3BC,yBAAyB,EAAE;AAhFA,CAAd,CAAf"}
|
|
1
|
+
{"version":3,"file":"GridTheme.js","names":["defaultTheme","Object","freeze","allowColumnResize","allowRowResize","autoSelectRow","autoSelectColumn","autoSizeColumns","autoSizeRows","backgroundColor","black","white","cellHorizontalPadding","headerHorizontalPadding","font","gridColumnColor","gridRowColor","headerBackgroundColor","headerSeparatorColor","headerSeparatorHoverColor","headerSeparatorHandleSize","headerHiddenSeparatorSize","headerHiddenSeparatorHoverColor","headerColor","headerFont","columnHoverBackgroundColor","selectedColumnHoverBackgroundColor","rowBackgroundColors","rowHoverBackgroundColor","selectedRowHoverBackgroundColor","minScrollHandleSize","scrollBarBackgroundColor","scrollBarHoverBackgroundColor","scrollBarCasingColor","scrollBarCornerColor","scrollBarColor","scrollBarHoverColor","scrollBarActiveColor","scrollBarSize","scrollBarHoverSize","scrollBarCasingWidth","scrollSnapToColumn","scrollSnapToRow","selectionColor","selectionOutlineColor","selectionOutlineCasingColor","scrollBarSelectionTick","scrollBarSelectionTickColor","scrollBarActiveSelectionTickColor","shadowBlur","shadowColor","textColor","maxDepth","treeDepthIndent","treeHorizontalPadding","treeLineColor","treeMarkerColor","treeMarkerHoverColor","rowHeight","columnWidth","minRowHeight","minColumnWidth","columnHeaderHeight","rowHeaderWidth","rowFooterWidth","headerResizeSnapThreshold","headerResizeHiddenSnapThreshold","allowColumnReorder","allowRowReorder","reorderOffset","floatingGridColumnColor","floatingGridRowColor","floatingRowBackgroundColors","floatingDividerOuterColor","floatingDividerInnerColor"],"sources":["../src/GridTheme.ts"],"sourcesContent":["/** A color parsed as CSS color value, eg. '#FF0000' */\nexport type GridColor = string;\n\n/** A nullable color, eg. pass `null` to skip drawing this item */\nexport type NullableGridColor = GridColor | null;\n\n/** One or more colors parsed as CSS color value separated by space, eg. '#FF0000 #00FF00' */\nexport type GridColorWay = string;\n\n/** A font parsed as CSS font value */\nexport type GridFont = string;\n\nexport type GridTheme = {\n // Allow column/row resizing\n allowColumnResize: boolean;\n allowRowResize: boolean;\n\n // Select the full row/column upon selection\n autoSelectRow: boolean;\n autoSelectColumn: boolean;\n\n // Automatically size rows/columns to fit contents\n autoSizeColumns: boolean;\n autoSizeRows: boolean;\n\n // The background color for the whole grid\n backgroundColor: GridColor;\n\n // Color to draw text\n textColor: GridColor;\n\n // Black and white to use if needed\n black: GridColor;\n white: GridColor;\n\n // Amount of padding within a cell and header\n cellHorizontalPadding: number;\n headerHorizontalPadding: number;\n\n // The font to use in the grid\n font: GridFont;\n\n // Colors to draw grid lines between columns and rows\n gridColumnColor: NullableGridColor;\n gridRowColor: NullableGridColor;\n\n // Colors for drawing the column and row headers\n headerBackgroundColor: GridColor;\n headerSeparatorColor: GridColor;\n headerSeparatorHoverColor: GridColor;\n headerSeparatorHandleSize: number;\n headerHiddenSeparatorSize: number;\n headerHiddenSeparatorHoverColor: GridColor;\n headerColor: GridColor;\n headerFont: GridFont;\n\n // Background color to highlight entire column/row if set\n columnHoverBackgroundColor: NullableGridColor;\n selectedColumnHoverBackgroundColor: NullableGridColor;\n rowHoverBackgroundColor: NullableGridColor;\n selectedRowHoverBackgroundColor: NullableGridColor;\n\n // Background colors to draw for each row, cycling through each value (eg. alternating stripes)\n rowBackgroundColors: GridColorWay;\n\n // Scroll bar look and sizing\n minScrollHandleSize: number;\n scrollBarBackgroundColor: GridColor;\n scrollBarHoverBackgroundColor: GridColor;\n scrollBarCasingColor: GridColor;\n scrollBarCornerColor: GridColor;\n scrollBarColor: GridColor;\n scrollBarHoverColor: GridColor;\n scrollBarActiveColor: GridColor;\n scrollBarSize: number;\n scrollBarHoverSize: number;\n scrollBarCasingWidth: number;\n scrollSnapToColumn: boolean;\n scrollSnapToRow: boolean;\n\n scrollBarSelectionTick: boolean;\n scrollBarSelectionTickColor: NullableGridColor;\n scrollBarActiveSelectionTickColor: NullableGridColor;\n\n // Look of the current selection\n selectionColor: GridColor;\n selectionOutlineColor: GridColor;\n selectionOutlineCasingColor: GridColor;\n\n // Shadows to draw when representing a hierarchy, eg. when one row is a higher \"depth\" than the row above it\n shadowBlur: number;\n shadowColor: GridColor;\n maxDepth: number; // max depth of the shadowing\n\n // Other tree table metrics\n treeDepthIndent: number;\n treeHorizontalPadding: number;\n treeLineColor: GridColor;\n treeMarkerColor: GridColor;\n treeMarkerHoverColor: GridColor;\n\n // Default row height/column width\n rowHeight: number;\n columnWidth: number;\n minRowHeight: number;\n minColumnWidth: number;\n\n // Default row/column header/footers width/height\n columnHeaderHeight: number;\n rowHeaderWidth: number;\n rowFooterWidth: number;\n\n // When resizing the header, will snap to the auto size of the header within this threshold\n headerResizeSnapThreshold: number;\n headerResizeHiddenSnapThreshold: number;\n\n // Allow moving/reordering columns/rows\n allowColumnReorder: boolean;\n allowRowReorder: boolean;\n\n // The number of pixels to offset a column/row while it is being dragged to move\n reorderOffset: number;\n\n // Colors for the grid in floating sections\n floatingGridColumnColor: NullableGridColor;\n floatingGridRowColor: NullableGridColor;\n\n // Background row colors for grid in the floating sections\n floatingRowBackgroundColors: GridColorWay;\n\n // Divider colors between the floating parts and the grid\n floatingDividerOuterColor: GridColor;\n floatingDividerInnerColor: GridColor;\n};\n\n/**\n * Default theme for a Grid.\n */\nconst defaultTheme: GridTheme = Object.freeze({\n allowColumnResize: true,\n allowRowResize: true,\n autoSelectRow: false, // Select the full row upon selection\n autoSelectColumn: false, // Select the full column upon selection\n autoSizeColumns: true, // Automatically size the columns to fit content\n autoSizeRows: true,\n backgroundColor: '#000000',\n black: '#000000',\n white: '#ffffff',\n cellHorizontalPadding: 5,\n headerHorizontalPadding: 5,\n font: '12px Arial, sans serif',\n gridColumnColor: '#8f8f8f66',\n gridRowColor: '#8f8f8f66',\n headerBackgroundColor: '#222222',\n headerSeparatorColor: '#000000',\n headerSeparatorHoverColor: '#888888',\n headerSeparatorHandleSize: 5,\n headerHiddenSeparatorSize: 5,\n headerHiddenSeparatorHoverColor: '#8888FF',\n headerColor: '#d5d5d5',\n headerFont: '10px Arial, sans serif',\n columnHoverBackgroundColor: '#444444',\n selectedColumnHoverBackgroundColor: '#494949',\n rowBackgroundColors: '#333333 #222222',\n rowHoverBackgroundColor: '#444444',\n selectedRowHoverBackgroundColor: '#494949',\n minScrollHandleSize: 50,\n scrollBarBackgroundColor: '#111111',\n scrollBarHoverBackgroundColor: '#333333',\n scrollBarCasingColor: '#000000',\n scrollBarCornerColor: '#000000',\n scrollBarColor: '#555555',\n scrollBarHoverColor: '#888888',\n scrollBarActiveColor: '#AAAAAA',\n scrollBarSize: 12,\n scrollBarHoverSize: 16,\n scrollBarCasingWidth: 1,\n scrollSnapToColumn: false,\n scrollSnapToRow: false,\n selectionColor: '#4286f433',\n selectionOutlineColor: '#4286f4',\n selectionOutlineCasingColor: '#222222',\n scrollBarSelectionTick: true,\n scrollBarSelectionTickColor: '#4286f433',\n scrollBarActiveSelectionTickColor: '#4286f480',\n shadowBlur: 8,\n shadowColor: '#000000',\n textColor: '#ffffff',\n maxDepth: 6,\n treeDepthIndent: 10,\n treeHorizontalPadding: 5,\n treeLineColor: '#888888',\n treeMarkerColor: '#cccccc',\n treeMarkerHoverColor: '#ffffff',\n\n rowHeight: 20,\n columnWidth: 100,\n minRowHeight: 20,\n minColumnWidth: 55,\n columnHeaderHeight: 20,\n rowHeaderWidth: 30,\n rowFooterWidth: 0,\n\n // When resizing the header, will snap to the auto size of the header within this threshold\n headerResizeSnapThreshold: 10,\n headerResizeHiddenSnapThreshold: 8,\n\n allowColumnReorder: true,\n allowRowReorder: true,\n reorderOffset: 2,\n\n // Colors for the grid in floating sections\n floatingGridColumnColor: '#8f8f8f66',\n floatingGridRowColor: '#8f8f8f66',\n\n // Background row colors for grid in the floating sections\n floatingRowBackgroundColors: '#393939 #292929',\n\n // Divider colors between the floating parts and the grid\n floatingDividerOuterColor: '#000000',\n floatingDividerInnerColor: '#cccccc',\n});\n\nexport default defaultTheme;\n"],"mappings":"AAAA;;AAGA;;AAGA;;AAGA;;AA8HA;AACA;AACA;AACA,IAAMA,YAAuB,GAAGC,MAAM,CAACC,MAAP,CAAc;EAC5CC,iBAAiB,EAAE,IADyB;EAE5CC,cAAc,EAAE,IAF4B;EAG5CC,aAAa,EAAE,KAH6B;EAGtB;EACtBC,gBAAgB,EAAE,KAJ0B;EAInB;EACzBC,eAAe,EAAE,IAL2B;EAKrB;EACvBC,YAAY,EAAE,IAN8B;EAO5CC,eAAe,EAAE,SAP2B;EAQ5CC,KAAK,EAAE,SARqC;EAS5CC,KAAK,EAAE,SATqC;EAU5CC,qBAAqB,EAAE,CAVqB;EAW5CC,uBAAuB,EAAE,CAXmB;EAY5CC,IAAI,EAAE,wBAZsC;EAa5CC,eAAe,EAAE,WAb2B;EAc5CC,YAAY,EAAE,WAd8B;EAe5CC,qBAAqB,EAAE,SAfqB;EAgB5CC,oBAAoB,EAAE,SAhBsB;EAiB5CC,yBAAyB,EAAE,SAjBiB;EAkB5CC,yBAAyB,EAAE,CAlBiB;EAmB5CC,yBAAyB,EAAE,CAnBiB;EAoB5CC,+BAA+B,EAAE,SApBW;EAqB5CC,WAAW,EAAE,SArB+B;EAsB5CC,UAAU,EAAE,wBAtBgC;EAuB5CC,0BAA0B,EAAE,SAvBgB;EAwB5CC,kCAAkC,EAAE,SAxBQ;EAyB5CC,mBAAmB,EAAE,iBAzBuB;EA0B5CC,uBAAuB,EAAE,SA1BmB;EA2B5CC,+BAA+B,EAAE,SA3BW;EA4B5CC,mBAAmB,EAAE,EA5BuB;EA6B5CC,wBAAwB,EAAE,SA7BkB;EA8B5CC,6BAA6B,EAAE,SA9Ba;EA+B5CC,oBAAoB,EAAE,SA/BsB;EAgC5CC,oBAAoB,EAAE,SAhCsB;EAiC5CC,cAAc,EAAE,SAjC4B;EAkC5CC,mBAAmB,EAAE,SAlCuB;EAmC5CC,oBAAoB,EAAE,SAnCsB;EAoC5CC,aAAa,EAAE,EApC6B;EAqC5CC,kBAAkB,EAAE,EArCwB;EAsC5CC,oBAAoB,EAAE,CAtCsB;EAuC5CC,kBAAkB,EAAE,KAvCwB;EAwC5CC,eAAe,EAAE,KAxC2B;EAyC5CC,cAAc,EAAE,WAzC4B;EA0C5CC,qBAAqB,EAAE,SA1CqB;EA2C5CC,2BAA2B,EAAE,SA3Ce;EA4C5CC,sBAAsB,EAAE,IA5CoB;EA6C5CC,2BAA2B,EAAE,WA7Ce;EA8C5CC,iCAAiC,EAAE,WA9CS;EA+C5CC,UAAU,EAAE,CA/CgC;EAgD5CC,WAAW,EAAE,SAhD+B;EAiD5CC,SAAS,EAAE,SAjDiC;EAkD5CC,QAAQ,EAAE,CAlDkC;EAmD5CC,eAAe,EAAE,EAnD2B;EAoD5CC,qBAAqB,EAAE,CApDqB;EAqD5CC,aAAa,EAAE,SArD6B;EAsD5CC,eAAe,EAAE,SAtD2B;EAuD5CC,oBAAoB,EAAE,SAvDsB;EAyD5CC,SAAS,EAAE,EAzDiC;EA0D5CC,WAAW,EAAE,GA1D+B;EA2D5CC,YAAY,EAAE,EA3D8B;EA4D5CC,cAAc,EAAE,EA5D4B;EA6D5CC,kBAAkB,EAAE,EA7DwB;EA8D5CC,cAAc,EAAE,EA9D4B;EA+D5CC,cAAc,EAAE,CA/D4B;EAiE5C;EACAC,yBAAyB,EAAE,EAlEiB;EAmE5CC,+BAA+B,EAAE,CAnEW;EAqE5CC,kBAAkB,EAAE,IArEwB;EAsE5CC,eAAe,EAAE,IAtE2B;EAuE5CC,aAAa,EAAE,CAvE6B;EAyE5C;EACAC,uBAAuB,EAAE,WA1EmB;EA2E5CC,oBAAoB,EAAE,WA3EsB;EA6E5C;EACAC,2BAA2B,EAAE,iBA9Ee;EAgF5C;EACAC,yBAAyB,EAAE,SAjFiB;EAkF5CC,yBAAyB,EAAE;AAlFiB,CAAd,CAAhC;AAqFA,eAAe1E,YAAf"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@deephaven/grid",
|
|
3
|
-
"version": "0.17.1-beta.
|
|
3
|
+
"version": "0.17.1-beta.1+afd6107",
|
|
4
4
|
"description": "Deephaven React grid component",
|
|
5
5
|
"author": "Deephaven Data Labs LLC",
|
|
6
6
|
"license": "Apache-2.0",
|
|
@@ -33,12 +33,13 @@
|
|
|
33
33
|
"react": "^17.0.0"
|
|
34
34
|
},
|
|
35
35
|
"devDependencies": {
|
|
36
|
-
"@deephaven/tsconfig": "^0.17.1-beta.
|
|
36
|
+
"@deephaven/tsconfig": "^0.17.1-beta.1+afd6107"
|
|
37
37
|
},
|
|
38
38
|
"files": [
|
|
39
39
|
"dist"
|
|
40
40
|
],
|
|
41
41
|
"dependencies": {
|
|
42
|
+
"@deephaven/utils": "^0.17.1-beta.1+afd6107",
|
|
42
43
|
"classnames": "^2.3.1",
|
|
43
44
|
"color-convert": "^2.0.1",
|
|
44
45
|
"event-target-shim": "^6.0.2",
|
|
@@ -50,5 +51,5 @@
|
|
|
50
51
|
"publishConfig": {
|
|
51
52
|
"access": "public"
|
|
52
53
|
},
|
|
53
|
-
"gitHead": "
|
|
54
|
+
"gitHead": "afd61074b0a0b60d1a38124090cdaab5f432f210"
|
|
54
55
|
}
|