@deephaven/grid 0.41.0 → 0.41.2-beta.3

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.
Files changed (61) hide show
  1. package/dist/CellRenderer.d.ts +12 -0
  2. package/dist/CellRenderer.d.ts.map +1 -0
  3. package/dist/CellRenderer.js +64 -0
  4. package/dist/CellRenderer.js.map +1 -0
  5. package/dist/DataBarCellRenderer.d.ts +38 -0
  6. package/dist/DataBarCellRenderer.d.ts.map +1 -0
  7. package/dist/DataBarCellRenderer.js +404 -0
  8. package/dist/DataBarCellRenderer.js.map +1 -0
  9. package/dist/DataBarGridModel.d.ts +47 -0
  10. package/dist/DataBarGridModel.d.ts.map +1 -0
  11. package/dist/DataBarGridModel.js +27 -0
  12. package/dist/DataBarGridModel.js.map +1 -0
  13. package/dist/Grid.d.ts +4 -0
  14. package/dist/Grid.d.ts.map +1 -1
  15. package/dist/GridColorUtils.d.ts +15 -0
  16. package/dist/GridColorUtils.d.ts.map +1 -1
  17. package/dist/GridColorUtils.js +117 -1
  18. package/dist/GridColorUtils.js.map +1 -1
  19. package/dist/GridMetricCalculator.d.ts.map +1 -1
  20. package/dist/GridMetricCalculator.js +9 -2
  21. package/dist/GridMetricCalculator.js.map +1 -1
  22. package/dist/GridModel.d.ts +2 -0
  23. package/dist/GridModel.d.ts.map +1 -1
  24. package/dist/GridModel.js +3 -0
  25. package/dist/GridModel.js.map +1 -1
  26. package/dist/GridRenderer.d.ts +8 -34
  27. package/dist/GridRenderer.d.ts.map +1 -1
  28. package/dist/GridRenderer.js +29 -294
  29. package/dist/GridRenderer.js.map +1 -1
  30. package/dist/GridRendererTypes.d.ts +1 -0
  31. package/dist/GridRendererTypes.d.ts.map +1 -1
  32. package/dist/GridRendererTypes.js +2 -1
  33. package/dist/GridRendererTypes.js.map +1 -1
  34. package/dist/GridTheme.d.ts +4 -0
  35. package/dist/GridTheme.d.ts.map +1 -1
  36. package/dist/GridTheme.js +6 -1
  37. package/dist/GridTheme.js.map +1 -1
  38. package/dist/GridUtils.d.ts +16 -0
  39. package/dist/GridUtils.d.ts.map +1 -1
  40. package/dist/GridUtils.js +60 -1
  41. package/dist/GridUtils.js.map +1 -1
  42. package/dist/MockDataBarGridModel.d.ts +29 -0
  43. package/dist/MockDataBarGridModel.d.ts.map +1 -0
  44. package/dist/MockDataBarGridModel.js +119 -0
  45. package/dist/MockDataBarGridModel.js.map +1 -0
  46. package/dist/TextCellRenderer.d.ts +23 -0
  47. package/dist/TextCellRenderer.d.ts.map +1 -0
  48. package/dist/TextCellRenderer.js +210 -0
  49. package/dist/TextCellRenderer.js.map +1 -0
  50. package/dist/TokenBoxCellRenderer.d.ts +10 -0
  51. package/dist/TokenBoxCellRenderer.d.ts.map +1 -0
  52. package/dist/TokenBoxCellRenderer.js +4 -0
  53. package/dist/TokenBoxCellRenderer.js.map +1 -0
  54. package/dist/index.d.ts +5 -0
  55. package/dist/index.d.ts.map +1 -1
  56. package/dist/index.js +4 -0
  57. package/dist/index.js.map +1 -1
  58. package/dist/mouse-handlers/GridTokenMouseHandler.d.ts.map +1 -1
  59. package/dist/mouse-handlers/GridTokenMouseHandler.js +20 -2
  60. package/dist/mouse-handlers/GridTokenMouseHandler.js.map +1 -1
  61. package/package.json +4 -4
