@deephaven/grid 0.22.3-beta.11 → 0.22.3-beta.18
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/Grid.d.ts +74 -1
- package/dist/Grid.d.ts.map +1 -1
- package/dist/Grid.js.map +1 -1
- package/dist/GridRenderer.d.ts +4 -4
- package/dist/GridRenderer.d.ts.map +1 -1
- package/dist/GridRenderer.js.map +1 -1
- package/dist/MockTreeGridModel.d.ts +6 -6
- package/dist/MockTreeGridModel.d.ts.map +1 -1
- package/package.json +4 -4
package/dist/GridRenderer.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
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","undefined","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","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 !== undefined) {\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 == null) {\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 == null) {\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 == null\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 != null) {\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 != null) {\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 == null && rowColor == null) {\n return;\n }\n\n context.lineWidth = 1;\n context.beginPath();\n\n if (columnColor != null) {\n context.strokeStyle = columnColor;\n this.drawGridLinesForColumns(context, state, columns);\n }\n if (rowColor != null) {\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 != null) {\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 != null) {\n context.fillStyle = backgroundColor;\n context.fillRect(columnX, 0, columnWidth, columnHeaderHeight);\n }\n\n if (separatorColor != null) {\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","undefined","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","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 !== undefined) {\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 == null) {\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 == null) {\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 == null\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 != null) {\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 != null) {\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 == null && rowColor == null) {\n return;\n }\n\n context.lineWidth = 1;\n context.beginPath();\n\n if (columnColor != null) {\n context.strokeStyle = columnColor;\n this.drawGridLinesForColumns(context, state, columns);\n }\n if (rowColor != null) {\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 != null) {\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: string, alpha: number) =>\n 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 != null) {\n context.fillStyle = backgroundColor;\n context.fillRect(columnX, 0, columnWidth, columnHeaderHeight);\n }\n\n if (separatorColor != null) {\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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"}
|