@deephaven/grid 1.22.1-alpha-pivot-builder.0 → 1.22.2-alpha-pivot-builder.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/CellInputField.js +41 -22
- package/dist/CellInputField.js.map +1 -1
- package/dist/CellRenderer.js +19 -27
- package/dist/CellRenderer.js.map +1 -1
- package/dist/DataBarCellRenderer.js +61 -87
- package/dist/DataBarCellRenderer.js.map +1 -1
- package/dist/Grid.js +281 -455
- package/dist/Grid.js.map +1 -1
- package/dist/GridColorUtils.js +23 -21
- package/dist/GridColorUtils.js.map +1 -1
- package/dist/GridMetricCalculator.js +192 -303
- package/dist/GridMetricCalculator.js.map +1 -1
- package/dist/GridRange.js +18 -28
- package/dist/GridRange.js.map +1 -1
- package/dist/GridRenderer.d.ts.map +1 -1
- package/dist/GridRenderer.js +432 -604
- package/dist/GridRenderer.js.map +1 -1
- package/dist/GridUtils.d.ts +33 -16
- package/dist/GridUtils.d.ts.map +1 -1
- package/dist/GridUtils.js +183 -213
- package/dist/GridUtils.js.map +1 -1
- package/dist/MockGridModel.js +17 -10
- package/dist/MockGridModel.js.map +1 -1
- package/dist/MockTreeGridModel.js +36 -31
- package/dist/MockTreeGridModel.js.map +1 -1
- package/dist/TextCellRenderer.js +36 -57
- package/dist/TextCellRenderer.js.map +1 -1
- package/dist/key-handlers/EditKeyHandler.js +4 -7
- package/dist/key-handlers/EditKeyHandler.js.map +1 -1
- package/dist/key-handlers/PasteKeyHandler.js +1 -3
- package/dist/key-handlers/PasteKeyHandler.js.map +1 -1
- package/dist/key-handlers/SelectionKeyHandler.js +40 -71
- package/dist/key-handlers/SelectionKeyHandler.js.map +1 -1
- package/dist/key-handlers/TreeKeyHandler.js +4 -10
- package/dist/key-handlers/TreeKeyHandler.js.map +1 -1
- package/dist/mouse-handlers/EditMouseHandler.js +3 -7
- package/dist/mouse-handlers/EditMouseHandler.js.map +1 -1
- package/dist/mouse-handlers/GridColumnMoveMouseHandler.js +54 -82
- package/dist/mouse-handlers/GridColumnMoveMouseHandler.js.map +1 -1
- package/dist/mouse-handlers/GridColumnSeparatorMouseHandler.js +4 -8
- package/dist/mouse-handlers/GridColumnSeparatorMouseHandler.js.map +1 -1
- package/dist/mouse-handlers/GridHorizontalScrollBarMouseHandler.js +31 -55
- package/dist/mouse-handlers/GridHorizontalScrollBarMouseHandler.js.map +1 -1
- package/dist/mouse-handlers/GridRowMoveMouseHandler.js +26 -46
- package/dist/mouse-handlers/GridRowMoveMouseHandler.js.map +1 -1
- package/dist/mouse-handlers/GridRowSeparatorMouseHandler.js +2 -4
- package/dist/mouse-handlers/GridRowSeparatorMouseHandler.js.map +1 -1
- package/dist/mouse-handlers/GridRowTreeMouseHandler.js +14 -22
- package/dist/mouse-handlers/GridRowTreeMouseHandler.js.map +1 -1
- package/dist/mouse-handlers/GridScrollBarCornerMouseHandler.js +8 -16
- package/dist/mouse-handlers/GridScrollBarCornerMouseHandler.js.map +1 -1
- package/dist/mouse-handlers/GridSelectionMouseHandler.js +47 -75
- package/dist/mouse-handlers/GridSelectionMouseHandler.js.map +1 -1
- package/dist/mouse-handlers/GridSeparatorMouseHandler.js +9 -23
- package/dist/mouse-handlers/GridSeparatorMouseHandler.js.map +1 -1
- package/dist/mouse-handlers/GridTokenMouseHandler.js +24 -39
- package/dist/mouse-handlers/GridTokenMouseHandler.js.map +1 -1
- package/dist/mouse-handlers/GridVerticalScrollBarMouseHandler.js +31 -55
- package/dist/mouse-handlers/GridVerticalScrollBarMouseHandler.js.map +1 -1
- package/package.json +3 -3
package/dist/GridRenderer.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GridRenderer.js","names":["clamp","ColorUtils","getOrThrow","memoizeClear","GridUtils","GridColorUtils","isExpandableGridModel","isEditableGridModel","GridColumnSeparatorMouseHandler","DEFAULT_FONT_WIDTH","DataBarCellRenderer","TextCellRenderer","GridRenderer","constructor","_defineProperty","context","text","measureText","width","max","truncate","str","len","length","substr","binaryTruncateToWidth","start","arguments","undefined","end","truncationChar","charWidth","repeat","Math","floor","lo","hi","min","result","mid","ceil","truncatedStr","truncateToWidth","fontWidthLower","fontWidthUpper","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","columnsForRender","allRowYs","allRowHeights","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","allColumnXs","allColumnWidths","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","maxDepth","shadowBlur","shadowColor","shadowAlpha","colorSets","getCachedBackgroundColors","colorRowMap","Map","topShadowRows","bottomShadowRows","addRowToColorMap","rowAbove","depth","depthForRow","colorSet","color","set","get","push","depthAbove","i","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","renderType","renderTypeForCell","cellRenderer","getCellRenderer","dataBarCellRenderer","textCellRenderer","treeDepthIndent","treeHorizontalPadding","treeLineColor","columnX","rowY","depthRowAfter","depthDiff","lineX","headerFont","drawColumnHeaders","drawRowHeaders","drawRowFooters","draggingColumnSeparator","isDragging","columnHeaderHeight","visibleColumns","columnHeaderMaxDepth","headerHiddenSeparatorSize","headerHiddenSeparatorHoverColor","headerSeparatorColor","headerSeparatorHoverColor","hiddenSeparatorHeight","hiddenY","containsFrozenColumns","drawColumnHeadersForRange","hiddenColumns","entries","filter","_ref","_","w","map","_ref2","index","highlightedSeparator","separator","getColumnSeparator","getGridPointFromXY","shouldDrawSeparator","columnIndex","nextColumnIndex","hasColumnSeparatorAtDepth","visibleColumnIndex","indexOf","nextColumn","nextColumnWidth","isColumnHidden","isNextColumnHidden","range","bounds","d","drawColumnHeadersAtDepth","userColumnWidths","movedColumns","visibleWidth","startIndex","endIndex","drawColumnHeader","drawColumnHeaderAtIndex","calculatedColumnWidths","columnGroupName","textForColumnHeader","columnGroupColor","colorForColumnHeader","columnGroupLeft","columnGroupRight","prevColumnIndex","_modelColumns$get","_ref3","_ref4","_userColumnWidths$get","prevModelIndex","getModelIndex","prevColumnWidth","_modelColumns$get2","_ref5","_userColumnWidths$get2","nextModelIndex","isFullWidth","_model$colorForColumn","columnText","style","headerHorizontalPadding","headerBackgroundColor","headerColor","black","white","fontWidthsLower","fontWidthsUpper","maxWidth","separatorColor","textColor","isDarkBackground","getCachedColorIsDark","isDarkText","_unused","renderText","getCachedTruncatedString","columnLeft","visibleLeft","columnRight","visibleRight","textWidth","getCachedHeaderWidth","isBeyondLeft","isBeyondRight","textAlign","fillText","draggingRowSeparator","rowHeaderWidth","hiddenSeparatorWidth","hiddenX","hiddenRows","isPreviousRowHidden","getRowSeparatorIndex","visibleRowIndex","nextRow","nextRowHeight","isRowHidden","isNextRowHidden","drawRowHeader","cellHorizontalPadding","textForRowHeader","verticalBarWidth","textX","textY","textForRowFooter","viewport","cursorColumn","cursorRow","editingCell","isCursorVisible","isEditable","h","selectedRange","startColumn","endColumn","round","endX","endY","selectionColor","selectionOutlineCasingColor","selectionOutlineColor","drawActiveCell","scrollX","scrollY","activeCellSelectionBorderWidth","borderWidth","cellX","cellY","cellW","cellH","drawRoundedRect","DEFAULT_EDGE_RADIUS","quadraticCurveTo","closePath","_modelColumns$get3","draggingColumnVisibleRange","draggingColumnDepth","draggingModelIndex","draggingGroup","getColumnHeaderGroup","originalLeft","originalRight","originalWidth","draggingLeft","reorderOffset","columnHeaderOffset","draggingRowOffset","isDraggingHorizontalScrollBar","isDraggingVerticalScrollBar","scrollBarSize","handleHeight","handleWidth","hasHorizontalBar","hasVerticalBar","barWidth","barHeight","barLeft","barTop","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","backgroundColors","split","colors","darkenForDepth","colorWithAlpha","isDark"],"sources":["../src/GridRenderer.ts"],"sourcesContent":["import clamp from 'lodash.clamp';\nimport { ColorUtils, getOrThrow } from '@deephaven/utils';\nimport memoizeClear from './memoizeClear';\nimport GridUtils from './GridUtils';\nimport GridColorUtils from './GridColorUtils';\nimport { isExpandableGridModel } from './ExpandableGridModel';\nimport {\n type GridColor,\n type GridColorWay,\n type NullableGridColor,\n} from './GridTheme';\nimport { type Coordinate, type VisibleIndex } from './GridMetrics';\nimport { isEditableGridModel } from './EditableGridModel';\nimport GridColumnSeparatorMouseHandler from './mouse-handlers/GridColumnSeparatorMouseHandler';\nimport { type BoundedAxisRange } from './GridAxisRange';\nimport { DEFAULT_FONT_WIDTH, type GridRenderState } from './GridRendererTypes';\nimport { type CellRenderType } from './CellRenderer';\nimport type CellRenderer from './CellRenderer';\nimport DataBarCellRenderer from './DataBarCellRenderer';\nimport TextCellRenderer from './TextCellRenderer';\n\ntype NoneNullColumnRange = { startColumn: number; endColumn: number };\n\ntype NoneNullRowRange = { startRow: number; endRow: number };\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 radius in pixels for corners for some elements (like the active cell)\n static DEFAULT_EDGE_RADIUS = 2;\n\n protected textCellRenderer = new TextCellRenderer();\n\n protected dataBarCellRenderer = new DataBarCellRenderer();\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 // Estimate the width of each character by taking half the default font width as the low and double it as the high\n fontWidthLower = DEFAULT_FONT_WIDTH / 2,\n fontWidthUpper = DEFAULT_FONT_WIDTH * 2,\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 upper and lower bounds of the width of a character\n // (minus 5 on the lower bound just to be extra safe)\n const lo = Math.min(\n Math.max(0, Math.floor(width / fontWidthUpper) - 5),\n str.length\n );\n const hi = Math.min(Math.ceil(width / fontWidthLower), str.length);\n\n return GridRenderer.binaryTruncateToWidth(\n context,\n str,\n width,\n lo,\n hi,\n truncationChar\n );\n }\n\n /**\n * Cache shared between all grids. Often grids will have the same theme/colors, so we should share the cache.\n */\n static 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 /**\n * A memoized version of the GridColorUtils.colorWithAlpha function.\n */\n static getCachedColorWithAlpha = memoizeClear(GridColorUtils.colorWithAlpha, {\n max: 1000,\n });\n\n /**\n * A memoized version of the ColorUtils.isDark function.\n * ColorUtils.isDark is a very expensive function, and having a shared cache between all grids is a good idea.\n */\n static getCachedColorIsDark = memoizeClear(ColorUtils.isDark, { max: 1000 });\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 columnsForRender,\n allRowYs,\n allRowHeights,\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 columnsForRender,\n floatingRows,\n theme.floatingGridColumnColor,\n theme.floatingGridRowColor\n );\n\n this.drawCellBackgroundsForItems(\n context,\n state,\n columnsForRender,\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(allRowYs, floatingTopRowCount - 1) +\n getOrThrow(allRowHeights, 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(allRowYs, rowCount - floatingBottomRowCount) + 0.5,\n maxY:\n getOrThrow(allRowYs, rowCount - 1) +\n getOrThrow(allRowHeights, rowCount - 1) -\n 0.5,\n });\n }\n\n // Draw the cell content...\n for (let c = 0; c < columnsForRender.length; c += 1) {\n const column = columnsForRender[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 allColumnXs,\n allColumnWidths,\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(allColumnXs, floatingLeftColumnCount - 1) +\n getOrThrow(allColumnWidths, 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(allColumnXs, columnCount - floatingRightColumnCount) + 0.5,\n maxX:\n getOrThrow(allColumnXs, columnCount - 1) +\n getOrThrow(allColumnWidths, 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 allRowYs,\n allColumnXs,\n allRowHeights,\n allColumnWidths,\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(allRowYs, floatingTopRowCount - 1) +\n getOrThrow(allRowHeights, floatingTopRowCount - 1) +\n 0.5;\n context.moveTo(0, y);\n context.lineTo(maxX, y);\n }\n\n if (floatingBottomRowCount > 0) {\n const y = getOrThrow(allRowYs, 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(allColumnXs, floatingLeftColumnCount - 1) +\n getOrThrow(allColumnWidths, 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(allColumnXs, columnCount - floatingRightColumnCount) - 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(allRowYs, floatingTopRowCount - 1) +\n getOrThrow(allRowHeights, floatingTopRowCount - 1) +\n 0.5;\n context.moveTo(0, y);\n context.lineTo(maxX, y);\n }\n\n if (floatingBottomRowCount > 0) {\n const y = getOrThrow(allRowYs, 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(allColumnXs, floatingLeftColumnCount - 1) +\n getOrThrow(allColumnWidths, 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(allColumnXs, columnCount - floatingRightColumnCount) - 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 allRowHeights,\n allRowYs,\n allColumnXs,\n allColumnWidths,\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 allColumnXs.has(floatingLeftColumnCount + 1)\n ? getOrThrow(allColumnXs, floatingLeftColumnCount + 1)\n : -10,\n minY:\n floatingTopRowCount > 0 && allRowYs.has(floatingTopRowCount + 1)\n ? getOrThrow(allRowYs, floatingTopRowCount + 1)\n : -10,\n maxX:\n floatingRightColumnCount > 0 &&\n allColumnXs.has(columnCount - floatingRightColumnCount - 1)\n ? getOrThrow(\n allColumnXs,\n columnCount - floatingRightColumnCount - 1\n ) +\n getOrThrow(\n allColumnWidths,\n columnCount - floatingRightColumnCount - 1\n ) -\n 0.5\n : width + 10,\n maxY:\n floatingBottomRowCount > 0 &&\n allRowYs.has(rowCount - floatingBottomRowCount - 1)\n ? getOrThrow(allRowYs, rowCount - floatingBottomRowCount - 1) +\n getOrThrow(allRowHeights, rowCount - floatingBottomRowCount - 1) -\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: readonly 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, shadowAlpha } = theme;\n\n const colorSets = GridRenderer.getCachedBackgroundColors(\n rowBackgroundColors,\n maxDepth\n );\n const { allRowYs, allRowHeights } = 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(allRowYs, row);\n const rowHeight = getOrThrow(allRowHeights, 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 = GridRenderer.getCachedColorWithAlpha(\n shadowColor,\n shadowAlpha\n );\n const endColor = GridRenderer.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(allRowYs, 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 = GridRenderer.getCachedColorWithAlpha(shadowColor, 0);\n const endColor = GridRenderer.getCachedColorWithAlpha(\n shadowColor,\n shadowAlpha\n );\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(allRowYs, row);\n const rowHeight = getOrThrow(allRowHeights, 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 { allColumnWidths, allColumnXs, maxY } = metrics;\n if (mouseY > maxY) {\n return;\n }\n\n const x = getOrThrow(allColumnXs, mouseColumn);\n const columnWidth = getOrThrow(allColumnWidths, 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 { allRowHeights, allRowYs, maxX } = metrics;\n\n const y = getOrThrow(allRowYs, row);\n const rowHeight = getOrThrow(allRowHeights, 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 { columnsForRender, visibleRows } = metrics;\n\n this.drawGridLinesForItems(\n context,\n state,\n columnsForRender,\n visibleRows,\n theme.gridColumnColor,\n theme.gridRowColor\n );\n }\n\n drawGridLinesForItems(\n context: CanvasRenderingContext2D,\n state: GridRenderState,\n columns: readonly VisibleIndex[],\n rows: readonly 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: readonly VisibleIndex[]\n ): void {\n const { metrics } = state;\n const { allColumnXs, maxY } = metrics;\n for (let i = 0; i < columns.length; i += 1) {\n const column = columns[i];\n const x = getOrThrow(allColumnXs, 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: readonly VisibleIndex[]\n ): void {\n const { metrics } = state;\n const { allRowYs, 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(allRowYs, 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 { columnsForRender, visibleRows } = metrics;\n this.drawCellBackgroundsForItems(\n context,\n state,\n columnsForRender,\n visibleRows\n );\n }\n\n drawCellBackgroundsForItems(\n context: CanvasRenderingContext2D,\n state: GridRenderState,\n columns: readonly VisibleIndex[],\n rows: readonly 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 allColumnXs,\n allColumnWidths,\n allRowYs,\n allRowHeights,\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(allColumnXs, column) + 1;\n const y = getOrThrow(allRowYs, row) + 1;\n const columnWidth = getOrThrow(allColumnWidths, column) - 1;\n const rowHeight = getOrThrow(allRowHeights, 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 { columnsForRender } = metrics;\n\n for (let i = 0; i < columnsForRender.length; i += 1) {\n const column = columnsForRender[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 { allColumnXs, allColumnWidths, visibleRows, height } = metrics;\n const x = getOrThrow(allColumnXs, column);\n const columnWidth = getOrThrow(allColumnWidths, 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 drawCellContent(\n context: CanvasRenderingContext2D,\n state: GridRenderState,\n column: VisibleIndex,\n row: VisibleIndex\n ): void {\n const { metrics, model } = state;\n const { modelColumns, modelRows } = metrics;\n const modelRow = getOrThrow(modelRows, row);\n const modelColumn = getOrThrow(modelColumns, column);\n const renderType = model.renderTypeForCell(modelColumn, modelRow);\n const cellRenderer = this.getCellRenderer(renderType);\n cellRenderer.drawCellContent(context, state, column, row);\n }\n\n getCellRenderer(renderType: CellRenderType): CellRenderer {\n switch (renderType) {\n case 'dataBar':\n return this.dataBarCellRenderer;\n default:\n return this.textCellRenderer;\n }\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 { firstColumn, allColumnXs, allRowYs, allRowHeights } = metrics;\n const { treeDepthIndent, treeHorizontalPadding, treeLineColor } = theme;\n const columnX = getOrThrow(allColumnXs, firstColumn);\n const rowY = getOrThrow(allRowYs, row);\n const rowHeight = getOrThrow(allRowHeights, 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 Math.floor(\n columnX +\n i * treeDepthIndent +\n treeDepthIndent * 0.5 +\n treeHorizontalPadding\n ) + 0.5; // The 0.5 makes the line crisp https://stackoverflow.com/questions/9311428/draw-single-pixel-line-in-html5-canvas\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 Math.floor(\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.floor(rowHeight / 2));\n // extra moveTo prevents halfpixel in corner\n context.moveTo(lineX - 0.5, rowY + Math.floor(rowHeight / 2) + 0.5);\n context.lineTo(\n lineX + treeDepthIndent - 0.5,\n rowY + Math.floor(rowHeight / 2) + 0.5\n );\n }\n context.stroke();\n }\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 allColumnWidths,\n allColumnXs,\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 = [...allColumnWidths.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(allColumnXs, column);\n const columnWidth = getOrThrow(allColumnWidths, 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 shouldDrawSeparator = GridUtils.hasColumnSeparatorAtDepth(\n model,\n depth,\n columnIndex,\n nextColumnIndex\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(allColumnXs, highlightedSeparator);\n const columnWidth = getOrThrow(allColumnWidths, highlightedSeparator);\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 ? allColumnWidths.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 allColumnXs,\n gridX,\n userColumnWidths,\n allColumnWidths,\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, calculatedColumnWidths } = 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(allColumnXs, columnIndex) + gridX;\n let columnGroupRight =\n columnGroupLeft + getOrThrow(allColumnWidths, 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 const prevColumnWidth =\n userColumnWidths.get(prevModelIndex) ??\n allColumnWidths.get(prevColumnIndex) ??\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 const nextColumnWidth =\n userColumnWidths.get(nextModelIndex) ??\n allColumnWidths.get(nextColumnIndex) ??\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 { modelColumns, allColumnWidths, allColumnXs, gridX } = metrics;\n const width = getOrThrow(allColumnWidths, index);\n const x = getOrThrow(allColumnXs, 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 { fontWidthsLower, fontWidthsUpper, width } = metrics;\n\n const maxWidth = columnWidth - headerHorizontalPadding * 2;\n\n const {\n backgroundColor = headerBackgroundColor,\n separatorColor = headerSeparatorColor,\n } = style ?? {};\n\n let { textColor = headerColor } = style ?? {};\n\n try {\n const isDarkBackground =\n GridRenderer.getCachedColorIsDark(backgroundColor);\n const isDarkText = GridRenderer.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 const fontWidthLower = fontWidthsLower.get(context.font);\n const fontWidthUpper = fontWidthsUpper.get(context.font);\n const renderText = this.textCellRenderer.getCachedTruncatedString(\n context,\n columnText,\n maxWidth,\n fontWidthLower,\n fontWidthUpper\n );\n\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 textWidth = this.getCachedHeaderWidth(context, renderText);\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 allRowHeights,\n allRowYs,\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(allRowYs, row);\n const rowHeight = getOrThrow(allRowHeights, 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(allRowYs, row);\n const rowHeight = getOrThrow(allRowHeights, 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(allRowYs, highlightedSeparator);\n const rowHeight = getOrThrow(allRowHeights, 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 ? allRowHeights.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(allRowHeights, row);\n const y = getOrThrow(allRowYs, 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 { mouseX, mouseY, metrics, model, theme, draggingRowSeparator } =\n state;\n const {\n gridY,\n gridX,\n maxX,\n modelRows,\n rowFooterWidth,\n height,\n verticalBarWidth,\n visibleRows,\n allRowHeights,\n allRowYs,\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(allRowYs, row);\n const rowHeight = getOrThrow(allRowHeights, 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(allRowYs, row);\n const rowHeight = getOrThrow(allRowHeights, 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(allRowYs, highlightedSeparator);\n const rowHeight = getOrThrow(allRowHeights, 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 ? allRowHeights.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(allRowHeights, row);\n if (rowHeight > 0) {\n const rowY = getOrThrow(allRowYs, 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 allColumnWidths,\n allColumnXs,\n allRowHeights,\n allRowYs,\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 allColumnXs.has(column) &&\n allRowYs.has(row);\n if (isCursorVisible) {\n // Punch a hole out where the active cell is, it gets styled differently.\n const x = getOrThrow(allColumnXs, column);\n const y = getOrThrow(allRowYs, row);\n const w = getOrThrow(allColumnWidths, column);\n const h = getOrThrow(allRowHeights, 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 && allColumnXs.has(startColumn)\n ? Math.round(getOrThrow(allColumnXs, startColumn)) + 0.5\n : minX;\n const y =\n startRow >= top && allRowYs.has(startRow)\n ? Math.max(Math.round(getOrThrow(allRowYs, startRow)) + 0.5, 0.5)\n : minY;\n\n const endX =\n endColumn <= right && allColumnXs.has(endColumn)\n ? Math.round(\n getOrThrow(allColumnXs, endColumn) +\n getOrThrow(allColumnWidths, endColumn)\n ) - 0.5\n : maxX;\n const endY =\n endRow <= bottom && allRowYs.has(endRow)\n ? Math.round(\n getOrThrow(allRowYs, endRow) + getOrThrow(allRowHeights, endRow)\n ) - 0.5\n : maxY;\n\n context.rect(x, y, endX - x, endY - y);\n }\n }\n\n /**\n * Create the path, then draw it once. Fill and\n * stroke must be outside the beginPath loop otherwise\n * the fill/stroke will be drawn multiple times.\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 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 ): void {\n const { metrics, theme } = state;\n const {\n scrollX,\n scrollY,\n allColumnWidths,\n allColumnXs,\n allRowHeights,\n allRowYs,\n } = metrics;\n const { activeCellSelectionBorderWidth: borderWidth } = theme;\n const cellX = getOrThrow(allColumnXs, column);\n const cellY = getOrThrow(allRowYs, row);\n const cellW = getOrThrow(allColumnWidths, column);\n const cellH = getOrThrow(allRowHeights, 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 && scrollX <= 0) {\n w -= borderWidth - x;\n x = borderWidth * 0.5;\n }\n if (y <= 0 && scrollY <= 0) {\n h -= borderWidth - y;\n y = borderWidth * 0.5;\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 { range: draggingColumnVisibleRange, depth: draggingColumnDepth } =\n draggingColumn;\n\n const {\n gridX,\n gridY,\n allColumnXs,\n allColumnWidths,\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(allColumnXs, startIndex);\n const originalRight =\n getOrThrow(allColumnXs, endIndex) + getOrThrow(allColumnWidths, 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 // The header drawing functions expect the context to be at the edge of the canvas\n // We offset it by how much the user has dragged\n context.translate(draggingLeft - originalLeft - gridX, 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 // Now move to the edge of the \"grid\" (top-left of top-left cell). We then draw the\n // grid background, but only the clipped region will be drawn where the dragging column is.\n context.translate(gridX, gridY);\n context.font = font;\n\n this.drawGridBackground(context, state);\n\n // Then draw the contents of the column that is being dragged\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, allRowYs, allRowHeights, width } = metrics;\n const y = getOrThrow(allRowYs, draggingRow);\n const rowHeight = getOrThrow(allRowHeights, 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 width,\n height,\n handleHeight,\n handleWidth,\n scrollX,\n scrollY,\n hasHorizontalBar,\n hasVerticalBar,\n barWidth,\n barHeight,\n barLeft,\n barTop,\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 >= barTop &&\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 >= barLeft &&\n isInbounds);\n\n const hScrollBarSize = isHorizontalBarHover\n ? scrollBarHoverSize\n : scrollBarSize;\n const vScrollBarSize = isVerticalBarHover\n ? scrollBarHoverSize\n : scrollBarSize;\n\n context.translate(barLeft, barTop);\n\n if (hasHorizontalBar && hasVerticalBar) {\n // That little corner in the bottom right\n context.fillStyle = scrollBarCasingColor;\n context.fillRect(\n width - barLeft - scrollBarSize,\n height - barTop - scrollBarSize,\n scrollBarSize,\n scrollBarSize\n );\n context.fillStyle = scrollBarCornerColor;\n context.fillRect(\n width - barLeft - scrollBarSize + scrollBarCasingWidth,\n height - barTop - scrollBarSize + scrollBarCasingWidth,\n scrollBarSize - scrollBarCasingWidth,\n scrollBarSize - scrollBarCasingWidth\n );\n }\n\n if (hasHorizontalBar) {\n const x = scrollX;\n const y = height - barTop - 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 - barLeft - 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(-barLeft, -barTop);\n }\n\n getCachedHeaderWidth = memoizeClear(\n (context: CanvasRenderingContext2D, text: string): number =>\n context.measureText(text).width,\n { max: 1000 }\n );\n}\n\nexport default GridRenderer;\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"GridRenderer.js","names":["clamp","ColorUtils","getOrThrow","memoizeClear","GridUtils","GridColorUtils","isExpandableGridModel","isEditableGridModel","GridColumnSeparatorMouseHandler","DEFAULT_FONT_WIDTH","DataBarCellRenderer","TextCellRenderer","GridRenderer","constructor","_defineProperty","context","text","measureText","width","max","truncate","str","len","length","substr","binaryTruncateToWidth","start","arguments","undefined","end","truncationChar","charWidth","repeat","Math","floor","lo","hi","min","result","mid","ceil","truncatedStr","truncateToWidth","fontWidthLower","fontWidthUpper","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","columnsForRender","allRowYs","allRowHeights","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","allColumnXs","allColumnWidths","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","maxDepth","shadowBlur","shadowColor","shadowAlpha","colorSets","getCachedBackgroundColors","colorRowMap","Map","topShadowRows","bottomShadowRows","addRowToColorMap","rowAbove","depth","depthForRow","colorSet","color","set","get","push","depthAbove","i","forEach","colorRows","rowHeight","fill","startColor","getCachedColorWithAlpha","endColor","gradient","createLinearGradient","addColorStop","gradientY","mouseX","mouseY","mouseColumn","getColumnAtX","columnHoverBackgroundColor","columnWidth","rowHoverBackgroundColor","mouseRow","getRowAtY","drawMouseRowHoverForRow","rowFooterWidth","selectedRanges","_selectedRanges$i","startRow","endRow","selectedRowHoverBackgroundColor","gridColumnColor","gridRowColor","columns","columnColor","rowColor","drawGridLinesForColumns","drawGridLinesForRows","metricsMaxX","j","rowAfter","drawCellBackground","firstColumn","modelColumns","modelRows","modelRow","modelColumn","backgroundColorForCell","isFirstColumn","hasExpandableRows","drawCellRowTreeDepthLines","drawColumnCellContents","renderType","renderTypeForCell","cellRenderer","getCellRenderer","dataBarCellRenderer","textCellRenderer","treeDepthIndent","treeHorizontalPadding","treeLineColor","columnX","rowY","depthRowAfter","depthDiff","lineX","headerFont","drawColumnHeaders","drawRowHeaders","drawRowFooters","draggingColumnSeparator","isDragging","columnHeaderHeight","visibleColumns","movedColumns","columnHeaderMaxDepth","headerHiddenSeparatorSize","headerHiddenSeparatorHoverColor","headerSeparatorColor","headerSeparatorHoverColor","hiddenSeparatorHeight","hiddenY","containsFrozenColumns","drawColumnHeadersForRange","hiddenColumns","entries","filter","_ref","_ref2","_slicedToArray","_","w","map","_ref3","_ref4","index","_ref5","highlightedSeparator","separator","getColumnSeparator","getGridPointFromXY","shouldDrawSeparator","hasColumnSeparatorAtDepth","visibleColumnIndex","indexOf","nextColumn","nextColumnWidth","isColumnHidden","isNextColumnHidden","range","bounds","d","drawColumnHeadersAtDepth","userColumnWidths","visibleWidth","startIndex","endIndex","drawColumnHeader","drawColumnHeaderAtIndex","columnIndex","calculatedColumnWidths","columnGroupName","textForColumnHeader","columnGroupColor","colorForColumnHeader","columnGroupLeft","columnGroupRight","prevColumnIndex","_modelColumns$get","_ref6","_ref7","_userColumnWidths$get","prevModelIndex","getModelIndex","isSameColumnGroupAtDepth","prevColumnWidth","nextColumnIndex","_modelColumns$get2","_ref8","_userColumnWidths$get2","nextModelIndex","isFullWidth","_model$colorForColumn","columnText","style","headerHorizontalPadding","headerBackgroundColor","headerColor","black","white","fontWidthsLower","fontWidthsUpper","maxWidth","_ref9","_ref9$backgroundColor","_ref9$separatorColor","separatorColor","_ref0","_ref0$textColor","textColor","isDarkBackground","getCachedColorIsDark","isDarkText","_unused","_ref1","_ref1$minX","_ref1$maxX","renderText","getCachedTruncatedString","columnLeft","visibleLeft","columnRight","visibleRight","textWidth","getCachedHeaderWidth","isBeyondLeft","isBeyondRight","textAlign","fillText","draggingRowSeparator","rowHeaderWidth","hiddenSeparatorWidth","hiddenX","hiddenRows","isPreviousRowHidden","_ref10","_ref10$index","getRowSeparatorIndex","visibleRowIndex","nextRow","nextRowHeight","isRowHidden","isNextRowHidden","drawRowHeader","cellHorizontalPadding","textForRowHeader","verticalBarWidth","_ref11","_ref11$index","textX","textY","textForRowFooter","viewport","cursorColumn","cursorRow","editingCell","_viewport$left","_viewport$top","_viewport$right","_viewport$bottom","_viewport$minY","_viewport$maxY","_viewport$minX","_viewport$maxX","isCursorVisible","isEditable","h","selectedRange","startColumn","endColumn","round","endX","endY","selectionColor","selectionOutlineCasingColor","selectionOutlineColor","drawActiveCell","scrollX","scrollY","borderWidth","activeCellSelectionBorderWidth","cellX","cellY","cellW","cellH","drawRoundedRect","DEFAULT_EDGE_RADIUS","quadraticCurveTo","closePath","_modelColumns$get3","draggingColumnVisibleRange","draggingColumnDepth","draggingModelIndex","draggingGroup","getColumnHeaderGroup","_draggingColumnVisibl","originalLeft","originalRight","originalWidth","draggingLeft","reorderOffset","columnHeaderOffset","draggingRowOffset","isDraggingHorizontalScrollBar","isDraggingVerticalScrollBar","scrollBarSize","handleHeight","handleWidth","hasHorizontalBar","hasVerticalBar","barWidth","barHeight","barLeft","barTop","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","backgroundColors","split","colors","darkenForDepth","colorWithAlpha","isDark"],"sources":["../src/GridRenderer.ts"],"sourcesContent":["import clamp from 'lodash.clamp';\nimport { ColorUtils, getOrThrow } from '@deephaven/utils';\nimport memoizeClear from './memoizeClear';\nimport GridUtils from './GridUtils';\nimport GridColorUtils from './GridColorUtils';\nimport { isExpandableGridModel } from './ExpandableGridModel';\nimport {\n type GridColor,\n type GridColorWay,\n type NullableGridColor,\n} from './GridTheme';\nimport { type Coordinate, type VisibleIndex } from './GridMetrics';\nimport { isEditableGridModel } from './EditableGridModel';\nimport GridColumnSeparatorMouseHandler from './mouse-handlers/GridColumnSeparatorMouseHandler';\nimport { type BoundedAxisRange } from './GridAxisRange';\nimport { DEFAULT_FONT_WIDTH, type GridRenderState } from './GridRendererTypes';\nimport { type CellRenderType } from './CellRenderer';\nimport type CellRenderer from './CellRenderer';\nimport DataBarCellRenderer from './DataBarCellRenderer';\nimport TextCellRenderer from './TextCellRenderer';\n\ntype NoneNullColumnRange = { startColumn: number; endColumn: number };\n\ntype NoneNullRowRange = { startRow: number; endRow: number };\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 radius in pixels for corners for some elements (like the active cell)\n static DEFAULT_EDGE_RADIUS = 2;\n\n protected textCellRenderer = new TextCellRenderer();\n\n protected dataBarCellRenderer = new DataBarCellRenderer();\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 // Estimate the width of each character by taking half the default font width as the low and double it as the high\n fontWidthLower = DEFAULT_FONT_WIDTH / 2,\n fontWidthUpper = DEFAULT_FONT_WIDTH * 2,\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 upper and lower bounds of the width of a character\n // (minus 5 on the lower bound just to be extra safe)\n const lo = Math.min(\n Math.max(0, Math.floor(width / fontWidthUpper) - 5),\n str.length\n );\n const hi = Math.min(Math.ceil(width / fontWidthLower), str.length);\n\n return GridRenderer.binaryTruncateToWidth(\n context,\n str,\n width,\n lo,\n hi,\n truncationChar\n );\n }\n\n /**\n * Cache shared between all grids. Often grids will have the same theme/colors, so we should share the cache.\n */\n static 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 /**\n * A memoized version of the GridColorUtils.colorWithAlpha function.\n */\n static getCachedColorWithAlpha = memoizeClear(GridColorUtils.colorWithAlpha, {\n max: 1000,\n });\n\n /**\n * A memoized version of the ColorUtils.isDark function.\n * ColorUtils.isDark is a very expensive function, and having a shared cache between all grids is a good idea.\n */\n static getCachedColorIsDark = memoizeClear(ColorUtils.isDark, { max: 1000 });\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 columnsForRender,\n allRowYs,\n allRowHeights,\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 columnsForRender,\n floatingRows,\n theme.floatingGridColumnColor,\n theme.floatingGridRowColor\n );\n\n this.drawCellBackgroundsForItems(\n context,\n state,\n columnsForRender,\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(allRowYs, floatingTopRowCount - 1) +\n getOrThrow(allRowHeights, 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(allRowYs, rowCount - floatingBottomRowCount) + 0.5,\n maxY:\n getOrThrow(allRowYs, rowCount - 1) +\n getOrThrow(allRowHeights, rowCount - 1) -\n 0.5,\n });\n }\n\n // Draw the cell content...\n for (let c = 0; c < columnsForRender.length; c += 1) {\n const column = columnsForRender[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 allColumnXs,\n allColumnWidths,\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(allColumnXs, floatingLeftColumnCount - 1) +\n getOrThrow(allColumnWidths, 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(allColumnXs, columnCount - floatingRightColumnCount) + 0.5,\n maxX:\n getOrThrow(allColumnXs, columnCount - 1) +\n getOrThrow(allColumnWidths, 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 allRowYs,\n allColumnXs,\n allRowHeights,\n allColumnWidths,\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(allRowYs, floatingTopRowCount - 1) +\n getOrThrow(allRowHeights, floatingTopRowCount - 1) +\n 0.5;\n context.moveTo(0, y);\n context.lineTo(maxX, y);\n }\n\n if (floatingBottomRowCount > 0) {\n const y = getOrThrow(allRowYs, 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(allColumnXs, floatingLeftColumnCount - 1) +\n getOrThrow(allColumnWidths, 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(allColumnXs, columnCount - floatingRightColumnCount) - 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(allRowYs, floatingTopRowCount - 1) +\n getOrThrow(allRowHeights, floatingTopRowCount - 1) +\n 0.5;\n context.moveTo(0, y);\n context.lineTo(maxX, y);\n }\n\n if (floatingBottomRowCount > 0) {\n const y = getOrThrow(allRowYs, 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(allColumnXs, floatingLeftColumnCount - 1) +\n getOrThrow(allColumnWidths, 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(allColumnXs, columnCount - floatingRightColumnCount) - 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 allRowHeights,\n allRowYs,\n allColumnXs,\n allColumnWidths,\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 allColumnXs.has(floatingLeftColumnCount + 1)\n ? getOrThrow(allColumnXs, floatingLeftColumnCount + 1)\n : -10,\n minY:\n floatingTopRowCount > 0 && allRowYs.has(floatingTopRowCount + 1)\n ? getOrThrow(allRowYs, floatingTopRowCount + 1)\n : -10,\n maxX:\n floatingRightColumnCount > 0 &&\n allColumnXs.has(columnCount - floatingRightColumnCount - 1)\n ? getOrThrow(\n allColumnXs,\n columnCount - floatingRightColumnCount - 1\n ) +\n getOrThrow(\n allColumnWidths,\n columnCount - floatingRightColumnCount - 1\n ) -\n 0.5\n : width + 10,\n maxY:\n floatingBottomRowCount > 0 &&\n allRowYs.has(rowCount - floatingBottomRowCount - 1)\n ? getOrThrow(allRowYs, rowCount - floatingBottomRowCount - 1) +\n getOrThrow(allRowHeights, rowCount - floatingBottomRowCount - 1) -\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: readonly 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, shadowAlpha } = theme;\n\n const colorSets = GridRenderer.getCachedBackgroundColors(\n rowBackgroundColors,\n maxDepth\n );\n const { allRowYs, allRowHeights } = 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(allRowYs, row);\n const rowHeight = getOrThrow(allRowHeights, 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 = GridRenderer.getCachedColorWithAlpha(\n shadowColor,\n shadowAlpha\n );\n const endColor = GridRenderer.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(allRowYs, 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 = GridRenderer.getCachedColorWithAlpha(shadowColor, 0);\n const endColor = GridRenderer.getCachedColorWithAlpha(\n shadowColor,\n shadowAlpha\n );\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(allRowYs, row);\n const rowHeight = getOrThrow(allRowHeights, 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 { allColumnWidths, allColumnXs, maxY } = metrics;\n if (mouseY > maxY) {\n return;\n }\n\n const x = getOrThrow(allColumnXs, mouseColumn);\n const columnWidth = getOrThrow(allColumnWidths, 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 { allRowHeights, allRowYs, maxX } = metrics;\n\n const y = getOrThrow(allRowYs, row);\n const rowHeight = getOrThrow(allRowHeights, 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 { columnsForRender, visibleRows } = metrics;\n\n this.drawGridLinesForItems(\n context,\n state,\n columnsForRender,\n visibleRows,\n theme.gridColumnColor,\n theme.gridRowColor\n );\n }\n\n drawGridLinesForItems(\n context: CanvasRenderingContext2D,\n state: GridRenderState,\n columns: readonly VisibleIndex[],\n rows: readonly 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: readonly VisibleIndex[]\n ): void {\n const { metrics } = state;\n const { allColumnXs, maxY } = metrics;\n for (let i = 0; i < columns.length; i += 1) {\n const column = columns[i];\n const x = getOrThrow(allColumnXs, 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: readonly VisibleIndex[]\n ): void {\n const { metrics } = state;\n const { allRowYs, 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(allRowYs, 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 { columnsForRender, visibleRows } = metrics;\n this.drawCellBackgroundsForItems(\n context,\n state,\n columnsForRender,\n visibleRows\n );\n }\n\n drawCellBackgroundsForItems(\n context: CanvasRenderingContext2D,\n state: GridRenderState,\n columns: readonly VisibleIndex[],\n rows: readonly 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 allColumnXs,\n allColumnWidths,\n allRowYs,\n allRowHeights,\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(allColumnXs, column) + 1;\n const y = getOrThrow(allRowYs, row) + 1;\n const columnWidth = getOrThrow(allColumnWidths, column) - 1;\n const rowHeight = getOrThrow(allRowHeights, 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 { columnsForRender } = metrics;\n\n for (let i = 0; i < columnsForRender.length; i += 1) {\n const column = columnsForRender[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 { allColumnXs, allColumnWidths, visibleRows, height } = metrics;\n const x = getOrThrow(allColumnXs, column);\n const columnWidth = getOrThrow(allColumnWidths, 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 drawCellContent(\n context: CanvasRenderingContext2D,\n state: GridRenderState,\n column: VisibleIndex,\n row: VisibleIndex\n ): void {\n const { metrics, model } = state;\n const { modelColumns, modelRows } = metrics;\n const modelRow = getOrThrow(modelRows, row);\n const modelColumn = getOrThrow(modelColumns, column);\n const renderType = model.renderTypeForCell(modelColumn, modelRow);\n const cellRenderer = this.getCellRenderer(renderType);\n cellRenderer.drawCellContent(context, state, column, row);\n }\n\n getCellRenderer(renderType: CellRenderType): CellRenderer {\n switch (renderType) {\n case 'dataBar':\n return this.dataBarCellRenderer;\n default:\n return this.textCellRenderer;\n }\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 { firstColumn, allColumnXs, allRowYs, allRowHeights } = metrics;\n const { treeDepthIndent, treeHorizontalPadding, treeLineColor } = theme;\n const columnX = getOrThrow(allColumnXs, firstColumn);\n const rowY = getOrThrow(allRowYs, row);\n const rowHeight = getOrThrow(allRowHeights, 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 Math.floor(\n columnX +\n i * treeDepthIndent +\n treeDepthIndent * 0.5 +\n treeHorizontalPadding\n ) + 0.5; // The 0.5 makes the line crisp https://stackoverflow.com/questions/9311428/draw-single-pixel-line-in-html5-canvas\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 Math.floor(\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.floor(rowHeight / 2));\n // extra moveTo prevents halfpixel in corner\n context.moveTo(lineX - 0.5, rowY + Math.floor(rowHeight / 2) + 0.5);\n context.lineTo(\n lineX + treeDepthIndent - 0.5,\n rowY + Math.floor(rowHeight / 2) + 0.5\n );\n }\n context.stroke();\n }\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 allColumnWidths,\n allColumnXs,\n floatingLeftColumnCount,\n floatingLeftWidth,\n floatingRightWidth,\n movedColumns,\n columnCount,\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 = [...allColumnWidths.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(allColumnXs, column);\n const columnWidth = getOrThrow(allColumnWidths, 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 shouldDrawSeparator = GridUtils.hasColumnSeparatorAtDepth(\n model,\n depth,\n highlightedSeparator,\n columnCount,\n movedColumns\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(allColumnXs, highlightedSeparator);\n const columnWidth = getOrThrow(allColumnWidths, highlightedSeparator);\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 ? allColumnWidths.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 allColumnXs,\n gridX,\n userColumnWidths,\n allColumnWidths,\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, calculatedColumnWidths } = 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(allColumnXs, columnIndex) + gridX;\n let columnGroupRight =\n columnGroupLeft + getOrThrow(allColumnWidths, 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 !GridUtils.isSameColumnGroupAtDepth(\n model,\n depth,\n modelColumn,\n prevModelIndex\n )\n ) {\n // Previous column not in the same group\n break;\n }\n\n const prevColumnWidth =\n userColumnWidths.get(prevModelIndex) ??\n allColumnWidths.get(prevColumnIndex) ??\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 !GridUtils.isSameColumnGroupAtDepth(\n model,\n depth,\n modelColumn,\n nextModelIndex\n )\n ) {\n // Next column not in the same group\n break;\n }\n\n const nextColumnWidth =\n userColumnWidths.get(nextModelIndex) ??\n allColumnWidths.get(nextColumnIndex) ??\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 { modelColumns, allColumnWidths, allColumnXs, gridX } = metrics;\n const width = getOrThrow(allColumnWidths, index);\n const x = getOrThrow(allColumnXs, 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 { fontWidthsLower, fontWidthsUpper, width } = metrics;\n\n const maxWidth = columnWidth - headerHorizontalPadding * 2;\n\n const {\n backgroundColor = headerBackgroundColor,\n separatorColor = headerSeparatorColor,\n } = style ?? {};\n\n let { textColor = headerColor } = style ?? {};\n\n try {\n const isDarkBackground =\n GridRenderer.getCachedColorIsDark(backgroundColor);\n const isDarkText = GridRenderer.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 const fontWidthLower = fontWidthsLower.get(context.font);\n const fontWidthUpper = fontWidthsUpper.get(context.font);\n const renderText = this.textCellRenderer.getCachedTruncatedString(\n context,\n columnText,\n maxWidth,\n fontWidthLower,\n fontWidthUpper\n );\n\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 textWidth = this.getCachedHeaderWidth(context, renderText);\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 allRowHeights,\n allRowYs,\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(allRowYs, row);\n const rowHeight = getOrThrow(allRowHeights, 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(allRowYs, row);\n const rowHeight = getOrThrow(allRowHeights, 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(allRowYs, highlightedSeparator);\n const rowHeight = getOrThrow(allRowHeights, 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 ? allRowHeights.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(allRowHeights, row);\n const y = getOrThrow(allRowYs, 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 { mouseX, mouseY, metrics, model, theme, draggingRowSeparator } =\n state;\n const {\n gridY,\n gridX,\n maxX,\n modelRows,\n rowFooterWidth,\n height,\n verticalBarWidth,\n visibleRows,\n allRowHeights,\n allRowYs,\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(allRowYs, row);\n const rowHeight = getOrThrow(allRowHeights, 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(allRowYs, row);\n const rowHeight = getOrThrow(allRowHeights, 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(allRowYs, highlightedSeparator);\n const rowHeight = getOrThrow(allRowHeights, 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 ? allRowHeights.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(allRowHeights, row);\n if (rowHeight > 0) {\n const rowY = getOrThrow(allRowYs, 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 allColumnWidths,\n allColumnXs,\n allRowHeights,\n allRowYs,\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 allColumnXs.has(column) &&\n allRowYs.has(row);\n if (isCursorVisible) {\n // Punch a hole out where the active cell is, it gets styled differently.\n const x = getOrThrow(allColumnXs, column);\n const y = getOrThrow(allRowYs, row);\n const w = getOrThrow(allColumnWidths, column);\n const h = getOrThrow(allRowHeights, 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 && allColumnXs.has(startColumn)\n ? Math.round(getOrThrow(allColumnXs, startColumn)) + 0.5\n : minX;\n const y =\n startRow >= top && allRowYs.has(startRow)\n ? Math.max(Math.round(getOrThrow(allRowYs, startRow)) + 0.5, 0.5)\n : minY;\n\n const endX =\n endColumn <= right && allColumnXs.has(endColumn)\n ? Math.round(\n getOrThrow(allColumnXs, endColumn) +\n getOrThrow(allColumnWidths, endColumn)\n ) - 0.5\n : maxX;\n const endY =\n endRow <= bottom && allRowYs.has(endRow)\n ? Math.round(\n getOrThrow(allRowYs, endRow) + getOrThrow(allRowHeights, endRow)\n ) - 0.5\n : maxY;\n\n context.rect(x, y, endX - x, endY - y);\n }\n }\n\n /**\n * Create the path, then draw it once. Fill and\n * stroke must be outside the beginPath loop otherwise\n * the fill/stroke will be drawn multiple times.\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 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 ): void {\n const { metrics, theme } = state;\n const {\n scrollX,\n scrollY,\n allColumnWidths,\n allColumnXs,\n allRowHeights,\n allRowYs,\n } = metrics;\n const { activeCellSelectionBorderWidth: borderWidth } = theme;\n const cellX = getOrThrow(allColumnXs, column);\n const cellY = getOrThrow(allRowYs, row);\n const cellW = getOrThrow(allColumnWidths, column);\n const cellH = getOrThrow(allRowHeights, 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 && scrollX <= 0) {\n w -= borderWidth - x;\n x = borderWidth * 0.5;\n }\n if (y <= 0 && scrollY <= 0) {\n h -= borderWidth - y;\n y = borderWidth * 0.5;\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 { range: draggingColumnVisibleRange, depth: draggingColumnDepth } =\n draggingColumn;\n\n const {\n gridX,\n gridY,\n allColumnXs,\n allColumnWidths,\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(allColumnXs, startIndex);\n const originalRight =\n getOrThrow(allColumnXs, endIndex) + getOrThrow(allColumnWidths, 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 // The header drawing functions expect the context to be at the edge of the canvas\n // We offset it by how much the user has dragged\n context.translate(draggingLeft - originalLeft - gridX, 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 // Now move to the edge of the \"grid\" (top-left of top-left cell). We then draw the\n // grid background, but only the clipped region will be drawn where the dragging column is.\n context.translate(gridX, gridY);\n context.font = font;\n\n this.drawGridBackground(context, state);\n\n // Then draw the contents of the column that is being dragged\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, allRowYs, allRowHeights, width } = metrics;\n const y = getOrThrow(allRowYs, draggingRow);\n const rowHeight = getOrThrow(allRowHeights, 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 width,\n height,\n handleHeight,\n handleWidth,\n scrollX,\n scrollY,\n hasHorizontalBar,\n hasVerticalBar,\n barWidth,\n barHeight,\n barLeft,\n barTop,\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 >= barTop &&\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 >= barLeft &&\n isInbounds);\n\n const hScrollBarSize = isHorizontalBarHover\n ? scrollBarHoverSize\n : scrollBarSize;\n const vScrollBarSize = isVerticalBarHover\n ? scrollBarHoverSize\n : scrollBarSize;\n\n context.translate(barLeft, barTop);\n\n if (hasHorizontalBar && hasVerticalBar) {\n // That little corner in the bottom right\n context.fillStyle = scrollBarCasingColor;\n context.fillRect(\n width - barLeft - scrollBarSize,\n height - barTop - scrollBarSize,\n scrollBarSize,\n scrollBarSize\n );\n context.fillStyle = scrollBarCornerColor;\n context.fillRect(\n width - barLeft - scrollBarSize + scrollBarCasingWidth,\n height - barTop - scrollBarSize + scrollBarCasingWidth,\n scrollBarSize - scrollBarCasingWidth,\n scrollBarSize - scrollBarCasingWidth\n );\n }\n\n if (hasHorizontalBar) {\n const x = scrollX;\n const y = height - barTop - 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 - barLeft - 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(-barLeft, -barTop);\n }\n\n getCachedHeaderWidth = memoizeClear(\n (context: CanvasRenderingContext2D, text: string): number =>\n context.measureText(text).width,\n { max: 1000 }\n );\n}\n\nexport default GridRenderer;\n"],"mappings":"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","ignoreList":[]}
|