@@ -1 +1 @@
1
- {"version":3,"file":"GridRenderer.js","names":["clamp","ColorUtils","EMPTY_ARRAY","getOrThrow","memoizeClear","GridUtils","GridColorUtils","isExpandableGridModel","isEditableGridModel","GridColumnSeparatorMouseHandler","GridRenderer","context","text","width","fontWidth","truncationChar","truncateToWidth","max","backgroundColors","maxDepth","split","map","color","colors","i","push","darkenForDepth","alpha","colorWithAlpha","isDark","truncatedText","tokens","_font","_baseline","textHeight","top","bottom","tokenBoxes","lastTokenEnd","currentTextWidth","length","token","start","end","value","substring","measureText","tokenWidth","left","right","newTokenBox","x1","y1","x2","y2","truncate","str","len","substr","binaryTruncateToWidth","undefined","charWidth","repeat","Math","floor","lo","hi","min","result","mid","ceil","truncatedStr","DEFAULT_FONT_WIDTH","drawCanvas","state","save","configureContext","drawBackground","drawGrid","drawHeaders","drawFooters","drawDraggingColumn","drawDraggingRow","drawScrollBars","restore","theme","font","textBaseline","lineCap","metrics","height","fillStyle","backgroundColor","fillRect","draggingRow","draggingColumn","gridX","gridY","translate","drawGridBackground","drawCellContents","drawFloatingRows","drawFloatingColumns","floatingTopRowCount","floatingBottomRowCount","floatingRows","rowCount","visibleColumns","allRowYs","allRowHeights","floatingRowBackgroundColors","drawRowStripesForRows","drawFloatingMouseRowHover","drawGridLinesForItems","floatingGridColumnColor","floatingGridRowColor","drawCellBackgroundsForItems","drawFloatingBorders","drawSelectedRanges","maxY","minY","c","column","r","row","drawCellContent","floatingLeftColumnCount","floatingRightColumnCount","floatingLeftWidth","floatingRightWidth","floatingColumns","maxX","columnCount","visibleRows","allColumnXs","allColumnWidths","beginPath","rect","clip","minX","floatingDividerOuterColor","floatingDividerInnerColor","lineWidth","strokeStyle","y","moveTo","lineTo","x","stroke","drawHover","drawRowStripes","drawMouseColumnHover","drawMouseRowHover","drawGridLines","drawCellBackgrounds","has","rowBackgroundColors","rows","model","shadowBlur","shadowColor","colorSets","getCachedBackgroundColors","colorRowMap","Map","topShadowRows","bottomShadowRows","addRowToColorMap","rowAbove","depth","depthForRow","colorSet","set","get","depthAbove","forEach","colorRows","rowHeight","fill","startColor","getCachedColorWithAlpha","endColor","gradient","createLinearGradient","addColorStop","gradientY","mouseX","mouseY","mouseColumn","getColumnAtX","columnHoverBackgroundColor","columnWidth","rowHoverBackgroundColor","mouseRow","getRowAtY","drawMouseRowHoverForRow","rowFooterWidth","selectedRanges","startRow","endRow","selectedRowHoverBackgroundColor","gridColumnColor","gridRowColor","columns","columnColor","rowColor","drawGridLinesForColumns","drawGridLinesForRows","metricsMaxX","j","rowAfter","drawCellBackground","firstColumn","modelColumns","modelRows","modelRow","modelColumn","backgroundColorForCell","isFirstColumn","hasExpandableRows","drawCellRowTreeDepthLines","drawColumnCellContents","getTextRenderMetrics","cellHorizontalPadding","treeDepthIndent","treeHorizontalPadding","textAlign","textAlignForCell","treeIndent","textWidth","textX","textY","textOverride","fontWidths","textColor","textForCell","truncationCharForCell","colorForCell","getCachedTruncatedString","tokensForCell","tokenIndex","textStart","actualBoundingBoxDescent","nextToken","textEnd","widthOfUnderline","endsWith","hyperlinkColor","fillText","drawCellRowTreeMarker","visibleRowTreeBoxes","treeMarkerColor","treeMarkerHoverColor","columnX","rowY","isRowExpandable","treeBox","drawTreeMarker","isRowExpanded","isExpanded","markerText","treeLineColor","depthRowAfter","depthDiff","lineX","headerFont","drawColumnHeaders","drawRowHeaders","drawRowFooters","draggingColumnSeparator","isDragging","columnHeaderHeight","columnHeaderMaxDepth","headerHiddenSeparatorSize","headerHiddenSeparatorHoverColor","headerSeparatorColor","headerSeparatorHoverColor","hiddenSeparatorHeight","hiddenY","containsFrozenColumns","drawColumnHeadersForRange","hiddenColumns","entries","filter","_","w","index","highlightedSeparator","separator","getColumnSeparator","getGridPointFromXY","shouldDrawSeparator","columnIndex","nextColumnIndex","textForColumnHeader","visibleColumnIndex","indexOf","nextColumn","nextColumnWidth","isColumnHidden","isNextColumnHidden","range","bounds","d","drawColumnHeadersAtDepth","userColumnWidths","movedColumns","visibleWidth","startIndex","endIndex","drawColumnHeader","drawColumnHeaderAtIndex","columnGroupName","columnGroupColor","colorForColumnHeader","columnGroupLeft","columnGroupRight","prevColumnIndex","prevModelIndex","getModelIndex","prevColumnWidth","nextModelIndex","isFullWidth","columnText","style","headerHorizontalPadding","headerBackgroundColor","headerColor","black","white","maxWidth","maxLength","separatorColor","isDarkBackground","getCachedColorIsDark","isDarkText","renderText","columnLeft","visibleLeft","columnRight","visibleRight","isBeyondLeft","isBeyondRight","draggingRowSeparator","rowHeaderWidth","hiddenSeparatorWidth","hiddenX","hiddenRows","isPreviousRowHidden","getRowSeparatorIndex","visibleRowIndex","nextRow","nextRowHeight","isRowHidden","isNextRowHidden","drawRowHeader","textForRowHeader","verticalBarWidth","textForRowFooter","viewport","cursorColumn","cursorRow","editingCell","isCursorVisible","isEditable","h","selectedRange","startColumn","endColumn","round","endX","endY","selectionColor","selectionOutlineCasingColor","selectionOutlineColor","drawActiveCell","borderWidth","ACTIVE_CELL_BORDER_WIDTH","cellX","cellY","cellW","cellH","drawRoundedRect","DEFAULT_EDGE_RADIUS","quadraticCurveTo","closePath","draggingColumnVisibleRange","draggingColumnDepth","draggingModelIndex","draggingGroup","getColumnHeaderGroup","originalLeft","originalRight","originalWidth","draggingLeft","reorderOffset","columnHeaderOffset","draggingRowOffset","isDraggingHorizontalScrollBar","isDraggingVerticalScrollBar","scrollBarSize","handleHeight","handleWidth","scrollX","scrollY","hasHorizontalBar","hasVerticalBar","barWidth","barHeight","barLeft","barTop","scrollBarBackgroundColor","scrollBarHoverBackgroundColor","scrollBarCasingColor","scrollBarCornerColor","scrollBarColor","scrollBarHoverColor","scrollBarActiveColor","scrollBarHoverSize","scrollBarCasingWidth","scrollBarSelectionTick","scrollBarSelectionTickColor","scrollBarActiveSelectionTickColor","autoSelectRow","autoSelectColumn","isInbounds","isVerticalBarHover","isHorizontalBarHover","hScrollBarSize","vScrollBarSize","lastLeft","filteredRanges","sortedRanges","sort","compareRanges","mergedRanges","mergeSortedRanges","getTickX","tickX","tickWidth","trackHeight","lastTop","getTickY","tickY","trackWidth","tickHeight","getTokenBoxesForVisibleCell","actualBoundingBoxAscent","cachedTokenBoxes","getCachedTokenBoxesForVisibleCell","tokenBox"],"sources":["../src/GridRenderer.ts"],"sourcesContent":["import clamp from 'lodash.clamp';\nimport { ColorUtils, EMPTY_ARRAY, getOrThrow } from '@deephaven/utils';\nimport memoizeClear from './memoizeClear';\nimport GridUtils, { Token, TokenBox } from './GridUtils';\nimport GridColorUtils from './GridColorUtils';\nimport { isExpandableGridModel } from './ExpandableGridModel';\nimport { GridColor, GridColorWay, NullableGridColor } from './GridTheme';\nimport { BoxCoordinates, Coordinate, VisibleIndex } from './GridMetrics';\nimport { isEditableGridModel } from './EditableGridModel';\nimport GridColumnSeparatorMouseHandler from './mouse-handlers/GridColumnSeparatorMouseHandler';\nimport { BoundedAxisRange } from './GridAxisRange';\nimport { GridRenderState } from './GridRendererTypes';\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 font width in pixels if it cannot be retrieved from the context\n static DEFAULT_FONT_WIDTH = 10;\n\n // Default radius in pixels for corners for some elements (like the active cell)\n static DEFAULT_EDGE_RADIUS = 2;\n\n // Default width in pixels for the border of the active cell\n static ACTIVE_CELL_BORDER_WIDTH = 2;\n\n /**\n * Truncate a string to the specified length and add ellipses if necessary\n * @param str The string to truncate\n * @param len The length to truncate the string to. If longer than the actual string, just returns the string\n * @returns The truncated string\n */\n static truncate(str: string, len: number): string {\n if (len < str.length) {\n // eslint-disable-next-line prefer-template\n return str.substr(0, len) + '…';\n }\n return str;\n }\n\n /**\n * Uses binary search to truncate a string to fit in the provided width\n * @param context The drawing context to measure the text in\n * @param str The string to get the maximum length it can draw\n * @param width The width to truncate it to\n * @param start The low boundary to start the search\n * @param end The high boundary to start the search\n * @param truncationChar This char will be repeated as the display string if the string is truncated instead of just adding an ellipsis\n * @returns The truncated string\n */\n static binaryTruncateToWidth(\n context: CanvasRenderingContext2D,\n str: string,\n width: number,\n start = 0,\n end = str.length,\n truncationChar?: string\n ): string {\n if (end >= str.length && context.measureText(str).width <= width) {\n // IDS-6069 If the whole string can fit, don't bother checking for truncation\n // The ellipses are actually slightly wider than other chars, and it's possible\n // that the \"truncation\" ends up being slightly longer, which messes up the search\n // algorithm below.\n // Besides, if we already fit, it's just faster to not bother checking other truncations.\n return str;\n }\n\n if (truncationChar !== undefined) {\n const charWidth = context.measureText(truncationChar).width;\n return truncationChar.repeat(Math.max(1, Math.floor(width / charWidth)));\n }\n\n let lo = start;\n let hi = Math.min(str.length - 1, end);\n let result = str;\n while (hi >= lo) {\n const mid = Math.ceil((hi + lo) / 2);\n const truncatedStr = GridRenderer.truncate(str, mid);\n if (context.measureText(truncatedStr).width <= width) {\n result = truncatedStr;\n if (lo === mid) {\n break;\n }\n lo = mid;\n } else if (mid === 0) {\n // We already truncated to zero chars and it still doesn't fit, no need to keep looking\n result = truncatedStr;\n break;\n } else {\n hi = mid - 1;\n }\n }\n\n return result;\n }\n\n /**\n * Truncate a string (if necessary) to fit in the specified width.\n * First uses the estimated font width to calculate a lower/upper bound\n * Then uses binary search within those bounds to find the exact max length\n * @param context The drawing context\n * @param str The string to calculate max length for\n * @param width The width to truncate within\n * @param fontWidth The estimated width of each character\n * @param truncationChar This char will be repeated as the display string if the string is truncated instead of just adding an ellipsis\n * @returns The truncated string that fits within the width provided\n */\n static truncateToWidth(\n context: CanvasRenderingContext2D,\n str: string,\n width: number,\n fontWidth = GridRenderer.DEFAULT_FONT_WIDTH,\n truncationChar?: string\n ): string {\n if (width <= 0 || str.length <= 0) {\n return '';\n }\n\n // Estimate the possible low and high boundaries for truncating the text\n // Use the width of the space divided by the estimated width of each character,\n // and take half that as the low (minus 5 just to be extra safe), and double that as the high.\n const lo = Math.min(\n Math.max(0, Math.floor(width / fontWidth / 2) - 5),\n str.length\n );\n const hi = Math.min(Math.ceil((width / fontWidth) * 2), str.length);\n\n return GridRenderer.binaryTruncateToWidth(\n context,\n str,\n width,\n lo,\n hi,\n truncationChar\n );\n }\n\n /**\n * Draw the grid canvas with the state provided\n * @param state The state of the grid\n */\n drawCanvas(state: GridRenderState): void {\n const { context } = state;\n\n context.save();\n\n this.configureContext(context, state);\n\n this.drawBackground(context, state);\n\n this.drawGrid(context, state);\n\n this.drawHeaders(context, state);\n\n this.drawFooters(context, state);\n\n this.drawDraggingColumn(context, state);\n\n this.drawDraggingRow(context, state);\n\n this.drawScrollBars(context, state);\n\n context.restore();\n }\n\n configureContext(\n context: CanvasRenderingContext2D,\n state: GridRenderState\n ): void {\n const { theme } = state;\n context.font = theme.font;\n context.textBaseline = 'middle';\n context.lineCap = 'butt';\n }\n\n drawBackground(\n context: CanvasRenderingContext2D,\n state: GridRenderState\n ): void {\n const { theme, metrics } = state;\n const { width, height } = metrics;\n context.fillStyle = theme.backgroundColor;\n context.fillRect(0, 0, width, height);\n }\n\n drawGrid(context: CanvasRenderingContext2D, state: GridRenderState): void {\n const { metrics, draggingRow, draggingColumn } = state;\n const { gridX, gridY } = metrics;\n\n context.translate(gridX, gridY);\n\n this.drawGridBackground(\n context,\n state,\n draggingRow == null && draggingColumn == null\n );\n\n this.drawCellContents(context, state);\n\n this.drawFloatingRows(context, state);\n\n this.drawFloatingColumns(context, state);\n\n context.translate(-gridX, -gridY);\n }\n\n drawFloatingRows(\n context: CanvasRenderingContext2D,\n state: GridRenderState\n ): void {\n const { draggingRow, draggingColumn, metrics, theme } = state;\n const {\n floatingTopRowCount,\n floatingBottomRowCount,\n floatingRows,\n rowCount,\n visibleColumns,\n 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 visibleColumns,\n floatingRows,\n theme.floatingGridColumnColor,\n theme.floatingGridRowColor\n );\n\n this.drawCellBackgroundsForItems(\n context,\n state,\n visibleColumns,\n floatingRows\n );\n\n this.drawFloatingBorders(context, state);\n\n // Draw the floating row selection...\n if (floatingTopRowCount > 0) {\n this.drawSelectedRanges(context, state, {\n top: 0,\n bottom: floatingTopRowCount - 1,\n maxY:\n getOrThrow(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 < visibleColumns.length; c += 1) {\n const column = visibleColumns[c];\n for (let r = 0; r < floatingRows.length; r += 1) {\n const row = floatingRows[r];\n this.drawCellContent(context, state, column, row);\n }\n }\n }\n\n drawFloatingColumns(\n context: CanvasRenderingContext2D,\n state: GridRenderState\n ): void {\n const { draggingRow, draggingColumn, metrics, theme } = state;\n const {\n floatingLeftColumnCount,\n floatingRightColumnCount,\n floatingLeftWidth,\n floatingRightWidth,\n floatingColumns,\n gridX,\n maxX,\n columnCount,\n visibleRows,\n 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 } = theme;\n\n const colorSets = this.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 = this.getCachedColorWithAlpha(shadowColor, 0.15);\n const endColor = this.getCachedColorWithAlpha(shadowColor, 0);\n const gradient = context.createLinearGradient(0, 0, 0, shadowBlur);\n gradient.addColorStop(0, startColor);\n gradient.addColorStop(1, endColor);\n context.fillStyle = gradient;\n\n for (let i = 0; i < topShadowRows.length; i += 1) {\n const row = topShadowRows[i];\n const y = getOrThrow(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 = this.getCachedColorWithAlpha(shadowColor, 0);\n const endColor = this.getCachedColorWithAlpha(shadowColor, 0.15);\n const gradient = context.createLinearGradient(0, 0, 0, shadowBlur);\n gradient.addColorStop(0, startColor);\n gradient.addColorStop(1, endColor);\n context.fillStyle = gradient;\n\n for (let i = 0; i < bottomShadowRows.length; i += 1) {\n const row = bottomShadowRows[i];\n const y = getOrThrow(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 { visibleColumns, visibleRows } = metrics;\n\n this.drawGridLinesForItems(\n context,\n state,\n visibleColumns,\n visibleRows,\n theme.gridColumnColor,\n theme.gridRowColor\n );\n }\n\n drawGridLinesForItems(\n context: CanvasRenderingContext2D,\n state: GridRenderState,\n columns: 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 { visibleColumns, visibleRows } = metrics;\n this.drawCellBackgroundsForItems(\n context,\n state,\n visibleColumns,\n visibleRows\n );\n }\n\n drawCellBackgroundsForItems(\n context: CanvasRenderingContext2D,\n state: GridRenderState,\n columns: 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 { visibleColumns } = metrics;\n\n for (let i = 0; i < visibleColumns.length; i += 1) {\n const column = visibleColumns[i];\n this.drawColumnCellContents(context, state, column);\n }\n }\n\n drawColumnCellContents(\n context: CanvasRenderingContext2D,\n state: GridRenderState,\n column: VisibleIndex\n ): void {\n const { metrics } = state;\n const { 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 /**\n * Gets textWidth and X-Y position for a specific cell\n * The textWidth returned is the width that the text can occupy accounting for any other cell markings\n * The width accounts for tree table indents and cell padding, so it is the width the text may consume\n *\n * @param state GridRenderState to get the text metrics for\n * @param column Column of cell to get text metrics for\n * @param row Row of cell to get text metrics for\n * @returns Object with width, x, and y of the text\n */\n getTextRenderMetrics(\n state: GridRenderState,\n column: VisibleIndex,\n row: VisibleIndex\n ): {\n width: number;\n x: number;\n y: number;\n } {\n const { metrics, model, theme } = state;\n const {\n firstColumn,\n allColumnXs,\n allColumnWidths,\n allRowYs,\n allRowHeights,\n modelRows,\n modelColumns,\n } = metrics;\n const {\n cellHorizontalPadding,\n treeDepthIndent,\n treeHorizontalPadding,\n } = theme;\n\n const modelRow = getOrThrow(modelRows, row);\n const modelColumn = getOrThrow(modelColumns, column);\n const textAlign = model.textAlignForCell(modelColumn, modelRow);\n const x = getOrThrow(allColumnXs, column);\n const y = getOrThrow(allRowYs, row);\n const columnWidth = getOrThrow(allColumnWidths, column);\n const rowHeight = getOrThrow(allRowHeights, row);\n const isFirstColumn = column === firstColumn;\n let treeIndent = 0;\n if (\n isExpandableGridModel(model) &&\n model.hasExpandableRows &&\n isFirstColumn\n ) {\n treeIndent =\n treeDepthIndent * (model.depthForRow(row) + 1) + treeHorizontalPadding;\n }\n const textWidth = columnWidth - treeIndent;\n let textX = x + cellHorizontalPadding;\n const textY = y + rowHeight * 0.5;\n if (textAlign === 'right') {\n textX = x + textWidth - cellHorizontalPadding;\n } else if (textAlign === 'center') {\n textX = x + textWidth * 0.5;\n }\n textX += treeIndent;\n\n return {\n width: textWidth - cellHorizontalPadding * 2,\n x: textX,\n y: textY,\n };\n }\n\n drawCellContent(\n context: CanvasRenderingContext2D,\n state: GridRenderState,\n column: VisibleIndex,\n row: VisibleIndex,\n textOverride?: string\n ): void {\n const { metrics, model, theme } = state;\n const {\n firstColumn,\n fontWidths,\n modelColumns,\n modelRows,\n allRowHeights,\n } = metrics;\n const { textColor } = theme;\n const rowHeight = getOrThrow(allRowHeights, row);\n const modelRow = getOrThrow(modelRows, row);\n const modelColumn = getOrThrow(modelColumns, column);\n const text = textOverride ?? model.textForCell(modelColumn, modelRow);\n const truncationChar = model.truncationCharForCell(modelColumn, modelRow);\n const isFirstColumn = column === firstColumn;\n\n if (text && rowHeight > 0) {\n const textAlign = model.textAlignForCell(modelColumn, modelRow) || 'left';\n context.textAlign = textAlign;\n\n const color =\n model.colorForCell(modelColumn, modelRow, theme) || textColor;\n context.fillStyle = color;\n\n context.save();\n\n const {\n width: textWidth,\n x: textX,\n y: textY,\n } = this.getTextRenderMetrics(state, column, row);\n\n const fontWidth =\n fontWidths.get(context.font) ?? GridRenderer.DEFAULT_FONT_WIDTH;\n const truncatedText = this.getCachedTruncatedString(\n context,\n text,\n textWidth,\n fontWidth,\n truncationChar\n );\n\n const tokens = model.tokensForCell(\n modelColumn,\n modelRow,\n truncatedText.length\n );\n\n if (truncatedText) {\n let tokenIndex = 0;\n let textStart = 0;\n let left = textX;\n const { actualBoundingBoxDescent } = context.measureText(truncatedText);\n\n while (textStart < truncatedText.length) {\n const nextToken = tokens[tokenIndex];\n const token = textStart === nextToken?.start ? nextToken : null;\n const textEnd =\n token?.end ?? nextToken?.start ?? truncatedText.length;\n const value = truncatedText.substring(textStart, textEnd);\n const { width } = context.measureText(value);\n const widthOfUnderline = value.endsWith('…')\n ? context.measureText(value.substring(0, value.length - 1)).width\n : width;\n\n // Set the styling based on the token, then draw the text\n if (token != null) {\n context.fillStyle = theme.hyperlinkColor;\n context.fillText(value, left, textY);\n context.fillRect(\n left,\n textY + actualBoundingBoxDescent,\n widthOfUnderline,\n 1\n );\n } else {\n context.fillStyle = color;\n context.fillText(value, left, textY);\n }\n\n left += width;\n textStart = textEnd;\n if (token != null) tokenIndex += 1;\n }\n }\n context.restore();\n }\n\n if (\n isFirstColumn &&\n isExpandableGridModel(model) &&\n model.hasExpandableRows\n ) {\n this.drawCellRowTreeMarker(context, state, row);\n }\n }\n\n drawCellRowTreeMarker(\n context: CanvasRenderingContext2D,\n state: GridRenderState,\n row: VisibleIndex\n ): void {\n const { metrics, model, mouseX, mouseY, theme } = state;\n const {\n firstColumn,\n gridX,\n gridY,\n allColumnXs,\n allColumnWidths,\n allRowYs,\n allRowHeights,\n visibleRowTreeBoxes,\n } = metrics;\n const { treeMarkerColor, treeMarkerHoverColor } = theme;\n const columnX = getOrThrow(allColumnXs, firstColumn);\n const columnWidth = getOrThrow(allColumnWidths, firstColumn);\n const rowY = getOrThrow(allRowYs, row);\n const rowHeight = getOrThrow(allRowHeights, row);\n if (!isExpandableGridModel(model) || !model.isRowExpandable(row)) {\n return;\n }\n\n const treeBox = getOrThrow(visibleRowTreeBoxes, row);\n const color =\n mouseX != null &&\n mouseY != null &&\n mouseX >= gridX + columnX &&\n mouseX <= gridX + columnX + columnWidth &&\n mouseY >= gridY + rowY &&\n mouseY <= gridY + rowY + rowHeight\n ? treeMarkerHoverColor\n : treeMarkerColor;\n\n this.drawTreeMarker(\n context,\n state,\n columnX,\n rowY,\n treeBox,\n color,\n model.isRowExpanded(row)\n );\n }\n\n drawTreeMarker(\n context: CanvasRenderingContext2D,\n state: GridRenderState,\n columnX: Coordinate,\n rowY: Coordinate,\n treeBox: BoxCoordinates,\n color: GridColor,\n isExpanded: boolean\n ): void {\n const { x1, y1, x2, y2 } = treeBox;\n const markerText = isExpanded ? '⊟' : '⊞';\n const textX = columnX + (x1 + x2) * 0.5 + 0.5;\n const textY = rowY + (y1 + y2) * 0.5 + 0.5;\n context.fillStyle = color;\n context.textAlign = 'center';\n context.fillText(markerText, textX, textY);\n }\n\n drawCellRowTreeDepthLines(\n context: CanvasRenderingContext2D,\n state: GridRenderState,\n row: VisibleIndex,\n rowAfter?: VisibleIndex\n ): void {\n const { metrics, model, theme } = state;\n\n if (!isExpandableGridModel(model)) return;\n\n const depth = model.depthForRow(row);\n if (depth === 0) return;\n\n const { 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 columnX +\n i * treeDepthIndent +\n treeDepthIndent * 0.5 +\n treeHorizontalPadding +\n 0.5;\n context.moveTo(lineX, rowY);\n context.lineTo(lineX, rowY + rowHeight);\n }\n context.stroke();\n }\n\n // draw as hockey stick if last row at depth\n if (depthDiff > 0) {\n context.beginPath();\n for (let i = depth - depthDiff; i < depth; i += 1) {\n const lineX =\n columnX +\n i * treeDepthIndent +\n treeDepthIndent * 0.5 +\n treeHorizontalPadding +\n 0.5;\n context.moveTo(lineX, rowY);\n context.lineTo(lineX, rowY + Math.ceil(rowHeight / 2));\n // extra moveTo prevents halfpixel in corner\n context.moveTo(lineX - 0.5, rowY + Math.ceil(rowHeight / 2) + 0.5);\n context.lineTo(\n lineX + treeDepthIndent - 0.5,\n rowY + Math.ceil(rowHeight / 2) + 0.5\n );\n }\n context.stroke();\n }\n }\n\n getCachedTruncatedString = memoizeClear(\n (\n context: CanvasRenderingContext2D,\n text: string,\n width: number,\n fontWidth: number,\n truncationChar?: string\n ): string =>\n GridRenderer.truncateToWidth(\n context,\n text,\n width,\n fontWidth,\n truncationChar\n ),\n { max: 10000 }\n );\n\n getCachedBackgroundColors = memoizeClear(\n (backgroundColors: GridColorWay, maxDepth: number): GridColor[][] =>\n backgroundColors.split(' ').map(color => {\n const colors = [];\n for (let i = 0; i < maxDepth; i += 1) {\n colors.push(GridColorUtils.darkenForDepth(color, i, maxDepth));\n }\n return colors;\n }),\n { max: 1000 }\n );\n\n getCachedColorWithAlpha = memoizeClear(\n (color: string, alpha: number) =>\n GridColorUtils.colorWithAlpha(color, alpha),\n { max: 1000 }\n );\n\n getCachedColorIsDark = memoizeClear(\n (color: string) => ColorUtils.isDark(color),\n { max: 1000 }\n );\n\n drawHeaders(context: CanvasRenderingContext2D, state: GridRenderState): void {\n const { theme } = state;\n\n context.font = theme.headerFont;\n\n this.drawColumnHeaders(context, state);\n\n this.drawRowHeaders(context, state);\n }\n\n drawFooters(context: CanvasRenderingContext2D, state: GridRenderState): void {\n const { theme } = state;\n\n context.font = theme.headerFont;\n\n this.drawRowFooters(context, state);\n }\n\n drawColumnHeaders(\n context: CanvasRenderingContext2D,\n state: GridRenderState\n ): void {\n const {\n mouseX,\n mouseY,\n theme,\n metrics,\n draggingColumnSeparator,\n isDragging,\n model,\n } = state;\n const {\n columnHeaderHeight,\n floatingColumns,\n gridX,\n width,\n visibleColumns,\n 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 if (columnIndex == null || nextColumnIndex == null) {\n shouldDrawSeparator = false;\n } else {\n shouldDrawSeparator =\n model.textForColumnHeader(columnIndex, depth) !==\n model.textForColumnHeader(nextColumnIndex, depth);\n }\n }\n\n if (\n shouldDrawSeparator &&\n highlightedSeparator != null &&\n depth != null &&\n (!isDragging || draggingColumnSeparator != null)\n ) {\n context.strokeStyle = headerSeparatorHoverColor;\n\n const columnX = getOrThrow(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 } = 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 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 { fontWidths, width } = metrics;\n const fontWidth =\n fontWidths.get(context.font) ?? GridRenderer.DEFAULT_FONT_WIDTH;\n\n const maxWidth = columnWidth - headerHorizontalPadding * 2;\n const maxLength = maxWidth / fontWidth;\n\n const {\n backgroundColor = headerBackgroundColor,\n separatorColor = headerSeparatorColor,\n } = style ?? {};\n\n let { textColor = headerColor } = style ?? {};\n\n try {\n const isDarkBackground = this.getCachedColorIsDark(backgroundColor);\n const isDarkText = this.getCachedColorIsDark(textColor);\n if (isDarkBackground && isDarkText) {\n textColor = white;\n } else if (!isDarkBackground && !isDarkText) {\n textColor = black;\n }\n } catch {\n // Invalid color provided\n // no-op since we don't use logging in base grid\n }\n\n let { minX = 0, maxX = width } = bounds ?? {};\n\n context.save();\n context.rect(minX, 0, maxX - minX, columnHeaderHeight);\n context.clip();\n\n // Fill background color if specified\n if (backgroundColor != null) {\n context.fillStyle = backgroundColor;\n context.fillRect(columnX, 0, columnWidth, columnHeaderHeight);\n }\n\n if (separatorColor != null) {\n context.strokeStyle = separatorColor;\n context.beginPath();\n\n // Don't draw left separator if column touches the left edge\n if (columnX > 0) {\n context.moveTo(columnX + 0.5, 0);\n context.lineTo(columnX + 0.5, columnHeaderHeight);\n }\n context.moveTo(columnX + columnWidth + 0.5, 0);\n context.lineTo(columnX + columnWidth + 0.5, columnHeaderHeight);\n\n // Bottom Border, should be interior to the header height\n context.moveTo(columnX, columnHeaderHeight - 0.5);\n context.lineTo(columnX + columnWidth, columnHeaderHeight - 0.5);\n context.stroke();\n }\n\n context.beginPath();\n context.rect(columnX, 0, columnWidth, columnHeaderHeight);\n context.clip();\n context.fillStyle = textColor;\n\n let renderText = columnText;\n\n if (maxLength <= 0) {\n renderText = '';\n } else if (renderText.length > maxLength) {\n renderText = `${renderText.substring(0, maxLength - 1)}…`;\n }\n\n const textWidth = renderText.length * fontWidth;\n let x = columnX + columnWidth * 0.5;\n const y = columnHeaderHeight * 0.5;\n minX += headerHorizontalPadding;\n maxX -= headerHorizontalPadding;\n\n const columnLeft = columnX + headerHorizontalPadding;\n const visibleLeft = clamp(columnLeft, minX, maxX);\n const columnRight = columnX + columnWidth - headerHorizontalPadding;\n const visibleRight = clamp(columnRight, minX, maxX);\n const visibleWidth = visibleRight - visibleLeft;\n\n const isBeyondLeft = x - textWidth * 0.5 < minX;\n const isBeyondRight = x + textWidth * 0.5 > maxX;\n\n if (isBeyondLeft) {\n // Column name would be off the left side of the canvas\n if (textWidth < visibleWidth) {\n // Can render the entire text in the visible space. Stick to left\n x = minX + textWidth * 0.5;\n } else {\n x = columnRight - textWidth * 0.5;\n }\n } else if (isBeyondRight) {\n if (textWidth < visibleWidth) {\n // Can render the entire text in the visible space. Stick to right\n x = maxX - textWidth * 0.5;\n } else {\n x = columnLeft + textWidth * 0.5;\n }\n }\n context.textAlign = 'center';\n context.fillText(renderText, x, y);\n\n context.restore();\n }\n\n drawRowHeaders(\n context: CanvasRenderingContext2D,\n state: GridRenderState\n ): void {\n const { mouseX, mouseY, metrics, theme, draggingRowSeparator } = state;\n const {\n gridY,\n rowHeaderWidth,\n height,\n visibleRows,\n 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 {\n mouseX,\n mouseY,\n metrics,\n model,\n theme,\n draggingRowSeparator,\n } = state;\n const {\n gridY,\n gridX,\n maxX,\n modelRows,\n rowFooterWidth,\n height,\n verticalBarWidth,\n visibleRows,\n 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 // draw the inner transparent fill\n context.fillStyle = theme.selectionColor;\n context.fill();\n\n /**\n * draw an \"inner stroke\" that's clipped to just inside of the rects\n * to act as a casing to the outer stroke. 3px width because 1px is outside\n * the rect (but clipped), 1px is \"on\" the rect (technically this pixel is\n * a half pixel clip as well due to rects offset, but we are immediately painting\n * over it), and then the 1px inside (which is the desired pixel).\n */\n context.save();\n context.clip();\n context.strokeStyle = theme.selectionOutlineCasingColor;\n context.lineWidth = 3;\n context.stroke();\n context.restore();\n\n // draw the outerstroke border on top of the inner stroke\n context.strokeStyle = theme.selectionOutlineColor;\n context.lineWidth = 1;\n context.stroke();\n }\n\n if (isCursorVisible && column != null && row != null) {\n context.restore();\n\n this.drawActiveCell(context, state, column, row);\n }\n }\n\n drawActiveCell(\n context: CanvasRenderingContext2D,\n state: GridRenderState,\n column: VisibleIndex,\n row: VisibleIndex,\n borderWidth = GridRenderer.ACTIVE_CELL_BORDER_WIDTH\n ): void {\n const { metrics, theme } = state;\n const { allColumnWidths, allColumnXs, allRowHeights, allRowYs } = metrics;\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) {\n w += x - 1;\n x = 1;\n }\n if (y <= 0) {\n h += y - 1;\n y = 1;\n }\n\n const { lineWidth } = context;\n context.beginPath();\n context.lineWidth = borderWidth;\n context.strokeStyle = theme.selectionOutlineColor;\n this.drawRoundedRect(context, x, y, w, h);\n context.stroke();\n context.lineWidth = lineWidth;\n }\n\n /**\n * Draws a rounded rectangle using the current state of the canvas.\n *\n * @param context The canvas context\n * @param x coordinate of the left side\n * @param y coordinate of the top side\n * @param w width of the rectangle\n * @param h height of the rectangle\n * @param r corner radius of the rectangle\n */\n drawRoundedRect(\n context: CanvasRenderingContext2D,\n x: Coordinate,\n y: Coordinate,\n w: number,\n h: number,\n r = GridRenderer.DEFAULT_EDGE_RADIUS\n ): void {\n context.beginPath();\n context.moveTo(x + r, y);\n context.lineTo(x + w - r, y);\n context.quadraticCurveTo(x + w, y, x + w, y + r);\n context.lineTo(x + w, y + h - r);\n context.quadraticCurveTo(x + w, y + h, x + w - r, y + h);\n context.lineTo(x + r, y + h);\n context.quadraticCurveTo(x, y + h, x, y + h - r);\n context.lineTo(x, y + r);\n context.quadraticCurveTo(x, y, x + r, y);\n context.closePath();\n }\n\n drawDraggingColumn(\n context: CanvasRenderingContext2D,\n state: GridRenderState\n ): void {\n const { draggingColumn, metrics, mouseX, theme, model } = state;\n if (draggingColumn == null || mouseX == null) {\n return;\n }\n\n const {\n range: draggingColumnVisibleRange,\n depth: draggingColumnDepth,\n } = draggingColumn;\n\n const {\n gridX,\n gridY,\n 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 context.translate(draggingLeft - originalLeft, 0);\n context.font = headerFont;\n\n const visibleColumns: VisibleIndex[] = [];\n for (\n let i = draggingColumn.range[0];\n i <= draggingColumn.range[1];\n i += 1\n ) {\n visibleColumns.push(i);\n }\n\n /**\n * This will not draw the header text properly, but extensions of Grid\n * may draw extra things in the header like sorts and filters\n */\n this.drawColumnHeaders(context, state);\n\n // Ensure the column header gets drawn\n this.drawColumnHeadersForRange(\n context,\n state,\n [visibleColumns[0], visibleColumns[visibleColumns.length - 1]],\n {\n minX: originalLeft,\n maxX: width,\n }\n );\n\n context.translate(0, gridY);\n context.font = font;\n\n this.drawGridBackground(context, state);\n\n for (let i = startIndex; i <= endIndex; i += 1) {\n this.drawColumnCellContents(context, state, i);\n }\n\n context.restore();\n }\n\n drawDraggingRow(\n context: CanvasRenderingContext2D,\n state: GridRenderState\n ): void {\n const { draggingRow, draggingRowOffset, metrics, mouseY, theme } = state;\n if (draggingRow == null || mouseY == null) {\n return;\n }\n\n const { gridX, gridY, 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 /**\n * Gets the token boxes that are visible in the cell\n * @param column The visible column\n * @param row The visible row\n * @param state The GridRenderState\n * @returns An array of TokenBox of visible tokens or empty array with coordinates relative to gridX and gridY\n */\n getTokenBoxesForVisibleCell(\n column: VisibleIndex,\n row: VisibleIndex,\n state: GridRenderState\n ): TokenBox[] {\n const { metrics, context, model, theme } = state;\n\n if (context == null || metrics == null) {\n return (EMPTY_ARRAY as unknown) as TokenBox[];\n }\n\n const { modelRows, modelColumns } = metrics;\n const modelRow = getOrThrow(modelRows, row);\n const modelColumn = getOrThrow(modelColumns, column);\n\n const text = model.textForCell(modelColumn, modelRow);\n const { width: textWidth, x: textX, y: textY } = this.getTextRenderMetrics(\n state,\n column,\n row\n );\n\n const { fontWidths } = metrics;\n\n // Set the font and baseline and change it back after\n context.save();\n this.configureContext(context, state);\n\n const fontWidth =\n fontWidths?.get(context.font) ?? GridRenderer.DEFAULT_FONT_WIDTH;\n const truncationChar = model.truncationCharForCell(modelColumn, modelRow);\n const truncatedText = this.getCachedTruncatedString(\n context,\n text,\n textWidth,\n fontWidth,\n truncationChar\n );\n\n const {\n actualBoundingBoxAscent,\n actualBoundingBoxDescent,\n } = context.measureText(truncatedText);\n const textHeight = actualBoundingBoxAscent + actualBoundingBoxDescent;\n\n const tokens = model.tokensForCell(\n modelColumn,\n modelRow,\n truncatedText.length\n );\n\n // Check if the truncated text contains a link\n if (tokens.length === 0) {\n context.restore();\n return (EMPTY_ARRAY as unknown) as TokenBox[];\n }\n\n const cachedTokenBoxes = this.getCachedTokenBoxesForVisibleCell(\n truncatedText,\n tokens,\n theme.font,\n 'middle',\n textHeight,\n context\n ).map(tokenBox => ({\n x1: tokenBox.x1 + textX,\n y1: tokenBox.y1 + (textY - actualBoundingBoxAscent),\n x2: tokenBox.x2 + textX,\n y2: tokenBox.y2 + (textY - actualBoundingBoxAscent),\n token: tokenBox.token,\n }));\n\n context.restore();\n\n return cachedTokenBoxes;\n }\n\n /**\n * Returns an array of token boxes with the coordinates relative to the top left corner of the text\n */\n getCachedTokenBoxesForVisibleCell = memoizeClear(\n (\n truncatedText: string,\n tokens: Token[],\n // _font and _baseline are passed in so value is re-calculated when they change\n // They should already be set on the `context`, so they are not used in this method\n _font: string,\n _baseline: CanvasTextBaseline,\n textHeight: number,\n context: CanvasRenderingContext2D\n ): TokenBox[] => {\n const top = 0;\n const bottom = textHeight;\n\n const tokenBoxes: TokenBox[] = [];\n\n // The index where the last token ended\n let lastTokenEnd = 0;\n // The width of the text preceding the current token\n let currentTextWidth = 0;\n // Loop through array and push them to array\n for (let i = 0; i < tokens.length; i += 1) {\n const token = tokens[i];\n const { start, end } = token;\n // The last token value is calculated based on the full text so the value needs to be truncated\n const value =\n end > truncatedText.length\n ? truncatedText.substring(start)\n : token.value;\n\n // Add the width of the text in between this token and the last token\n currentTextWidth += context.measureText(\n truncatedText.substring(lastTokenEnd, start)\n ).width;\n const tokenWidth = context.measureText(value).width;\n\n // Check if the x position is less than the grid x, then tokenWidth should be shifted by gridX - startX\n\n const left = currentTextWidth;\n const right = left + tokenWidth;\n\n const newTokenBox: TokenBox = {\n x1: left,\n y1: top,\n x2: right,\n y2: bottom,\n token,\n };\n\n tokenBoxes.push(newTokenBox);\n\n lastTokenEnd = end;\n currentTextWidth += tokenWidth;\n }\n\n return tokenBoxes;\n },\n { max: 10000 }\n );\n}\n\nexport default GridRenderer;\n"],"mappings":"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"}
1
+ {"version":3,"file":"GridRenderer.js","names":["clamp","ColorUtils","getOrThrow","memoizeClear","GridUtils","GridColorUtils","isExpandableGridModel","isEditableGridModel","GridColumnSeparatorMouseHandler","DEFAULT_FONT_WIDTH","DataBarCellRenderer","TextCellRenderer","GridRenderer","backgroundColors","maxDepth","split","map","color","colors","i","push","darkenForDepth","max","alpha","colorWithAlpha","isDark","truncate","str","len","length","substr","binaryTruncateToWidth","context","width","start","end","truncationChar","measureText","undefined","charWidth","repeat","Math","floor","lo","hi","min","result","mid","ceil","truncatedStr","truncateToWidth","fontWidth","drawCanvas","state","save","configureContext","drawBackground","drawGrid","drawHeaders","drawFooters","drawDraggingColumn","drawDraggingRow","drawScrollBars","restore","theme","font","textBaseline","lineCap","metrics","height","fillStyle","backgroundColor","fillRect","draggingRow","draggingColumn","gridX","gridY","translate","drawGridBackground","drawCellContents","drawFloatingRows","drawFloatingColumns","floatingTopRowCount","floatingBottomRowCount","floatingRows","rowCount","visibleColumns","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","shadowBlur","shadowColor","colorSets","getCachedBackgroundColors","colorRowMap","Map","topShadowRows","bottomShadowRows","addRowToColorMap","rowAbove","depth","depthForRow","colorSet","set","get","depthAbove","forEach","colorRows","rowHeight","fill","startColor","getCachedColorWithAlpha","endColor","gradient","createLinearGradient","addColorStop","gradientY","mouseX","mouseY","mouseColumn","getColumnAtX","columnHoverBackgroundColor","columnWidth","rowHoverBackgroundColor","mouseRow","getRowAtY","drawMouseRowHoverForRow","rowFooterWidth","selectedRanges","startRow","endRow","selectedRowHoverBackgroundColor","gridColumnColor","gridRowColor","columns","columnColor","rowColor","drawGridLinesForColumns","drawGridLinesForRows","metricsMaxX","j","rowAfter","drawCellBackground","firstColumn","modelColumns","modelRows","modelRow","modelColumn","backgroundColorForCell","isFirstColumn","hasExpandableRows","drawCellRowTreeDepthLines","drawColumnCellContents","renderType","renderTypeForCell","cellRenderer","getCellRenderer","dataBarCellRenderer","textCellRenderer","treeDepthIndent","treeHorizontalPadding","treeLineColor","columnX","rowY","depthRowAfter","depthDiff","lineX","headerFont","drawColumnHeaders","drawRowHeaders","drawRowFooters","draggingColumnSeparator","isDragging","columnHeaderHeight","columnHeaderMaxDepth","headerHiddenSeparatorSize","headerHiddenSeparatorHoverColor","headerSeparatorColor","headerSeparatorHoverColor","hiddenSeparatorHeight","hiddenY","containsFrozenColumns","drawColumnHeadersForRange","hiddenColumns","entries","filter","_","w","index","highlightedSeparator","separator","getColumnSeparator","getGridPointFromXY","shouldDrawSeparator","columnIndex","nextColumnIndex","textForColumnHeader","visibleColumnIndex","indexOf","nextColumn","nextColumnWidth","isColumnHidden","isNextColumnHidden","range","bounds","d","drawColumnHeadersAtDepth","userColumnWidths","movedColumns","visibleWidth","startIndex","endIndex","drawColumnHeader","drawColumnHeaderAtIndex","columnGroupName","columnGroupColor","colorForColumnHeader","columnGroupLeft","columnGroupRight","prevColumnIndex","prevModelIndex","getModelIndex","prevColumnWidth","nextModelIndex","isFullWidth","text","columnText","style","headerHorizontalPadding","headerBackgroundColor","headerColor","black","white","fontWidths","maxWidth","maxLength","separatorColor","textColor","isDarkBackground","getCachedColorIsDark","isDarkText","renderText","substring","textWidth","columnLeft","visibleLeft","columnRight","visibleRight","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","borderWidth","ACTIVE_CELL_BORDER_WIDTH","cellX","cellY","cellW","cellH","drawRoundedRect","DEFAULT_EDGE_RADIUS","quadraticCurveTo","closePath","draggingColumnVisibleRange","draggingColumnDepth","draggingModelIndex","draggingGroup","getColumnHeaderGroup","originalLeft","originalRight","originalWidth","draggingLeft","reorderOffset","columnHeaderOffset","draggingRowOffset","isDraggingHorizontalScrollBar","isDraggingVerticalScrollBar","scrollBarSize","handleHeight","handleWidth","scrollX","scrollY","hasHorizontalBar","hasVerticalBar","barWidth","barHeight","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"],"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 { GridColor, GridColorWay, NullableGridColor } from './GridTheme';\nimport { Coordinate, VisibleIndex } from './GridMetrics';\nimport { isEditableGridModel } from './EditableGridModel';\nimport GridColumnSeparatorMouseHandler from './mouse-handlers/GridColumnSeparatorMouseHandler';\nimport { BoundedAxisRange } from './GridAxisRange';\nimport { DEFAULT_FONT_WIDTH, GridRenderState } from './GridRendererTypes';\nimport CellRenderer, { CellRenderType } 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 // Default width in pixels for the border of the active cell\n static ACTIVE_CELL_BORDER_WIDTH = 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 fontWidth = DEFAULT_FONT_WIDTH,\n truncationChar?: string\n ): string {\n if (width <= 0 || str.length <= 0) {\n return '';\n }\n\n // Estimate the possible low and high boundaries for truncating the text\n // Use the width of the space divided by the estimated width of each character,\n // and take half that as the low (minus 5 just to be extra safe), and double that as the high.\n const lo = Math.min(\n Math.max(0, Math.floor(width / fontWidth / 2) - 5),\n str.length\n );\n const hi = Math.min(Math.ceil((width / fontWidth) * 2), str.length);\n\n return GridRenderer.binaryTruncateToWidth(\n context,\n str,\n width,\n lo,\n hi,\n truncationChar\n );\n }\n\n /**\n * Draw the grid canvas with the state provided\n * @param state The state of the grid\n */\n drawCanvas(state: GridRenderState): void {\n const { context } = state;\n\n context.save();\n\n this.configureContext(context, state);\n\n this.drawBackground(context, state);\n\n this.drawGrid(context, state);\n\n this.drawHeaders(context, state);\n\n this.drawFooters(context, state);\n\n this.drawDraggingColumn(context, state);\n\n this.drawDraggingRow(context, state);\n\n this.drawScrollBars(context, state);\n\n context.restore();\n }\n\n configureContext(\n context: CanvasRenderingContext2D,\n state: GridRenderState\n ): void {\n const { theme } = state;\n context.font = theme.font;\n context.textBaseline = 'middle';\n context.lineCap = 'butt';\n }\n\n drawBackground(\n context: CanvasRenderingContext2D,\n state: GridRenderState\n ): void {\n const { theme, metrics } = state;\n const { width, height } = metrics;\n context.fillStyle = theme.backgroundColor;\n context.fillRect(0, 0, width, height);\n }\n\n drawGrid(context: CanvasRenderingContext2D, state: GridRenderState): void {\n const { metrics, draggingRow, draggingColumn } = state;\n const { gridX, gridY } = metrics;\n\n context.translate(gridX, gridY);\n\n this.drawGridBackground(\n context,\n state,\n draggingRow == null && draggingColumn == null\n );\n\n this.drawCellContents(context, state);\n\n this.drawFloatingRows(context, state);\n\n this.drawFloatingColumns(context, state);\n\n context.translate(-gridX, -gridY);\n }\n\n drawFloatingRows(\n context: CanvasRenderingContext2D,\n state: GridRenderState\n ): void {\n const { draggingRow, draggingColumn, metrics, theme } = state;\n const {\n floatingTopRowCount,\n floatingBottomRowCount,\n floatingRows,\n rowCount,\n visibleColumns,\n 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 visibleColumns,\n floatingRows,\n theme.floatingGridColumnColor,\n theme.floatingGridRowColor\n );\n\n this.drawCellBackgroundsForItems(\n context,\n state,\n visibleColumns,\n floatingRows\n );\n\n this.drawFloatingBorders(context, state);\n\n // Draw the floating row selection...\n if (floatingTopRowCount > 0) {\n this.drawSelectedRanges(context, state, {\n top: 0,\n bottom: floatingTopRowCount - 1,\n maxY:\n getOrThrow(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 < visibleColumns.length; c += 1) {\n const column = visibleColumns[c];\n for (let r = 0; r < floatingRows.length; r += 1) {\n const row = floatingRows[r];\n this.drawCellContent(context, state, column, row);\n }\n }\n }\n\n drawFloatingColumns(\n context: CanvasRenderingContext2D,\n state: GridRenderState\n ): void {\n const { draggingRow, draggingColumn, metrics, theme } = state;\n const {\n floatingLeftColumnCount,\n floatingRightColumnCount,\n floatingLeftWidth,\n floatingRightWidth,\n floatingColumns,\n gridX,\n maxX,\n columnCount,\n visibleRows,\n 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 } = theme;\n\n const colorSets = this.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 = this.getCachedColorWithAlpha(shadowColor, 0.15);\n const endColor = this.getCachedColorWithAlpha(shadowColor, 0);\n const gradient = context.createLinearGradient(0, 0, 0, shadowBlur);\n gradient.addColorStop(0, startColor);\n gradient.addColorStop(1, endColor);\n context.fillStyle = gradient;\n\n for (let i = 0; i < topShadowRows.length; i += 1) {\n const row = topShadowRows[i];\n const y = getOrThrow(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 = this.getCachedColorWithAlpha(shadowColor, 0);\n const endColor = this.getCachedColorWithAlpha(shadowColor, 0.15);\n const gradient = context.createLinearGradient(0, 0, 0, shadowBlur);\n gradient.addColorStop(0, startColor);\n gradient.addColorStop(1, endColor);\n context.fillStyle = gradient;\n\n for (let i = 0; i < bottomShadowRows.length; i += 1) {\n const row = bottomShadowRows[i];\n const y = getOrThrow(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 { visibleColumns, visibleRows } = metrics;\n\n this.drawGridLinesForItems(\n context,\n state,\n visibleColumns,\n visibleRows,\n theme.gridColumnColor,\n theme.gridRowColor\n );\n }\n\n drawGridLinesForItems(\n context: CanvasRenderingContext2D,\n state: GridRenderState,\n columns: 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 { visibleColumns, visibleRows } = metrics;\n this.drawCellBackgroundsForItems(\n context,\n state,\n visibleColumns,\n visibleRows\n );\n }\n\n drawCellBackgroundsForItems(\n context: CanvasRenderingContext2D,\n state: GridRenderState,\n columns: 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 { visibleColumns } = metrics;\n\n for (let i = 0; i < visibleColumns.length; i += 1) {\n const column = visibleColumns[i];\n this.drawColumnCellContents(context, state, column);\n }\n }\n\n drawColumnCellContents(\n context: CanvasRenderingContext2D,\n state: GridRenderState,\n column: VisibleIndex\n ): void {\n const { metrics } = state;\n const { 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 columnX +\n i * treeDepthIndent +\n treeDepthIndent * 0.5 +\n treeHorizontalPadding +\n 0.5;\n context.moveTo(lineX, rowY);\n context.lineTo(lineX, rowY + rowHeight);\n }\n context.stroke();\n }\n\n // draw as hockey stick if last row at depth\n if (depthDiff > 0) {\n context.beginPath();\n for (let i = depth - depthDiff; i < depth; i += 1) {\n const lineX =\n columnX +\n i * treeDepthIndent +\n treeDepthIndent * 0.5 +\n treeHorizontalPadding +\n 0.5;\n context.moveTo(lineX, rowY);\n context.lineTo(lineX, rowY + Math.ceil(rowHeight / 2));\n // extra moveTo prevents halfpixel in corner\n context.moveTo(lineX - 0.5, rowY + Math.ceil(rowHeight / 2) + 0.5);\n context.lineTo(\n lineX + treeDepthIndent - 0.5,\n rowY + Math.ceil(rowHeight / 2) + 0.5\n );\n }\n context.stroke();\n }\n }\n\n getCachedBackgroundColors = memoizeClear(\n (backgroundColors: GridColorWay, maxDepth: number): GridColor[][] =>\n backgroundColors.split(' ').map(color => {\n const colors = [];\n for (let i = 0; i < maxDepth; i += 1) {\n colors.push(GridColorUtils.darkenForDepth(color, i, maxDepth));\n }\n return colors;\n }),\n { max: 1000 }\n );\n\n getCachedColorWithAlpha = memoizeClear(\n (color: string, alpha: number) =>\n GridColorUtils.colorWithAlpha(color, alpha),\n { max: 1000 }\n );\n\n getCachedColorIsDark = memoizeClear(\n (color: string) => ColorUtils.isDark(color),\n { max: 1000 }\n );\n\n drawHeaders(context: CanvasRenderingContext2D, state: GridRenderState): void {\n const { theme } = state;\n\n context.font = theme.headerFont;\n\n this.drawColumnHeaders(context, state);\n\n this.drawRowHeaders(context, state);\n }\n\n drawFooters(context: CanvasRenderingContext2D, state: GridRenderState): void {\n const { theme } = state;\n\n context.font = theme.headerFont;\n\n this.drawRowFooters(context, state);\n }\n\n drawColumnHeaders(\n context: CanvasRenderingContext2D,\n state: GridRenderState\n ): void {\n const {\n mouseX,\n mouseY,\n theme,\n metrics,\n draggingColumnSeparator,\n isDragging,\n model,\n } = state;\n const {\n columnHeaderHeight,\n floatingColumns,\n gridX,\n width,\n visibleColumns,\n 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 if (columnIndex == null || nextColumnIndex == null) {\n shouldDrawSeparator = false;\n } else {\n shouldDrawSeparator =\n model.textForColumnHeader(columnIndex, depth) !==\n model.textForColumnHeader(nextColumnIndex, depth);\n }\n }\n\n if (\n shouldDrawSeparator &&\n highlightedSeparator != null &&\n depth != null &&\n (!isDragging || draggingColumnSeparator != null)\n ) {\n context.strokeStyle = headerSeparatorHoverColor;\n\n const columnX = getOrThrow(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 } = 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 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 { fontWidths, width } = metrics;\n const fontWidth = fontWidths.get(context.font) ?? DEFAULT_FONT_WIDTH;\n\n const maxWidth = columnWidth - headerHorizontalPadding * 2;\n const maxLength = maxWidth / fontWidth;\n\n const {\n backgroundColor = headerBackgroundColor,\n separatorColor = headerSeparatorColor,\n } = style ?? {};\n\n let { textColor = headerColor } = style ?? {};\n\n try {\n const isDarkBackground = this.getCachedColorIsDark(backgroundColor);\n const isDarkText = this.getCachedColorIsDark(textColor);\n if (isDarkBackground && isDarkText) {\n textColor = white;\n } else if (!isDarkBackground && !isDarkText) {\n textColor = black;\n }\n } catch {\n // Invalid color provided\n // no-op since we don't use logging in base grid\n }\n\n let { minX = 0, maxX = width } = bounds ?? {};\n\n context.save();\n context.rect(minX, 0, maxX - minX, columnHeaderHeight);\n context.clip();\n\n // Fill background color if specified\n if (backgroundColor != null) {\n context.fillStyle = backgroundColor;\n context.fillRect(columnX, 0, columnWidth, columnHeaderHeight);\n }\n\n if (separatorColor != null) {\n context.strokeStyle = separatorColor;\n context.beginPath();\n\n // Don't draw left separator if column touches the left edge\n if (columnX > 0) {\n context.moveTo(columnX + 0.5, 0);\n context.lineTo(columnX + 0.5, columnHeaderHeight);\n }\n context.moveTo(columnX + columnWidth + 0.5, 0);\n context.lineTo(columnX + columnWidth + 0.5, columnHeaderHeight);\n\n // Bottom Border, should be interior to the header height\n context.moveTo(columnX, columnHeaderHeight - 0.5);\n context.lineTo(columnX + columnWidth, columnHeaderHeight - 0.5);\n context.stroke();\n }\n\n context.beginPath();\n context.rect(columnX, 0, columnWidth, columnHeaderHeight);\n context.clip();\n context.fillStyle = textColor;\n\n let renderText = columnText;\n\n if (maxLength <= 0) {\n renderText = '';\n } else if (renderText.length > maxLength) {\n renderText = `${renderText.substring(0, maxLength - 1)}…`;\n }\n\n const textWidth = renderText.length * fontWidth;\n let x = columnX + columnWidth * 0.5;\n const y = columnHeaderHeight * 0.5;\n minX += headerHorizontalPadding;\n maxX -= headerHorizontalPadding;\n\n const columnLeft = columnX + headerHorizontalPadding;\n const visibleLeft = clamp(columnLeft, minX, maxX);\n const columnRight = columnX + columnWidth - headerHorizontalPadding;\n const visibleRight = clamp(columnRight, minX, maxX);\n const visibleWidth = visibleRight - visibleLeft;\n\n const isBeyondLeft = x - textWidth * 0.5 < minX;\n const isBeyondRight = x + textWidth * 0.5 > maxX;\n\n if (isBeyondLeft) {\n // Column name would be off the left side of the canvas\n if (textWidth < visibleWidth) {\n // Can render the entire text in the visible space. Stick to left\n x = minX + textWidth * 0.5;\n } else {\n x = columnRight - textWidth * 0.5;\n }\n } else if (isBeyondRight) {\n if (textWidth < visibleWidth) {\n // Can render the entire text in the visible space. Stick to right\n x = maxX - textWidth * 0.5;\n } else {\n x = columnLeft + textWidth * 0.5;\n }\n }\n context.textAlign = 'center';\n context.fillText(renderText, x, y);\n\n context.restore();\n }\n\n drawRowHeaders(\n context: CanvasRenderingContext2D,\n state: GridRenderState\n ): void {\n const { mouseX, mouseY, metrics, theme, draggingRowSeparator } = state;\n const {\n gridY,\n rowHeaderWidth,\n height,\n visibleRows,\n 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 {\n mouseX,\n mouseY,\n metrics,\n model,\n theme,\n draggingRowSeparator,\n } = state;\n const {\n gridY,\n gridX,\n maxX,\n modelRows,\n rowFooterWidth,\n height,\n verticalBarWidth,\n visibleRows,\n 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 // draw the inner transparent fill\n context.fillStyle = theme.selectionColor;\n context.fill();\n\n /**\n * draw an \"inner stroke\" that's clipped to just inside of the rects\n * to act as a casing to the outer stroke. 3px width because 1px is outside\n * the rect (but clipped), 1px is \"on\" the rect (technically this pixel is\n * a half pixel clip as well due to rects offset, but we are immediately painting\n * over it), and then the 1px inside (which is the desired pixel).\n */\n context.save();\n context.clip();\n context.strokeStyle = theme.selectionOutlineCasingColor;\n context.lineWidth = 3;\n context.stroke();\n context.restore();\n\n // draw the outerstroke border on top of the inner stroke\n context.strokeStyle = theme.selectionOutlineColor;\n context.lineWidth = 1;\n context.stroke();\n }\n\n if (isCursorVisible && column != null && row != null) {\n context.restore();\n\n this.drawActiveCell(context, state, column, row);\n }\n }\n\n drawActiveCell(\n context: CanvasRenderingContext2D,\n state: GridRenderState,\n column: VisibleIndex,\n row: VisibleIndex,\n borderWidth = GridRenderer.ACTIVE_CELL_BORDER_WIDTH\n ): void {\n const { metrics, theme } = state;\n const { allColumnWidths, allColumnXs, allRowHeights, allRowYs } = metrics;\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) {\n w += x - 1;\n x = 1;\n }\n if (y <= 0) {\n h += y - 1;\n y = 1;\n }\n\n const { lineWidth } = context;\n context.beginPath();\n context.lineWidth = borderWidth;\n context.strokeStyle = theme.selectionOutlineColor;\n this.drawRoundedRect(context, x, y, w, h);\n context.stroke();\n context.lineWidth = lineWidth;\n }\n\n /**\n * Draws a rounded rectangle using the current state of the canvas.\n *\n * @param context The canvas context\n * @param x coordinate of the left side\n * @param y coordinate of the top side\n * @param w width of the rectangle\n * @param h height of the rectangle\n * @param r corner radius of the rectangle\n */\n drawRoundedRect(\n context: CanvasRenderingContext2D,\n x: Coordinate,\n y: Coordinate,\n w: number,\n h: number,\n r = GridRenderer.DEFAULT_EDGE_RADIUS\n ): void {\n context.beginPath();\n context.moveTo(x + r, y);\n context.lineTo(x + w - r, y);\n context.quadraticCurveTo(x + w, y, x + w, y + r);\n context.lineTo(x + w, y + h - r);\n context.quadraticCurveTo(x + w, y + h, x + w - r, y + h);\n context.lineTo(x + r, y + h);\n context.quadraticCurveTo(x, y + h, x, y + h - r);\n context.lineTo(x, y + r);\n context.quadraticCurveTo(x, y, x + r, y);\n context.closePath();\n }\n\n drawDraggingColumn(\n context: CanvasRenderingContext2D,\n state: GridRenderState\n ): void {\n const { draggingColumn, metrics, mouseX, theme, model } = state;\n if (draggingColumn == null || mouseX == null) {\n return;\n }\n\n const {\n range: draggingColumnVisibleRange,\n depth: draggingColumnDepth,\n } = draggingColumn;\n\n const {\n gridX,\n gridY,\n 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 context.translate(draggingLeft - originalLeft, 0);\n context.font = headerFont;\n\n const visibleColumns: VisibleIndex[] = [];\n for (\n let i = draggingColumn.range[0];\n i <= draggingColumn.range[1];\n i += 1\n ) {\n visibleColumns.push(i);\n }\n\n /**\n * This will not draw the header text properly, but extensions of Grid\n * may draw extra things in the header like sorts and filters\n */\n this.drawColumnHeaders(context, state);\n\n // Ensure the column header gets drawn\n this.drawColumnHeadersForRange(\n context,\n state,\n [visibleColumns[0], visibleColumns[visibleColumns.length - 1]],\n {\n minX: originalLeft,\n maxX: width,\n }\n );\n\n context.translate(0, gridY);\n context.font = font;\n\n this.drawGridBackground(context, state);\n\n for (let i = startIndex; i <= endIndex; i += 1) {\n this.drawColumnCellContents(context, state, i);\n }\n\n context.restore();\n }\n\n drawDraggingRow(\n context: CanvasRenderingContext2D,\n state: GridRenderState\n ): void {\n const { draggingRow, draggingRowOffset, metrics, mouseY, theme } = state;\n if (draggingRow == null || mouseY == null) {\n return;\n }\n\n const { gridX, gridY, 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\nexport default GridRenderer;\n"],"mappings":"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"}