@deephaven/grid 0.15.5-vite.12 → 0.15.6-vite.21

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.
@@ -251,10 +251,10 @@ export declare class GridRange {
251
251
  * If at the end of the entire range, return null
252
252
  * If outside of the range, returns the next cell closest within this range.
253
253
  *
254
- * @param {number} column The cursor column
255
- * @param {number} row The cursor row
256
- * @param {SELECTION_DIRECTION} direction The direction to go in
257
- * @returns {GridCell|null} The next cell in the direction specified, or `null` if at the end of the range
254
+ * @param column The cursor column
255
+ * @param row The cursor row
256
+ * @param direction The direction to go in
257
+ * @returns The next cell in the direction specified, or `null` if at the end of the range
258
258
  */
259
259
  nextCell(column: GridRangeIndex, row: GridRangeIndex, direction: SELECTION_DIRECTION): GridCell | null;
260
260
  /**
package/dist/GridRange.js CHANGED
@@ -666,10 +666,10 @@ export class GridRange {
666
666
  * If at the end of the entire range, return null
667
667
  * If outside of the range, returns the next cell closest within this range.
668
668
  *
669
- * @param {number} column The cursor column
670
- * @param {number} row The cursor row
671
- * @param {SELECTION_DIRECTION} direction The direction to go in
672
- * @returns {GridCell|null} The next cell in the direction specified, or `null` if at the end of the range
669
+ * @param column The cursor column
670
+ * @param row The cursor row
671
+ * @param direction The direction to go in
672
+ * @returns The next cell in the direction specified, or `null` if at the end of the range
673
673
  */
674
674
 
675
675
 
@@ -1 +1 @@
1
- {"version":3,"file":"GridRange.js","names":["SELECTION_DIRECTION","GridRange","normalize","startColumn","startRow","endColumn","endRow","left","top","right","bottom","makeNormalized","makeCell","column","row","makeColumn","makeRow","minOrNull","index1","index2","Math","min","maxOrNull","max","consolidate","ranges","result","slice","wasModified","i","length","range","j","other","contains","splice","touches","isAxisRangeTouching","start1","end1","start2","end2","rangeArraysEqual","ranges1","ranges2","equals","intersection","otherRange","subtractFromRange","subtractRange","subtract","push","subtractFromRanges","subtractRangesFromRanges","subtractRanges","isBounded","boundedRange","columnCount","rowCount","boundedRanges","map","r","offset","columnOffset","rowOffset","nextCell","direction","DOWN","rangeIndex","findIndex","containsCell","RIGHT","nextRangeIndex","nextRange","startCell","LEFT","UP","Error","cellCount","reduce","NaN","forEachCell","callback","forEach","constructor","c"],"sources":["../src/GridRange.ts"],"sourcesContent":["export type GridRangeIndex = number | null;\ntype LeftIndex = GridRangeIndex;\ntype RightIndex = GridRangeIndex;\ntype TopIndex = GridRangeIndex;\ntype BottomIndex = GridRangeIndex;\n\nexport type GridCell = { column: number; row: number };\n\nexport interface BoundedGridRange extends GridRange {\n startColumn: number;\n startRow: number;\n endColumn: number;\n endRow: number;\n}\n\n// Also exported via GridRange.SELECTION_DIRECTION\nexport enum SELECTION_DIRECTION {\n DOWN = 'DOWN',\n UP = 'UP',\n LEFT = 'LEFT',\n RIGHT = 'RIGHT',\n}\n\nexport class GridRange {\n startColumn: GridRangeIndex;\n\n startRow: GridRangeIndex;\n\n endColumn: GridRangeIndex;\n\n endRow: GridRangeIndex;\n\n static SELECTION_DIRECTION = SELECTION_DIRECTION;\n\n /**\n * Returns a normalized array of indexes ensuring left <= right and top <= bottom\n * @param startColumn Start column index\n * @param startRow Start row index\n * @param endColumn End column index\n * @param endRow End row index\n * @returns Array containing normalized indexes [left, top, right, bottom]\n */\n static normalize(\n startColumn: GridRangeIndex,\n startRow: GridRangeIndex,\n endColumn: GridRangeIndex,\n endRow: GridRangeIndex\n ): [LeftIndex, TopIndex, RightIndex, BottomIndex] {\n let left = startColumn;\n let top = startRow;\n let right = endColumn;\n let bottom = endRow;\n\n if (left != null && right != null && right < left) {\n left = right;\n right = startColumn;\n }\n\n if (top != null && bottom != null && bottom < top) {\n top = bottom;\n bottom = startRow;\n }\n\n return [left, top, right, bottom];\n }\n\n /**\n * Makes a GridRange ensuring startColumn <= endColumn, startRow <= endRow\n * @param startColumn Start column index\n * @param startRow Start row index\n * @param endColumn End column index\n * @param endRow End row index\n * @returns Normalized GridRange\n */\n static makeNormalized(\n startColumn: GridRangeIndex,\n startRow: GridRangeIndex,\n endColumn: GridRangeIndex,\n endRow: GridRangeIndex\n ): GridRange {\n return new GridRange(\n ...GridRange.normalize(startColumn, startRow, endColumn, endRow)\n );\n }\n\n /**\n * Creates a GridRange representing a single cell\n * @param column Column index\n * @param row Row index\n * @returns GridRange representing the cell\n */\n static makeCell(column: GridRangeIndex, row: GridRangeIndex): GridRange {\n return new GridRange(column, row, column, row);\n }\n\n /**\n * Creates a GridRange representing an infinite length column\n * @param column Column index\n * @returns GridRange representing the column\n */\n static makeColumn(column: GridRangeIndex): GridRange {\n return new GridRange(column, null, column, null);\n }\n\n /**\n * Creates a GridRange representing an infinite length row\n * @param row Row index\n * @returns GridRange representing the row\n */\n static makeRow(row: GridRangeIndex): GridRange {\n return new GridRange(null, row, null, row);\n }\n\n /**\n * Returns the minimum value between 2 range indexes or null if at least 1 is null\n * @param index1 First grid range index\n * @param index2 Second grid range index\n * @returns Minimum index or null if either index is null\n */\n static minOrNull(\n index1: GridRangeIndex,\n index2: GridRangeIndex\n ): number | null {\n if (index1 == null || index2 == null) {\n return null;\n }\n\n return Math.min(index1, index2);\n }\n\n /**\n * Returns the maximum value between 2 range indexes or null if at least 1 is null\n * @param index1 First grid range index\n * @param index2 Second grid range index\n * @returns Maximum index or null if either index is null\n */\n static maxOrNull(\n index1: GridRangeIndex,\n index2: GridRangeIndex\n ): number | null {\n if (index1 == null || index2 == null) {\n return null;\n }\n\n return Math.max(index1, index2);\n }\n\n /**\n * Consolidate the passed in ranges to the minimum set, merging overlapping ranges.\n * @param ranges The ranges to consolidate\n * @returns Consolidated ranges\n */\n static consolidate(ranges: GridRange[]): GridRange[] {\n const result = ranges.slice();\n\n let wasModified = true;\n while (wasModified) {\n wasModified = false;\n for (let i = 0; i < result.length && !wasModified; i += 1) {\n const range = result[i];\n for (let j = result.length - 1; j > i; j -= 1) {\n const other = result[j];\n\n // If one contains the other, we can just keep the bigger one\n if (range.contains(other)) {\n result.splice(j, 1);\n } else if (other.contains(range)) {\n wasModified = true;\n result[i] = other;\n result.splice(j, 1);\n break;\n } else if (\n range.startRow === other.startRow &&\n range.endRow === other.endRow\n ) {\n if (range.touches(other)) {\n // If the start/end rows match, and columns touch, consolidate\n const { startRow, endRow } = range;\n const startColumn = GridRange.minOrNull(\n range.startColumn,\n other.startColumn\n );\n const endColumn = GridRange.maxOrNull(\n range.endColumn,\n other.endColumn\n );\n\n wasModified = true;\n result[i] = new GridRange(\n startColumn,\n startRow,\n endColumn,\n endRow\n );\n result.splice(j, 1);\n break;\n }\n } else if (\n range.startColumn === other.startColumn &&\n range.endColumn === other.endColumn\n ) {\n if (range.touches(other)) {\n // If the start/end rows match, and columns touch, consolidate\n const { startColumn, endColumn } = range;\n const startRow = GridRange.minOrNull(\n range.startRow,\n other.startRow\n );\n const endRow = GridRange.maxOrNull(range.endRow, other.endRow);\n\n wasModified = true;\n result[i] = new GridRange(\n startColumn,\n startRow,\n endColumn,\n endRow\n );\n result.splice(j, 1);\n break;\n }\n }\n }\n }\n }\n\n return result;\n }\n\n /**\n * Checks if the 1-D ranges between 2 index pairs overlap or are continuous.\n * For example ranges [0, 1] and [2, 3] are continuous and will return true.\n * [0, 1] and [1, 3] overlap and return true.\n * [0, 1] and [3, 4] do not overlap and have a gap so this will return false.\n * @param start1 Start of 1st range\n * @param end1 End of 1st range\n * @param start2 Start of 2nd range\n * @param end2 End of 2nd range\n * @returns True if the ranges overlap or touch, else false\n */\n static isAxisRangeTouching(\n start1: GridRangeIndex,\n end1: GridRangeIndex,\n start2: GridRangeIndex,\n end2: GridRangeIndex\n ): boolean {\n if (start1 == null) {\n if (end1 == null) {\n return true;\n }\n\n if (start2 == null) {\n return true;\n }\n\n return start2 <= end1 + 1;\n }\n\n if (end1 == null) {\n if (end2 == null) {\n return true;\n }\n\n return end2 >= start1 - 1;\n }\n\n if (start2 == null) {\n if (end2 == null) {\n return true;\n }\n\n return start1 <= end2 + 1;\n }\n\n if (end2 == null) {\n return end1 >= start2 - 1;\n }\n\n if (start2 >= start1 - 1) {\n return start2 <= end1 + 1;\n }\n\n return end2 >= start1 - 1;\n }\n\n /**\n * Checks if 2 arrays of ranges are the same ranges\n * @param ranges1 First array of ranges\n * @param ranges2 Second array of ranges\n * @returns True if the arrays contain the same ranges in the same order\n */\n static rangeArraysEqual(ranges1: GridRange[], ranges2: GridRange[]): boolean {\n if (ranges1 === ranges2) {\n return true;\n }\n\n if (\n ranges1 == null ||\n ranges2 == null ||\n ranges1.length !== ranges2.length\n ) {\n return false;\n }\n\n for (let i = 0; i < ranges1.length; i += 1) {\n if (!ranges1[i].equals(ranges2[i])) {\n return false;\n }\n }\n\n return true;\n }\n\n /**\n * Get the intersection (overlapping area) of two ranges\n * @param range One range to check for the intersection\n * @param otherRange The other range to check for the intersection\n * @returns Intersection of the two ranges. If they do not intersect, returns `null`.\n */\n static intersection(\n range: GridRange,\n otherRange: GridRange\n ): GridRange | null {\n if (range.equals(otherRange)) {\n return range;\n }\n\n let { startColumn, startRow, endColumn, endRow } = range;\n startColumn =\n startColumn != null && otherRange.startColumn != null\n ? Math.max(startColumn, otherRange.startColumn)\n : startColumn ?? otherRange.startColumn;\n endColumn =\n endColumn != null && otherRange.endColumn != null\n ? Math.min(endColumn, otherRange.endColumn)\n : endColumn ?? otherRange.endColumn;\n startRow =\n startRow != null && otherRange.startRow != null\n ? Math.max(startRow, otherRange.startRow)\n : startRow ?? otherRange.startRow;\n endRow =\n endRow != null && otherRange.endRow != null\n ? Math.min(endRow, otherRange.endRow)\n : endRow ?? otherRange.endRow;\n\n if (\n (startColumn != null && startColumn > (endColumn ?? -1)) ||\n (startRow != null && startRow > (endRow ?? -1))\n ) {\n return null;\n }\n\n return new GridRange(startColumn, startRow, endColumn, endRow);\n }\n\n /**\n * Subtracts 1 range from another\n * @param range The range to be subtracted from\n * @param subtractRange The range to subtract from within this range\n * @returns The ranges needed to represent the remaining\n */\n static subtractFromRange(\n range: GridRange,\n subtractRange: GridRange\n ): GridRange[] {\n const result = [];\n\n // Make it a little easier by finding only the part the subtraction range intersects\n const subtract = GridRange.intersection(range, subtractRange);\n if (subtract == null) {\n return [range];\n }\n\n // Go through each of the quadrants for deselection, there can be up to 4\n // Top quadrant (above the subtracted area)\n if (\n subtract.startRow != null &&\n (range.startRow == null || range.startRow < subtract.startRow)\n ) {\n result.push(\n new GridRange(\n range.startColumn,\n range.startRow,\n range.endColumn,\n subtract.startRow - 1\n )\n );\n }\n\n // middle left\n if (\n subtract.startColumn != null &&\n (range.startColumn == null || range.startColumn < subtract.startColumn)\n ) {\n result.push(\n new GridRange(\n range.startColumn,\n subtract.startRow,\n subtract.startColumn - 1,\n subtract.endRow\n )\n );\n }\n\n // middle right\n if (\n subtract.endColumn != null &&\n (range.endColumn == null || range.endColumn > subtract.endColumn)\n ) {\n result.push(\n new GridRange(\n subtract.endColumn + 1,\n subtract.startRow,\n range.endColumn,\n subtract.endRow\n )\n );\n }\n\n // Bottom quadrant\n if (\n subtract.endRow != null &&\n (range.endRow == null || range.endRow > subtract.endRow)\n ) {\n result.push(\n new GridRange(\n range.startColumn,\n subtract.endRow + 1,\n range.endColumn,\n range.endRow\n )\n );\n }\n\n return result;\n }\n\n /**\n * Subtract a range from multiple ranges\n * @param ranges The ranges to be subtracted from\n * @param subtractRange The range to subtract from within these ranges\n * @returns The ranges needed to represent the remaining\n */\n static subtractFromRanges(\n ranges: GridRange[],\n subtractRange: GridRange\n ): GridRange[] {\n const result: GridRange[] = [];\n for (let i = 0; i < ranges.length; i += 1) {\n result.push(...GridRange.subtractFromRange(ranges[i], subtractRange));\n }\n\n return result;\n }\n\n /**\n * Subtract multiple ranges from multiple ranges\n * @param ranges The ranges to be subtracted from\n * @param subtractRanges The ranges to subtract from within these ranges\n * @returns The ranges needed to represent the remaining\n */\n static subtractRangesFromRanges(\n ranges: GridRange[],\n subtractRanges: GridRange[]\n ): GridRange[] {\n if (!subtractRanges || subtractRanges.length === 0) {\n return ranges;\n }\n\n let result = [...ranges];\n for (let i = 0; i < subtractRanges.length; i += 1) {\n result = GridRange.subtractFromRanges(result, subtractRanges[i]);\n }\n\n return result;\n }\n\n /**\n * Test if a given range is bounded (all values are non-null)\n * @param range The range to test\n * @returns True if this range is bounded, false otherwise\n */\n static isBounded(range: GridRange): range is BoundedGridRange {\n return (\n range.startRow != null &&\n range.startColumn != null &&\n range.endRow != null &&\n range.endColumn != null\n );\n }\n\n /**\n * Converts any GridRange passed in that is a full row or column selection to be bound\n * to the `columnCount` and `rowCount` passed in\n *\n * @param range The range to get the bounded range of\n * @param columnCount The number of columns\n * @param rowCount The number of rows\n * @returns The passed in GridRange with any null values filled in\n */\n static boundedRange(\n range: GridRange,\n columnCount: number,\n rowCount: number\n ): GridRange {\n if (GridRange.isBounded(range)) {\n return range;\n }\n\n return new GridRange(\n range.startColumn ?? 0,\n range.startRow ?? 0,\n range.endColumn ?? columnCount - 1,\n range.endRow ?? rowCount - 1\n );\n }\n\n /**\n * Converts the GridRanges passed in to be bound to the `columnCount` and `rowCount` passed in\n *\n * @param ranges The ranges to get the bounded ranges of\n * @param columnCount The number of columns\n * @param rowCount The number of rows\n * @returns The passed in GridRange with any null values filled in\n */\n static boundedRanges(\n ranges: GridRange[],\n columnCount: number,\n rowCount: number\n ): GridRange[] {\n return ranges.map(r => GridRange.boundedRange(r, columnCount, rowCount));\n }\n\n /**\n * Offsets a GridRange by the specified amount in the x and y directions\n *\n * @param range The range to offset\n * @param columnOffset The number of columns to offset\n * @param rowOffset The number of rows to offset\n * @returns The new grid range offset from the original\n */\n static offset(\n range: GridRange,\n columnOffset: number,\n rowOffset: number\n ): GridRange {\n return new GridRange(\n range.startColumn != null ? range.startColumn + columnOffset : null,\n range.startRow != null ? range.startRow + rowOffset : null,\n range.endColumn != null ? range.endColumn + columnOffset : null,\n range.endRow != null ? range.endRow + rowOffset : null\n );\n }\n\n /**\n * Get the next cell given the selected ranges and the current cell\n * @param ranges The selected bounded ranges within the grid\n * @param column The cursor column, or null if none focused\n * @param row The cursor row, or null if none focused\n * @param direction The direction in which to select next\n * @returns The next cell to focus, or null if there should be no more focus\n */\n static nextCell(\n ranges: GridRange[],\n column: GridRangeIndex = null,\n row: GridRangeIndex = null,\n direction = GridRange.SELECTION_DIRECTION.DOWN\n ): GridCell | null {\n if (ranges.length === 0) {\n return null;\n }\n\n let rangeIndex = -1;\n if (column != null && row != null) {\n rangeIndex = ranges.findIndex(r => r.containsCell(column, row));\n\n if (rangeIndex >= 0) {\n const range = ranges[rangeIndex];\n const nextCell = range.nextCell(column, row, direction);\n if (nextCell != null) {\n return nextCell;\n }\n }\n }\n\n // Otherwise go to the start of the next range (could be same range if only one range)\n switch (direction) {\n case GridRange.SELECTION_DIRECTION.DOWN:\n case GridRange.SELECTION_DIRECTION.RIGHT: {\n const nextRangeIndex =\n rangeIndex < ranges.length - 1 ? rangeIndex + 1 : 0;\n const nextRange = ranges[nextRangeIndex];\n return nextRange.startCell(direction);\n }\n case GridRange.SELECTION_DIRECTION.LEFT:\n case GridRange.SELECTION_DIRECTION.UP: {\n const nextRangeIndex =\n rangeIndex > 0 ? rangeIndex - 1 : ranges.length - 1;\n const nextRange = ranges[nextRangeIndex];\n return nextRange.startCell(direction);\n }\n default:\n throw new Error(`Invalid direction: ${direction}`);\n }\n }\n\n /**\n * Count the number of cells in the provided grid ranges\n * @param ranges The ranges to count the rows of\n * @returns The number of cells in the ranges, or `NaN` if any of the ranges were unbounded\n */\n static cellCount(ranges: GridRange[]): number {\n return ranges.reduce(\n (cellCount, range) =>\n cellCount +\n ((range.endRow ?? NaN) - (range.startRow ?? NaN) + 1) *\n ((range.endColumn ?? NaN) - (range.startColumn ?? NaN) + 1),\n 0\n );\n }\n\n /**\n * Count the number of rows in the provided grid ranges\n * @param ranges The ranges to count the rows of\n * @returns The number of rows in the ranges, or `NaN` if any of the ranges were unbounded\n */\n static rowCount(ranges: GridRange[]): number {\n return ranges.reduce(\n (rowCount, range) =>\n rowCount + (range.endRow ?? NaN) - (range.startRow ?? NaN) + 1,\n 0\n );\n }\n\n /**\n * Count the number of columns in the provided grid ranges\n * @param ranges The ranges to count the columns of\n * @returns The number of columns in the ranges, or `NaN` if any of the ranges were unbounded\n */\n static columnCount(ranges: GridRange[]): number {\n return ranges.reduce(\n (columnCount, range) =>\n columnCount + (range.endColumn ?? NaN) - (range.startColumn ?? NaN) + 1,\n 0\n );\n }\n\n /**\n * Check if the provided ranges contain the provided cell\n * @param ranges The ranges to check\n * @param column The column index\n * @param row The row index\n * @returns True if the cell is within the provided ranges, false otherwise.\n */\n static containsCell(\n ranges: GridRange[],\n column: GridRangeIndex,\n row: GridRangeIndex\n ): boolean {\n for (let i = 0; i < ranges.length; i += 1) {\n const range = ranges[i];\n if (range.containsCell(column, row)) {\n return true;\n }\n }\n return false;\n }\n\n /**\n * Iterate through each cell in the provided ranges\n * @param ranges The ranges to iterate through\n * @param {(column: number, row: number, index: number) => void} callback The callback to execute. `index` is the index within that range\n * @param {GridRange.SELECTION_DIRECTION} direction The direction to iterate in\n */\n static forEachCell(\n ranges: GridRange[],\n callback: (column: number, row: number, index: number) => void,\n direction = GridRange.SELECTION_DIRECTION.RIGHT\n ): void {\n for (let i = 0; i < ranges.length; i += 1) {\n ranges[i].forEach(callback, direction);\n }\n }\n\n constructor(\n startColumn: GridRangeIndex,\n startRow: GridRangeIndex,\n endColumn: GridRangeIndex,\n endRow: GridRangeIndex\n ) {\n this.startColumn = startColumn;\n this.startRow = startRow;\n this.endColumn = endColumn;\n this.endRow = endRow;\n }\n\n /**\n * Checks if the provided range is equivalent to this range (same start and end column/row indexes)\n * @param other Grid range to check against\n * @returns True if the ranges cover the same area\n */\n equals(other: GridRange): boolean {\n return (\n this.startColumn === other.startColumn &&\n this.startRow === other.startRow &&\n this.endColumn === other.endColumn &&\n this.endRow === other.endRow\n );\n }\n\n /**\n * Checks if this GridRange contains another range\n * @param other The range to check\n * @returns True if this GridRange completely contains `other`\n * */\n contains(other: GridRange): boolean {\n return (\n (this.startColumn == null ||\n (other.startColumn != null && this.startColumn <= other.startColumn)) &&\n (this.startRow == null ||\n (other.startRow != null && this.startRow <= other.startRow)) &&\n (this.endColumn == null ||\n (other.endColumn != null && this.endColumn >= other.endColumn)) &&\n (this.endRow == null ||\n (other.endRow != null && this.endRow >= other.endRow))\n );\n }\n\n /**\n * Check if the provided cell is in this range\n * @param column The column to check\n * @param row The row to check\n * @returns True if this cell is within this range\n */\n containsCell(column: GridRangeIndex, row: GridRangeIndex): boolean {\n if (column == null || row == null) {\n return false;\n }\n\n return (\n (this.startColumn == null || this.startColumn <= column) &&\n (this.endColumn == null || this.endColumn >= column) &&\n (this.startRow == null || this.startRow <= row) &&\n (this.endRow == null || this.endRow >= row)\n );\n }\n\n /**\n * Check if the provided range touches (or overlaps) this GridRange\n * Effectively checks if the 2 ranges could be represented by 1 continuous range\n * @param other The range to check\n * @returns True if this GridRange touches `other`\n * */\n touches(other: GridRange): boolean {\n return (\n GridRange.isAxisRangeTouching(\n this.startRow,\n this.endRow,\n other.startRow,\n other.endRow\n ) &&\n GridRange.isAxisRangeTouching(\n this.startColumn,\n this.endColumn,\n other.startColumn,\n other.endColumn\n )\n );\n }\n\n /**\n * Subtracts a range from this range\n * @param other The range to deselect from within this range\n * @returns The ranges needed to represent the remaining\n */\n subtract(other: GridRange): GridRange[] {\n return GridRange.subtractFromRange(this, other);\n }\n\n /**\n * Get the first cell in this range. Throws if this range is unbounded.\n *\n * @param direction The direction to get the starting cell in. Defaults to DOWN\n * @returns The first cell in this range in the direction specified\n */\n startCell(direction = GridRange.SELECTION_DIRECTION.DOWN): GridCell {\n if (!GridRange.isBounded(this)) {\n throw new Error('Cannot get the startCell of an unbounded range');\n }\n\n switch (direction) {\n case GridRange.SELECTION_DIRECTION.DOWN:\n case GridRange.SELECTION_DIRECTION.RIGHT:\n return { column: this.startColumn, row: this.startRow };\n case GridRange.SELECTION_DIRECTION.LEFT:\n case GridRange.SELECTION_DIRECTION.UP: {\n return { column: this.endColumn, row: this.endRow };\n }\n default:\n throw new Error(`Invalid direction: ${direction}`);\n }\n }\n\n /**\n * Get the next cell in the direction specified. Throws if this range is unbounded.\n * If already at the bounds of the range in that direction, wrap to the next column or row\n * If at the end of the entire range, return null\n * If outside of the range, returns the next cell closest within this range.\n *\n * @param {number} column The cursor column\n * @param {number} row The cursor row\n * @param {SELECTION_DIRECTION} direction The direction to go in\n * @returns {GridCell|null} The next cell in the direction specified, or `null` if at the end of the range\n */\n nextCell(\n column: GridRangeIndex,\n row: GridRangeIndex,\n direction: SELECTION_DIRECTION\n ): GridCell | null {\n if (!GridRange.isBounded(this)) {\n throw new Error('Bounded range required');\n }\n if (column == null || row == null) {\n throw new Error('Require a non-null cursor');\n }\n\n const { startColumn, endColumn, startRow, endRow } = this;\n\n switch (direction) {\n case GridRange.SELECTION_DIRECTION.DOWN:\n if (row < endRow) {\n return { column, row: Math.max(row + 1, startRow) };\n }\n\n if (column < endColumn) {\n return { column: Math.max(column + 1, startColumn), row: startRow };\n }\n break;\n case GridRange.SELECTION_DIRECTION.UP:\n if (row > startRow) {\n return { column, row: Math.min(row - 1, endRow) };\n }\n\n if (column > startColumn) {\n return { column: Math.min(column - 1, endColumn), row: endRow };\n }\n break;\n case GridRange.SELECTION_DIRECTION.RIGHT:\n if (column < endColumn) {\n return { column: Math.max(column + 1, startColumn), row };\n }\n\n if (row < endRow) {\n return { column: startColumn, row: Math.max(row + 1, startRow) };\n }\n break;\n case GridRange.SELECTION_DIRECTION.LEFT:\n if (column > startColumn) {\n return { column: Math.min(column - 1, endColumn), row };\n }\n\n if (row > startRow) {\n return { column: endColumn, row: Math.min(row - 1, endRow) };\n }\n break;\n default:\n throw new Error(`Invalid direction: ${direction}`);\n }\n\n return null;\n }\n\n /**\n * Iterate through each cell in the range\n * @param callback Callback to execute. `index` is the index within this range\n * @param direction The direction to iterate in\n */\n forEach(\n callback: (column: number, row: number, index: number) => void,\n direction = GridRange.SELECTION_DIRECTION.RIGHT\n ): void {\n let i = 0;\n let {\n column: c,\n row: r,\n }: { column?: number; row?: number } = this.startCell(direction);\n while (c != null && r != null) {\n callback(c, r, i);\n i += 1;\n\n ({ column: c, row: r } = this.nextCell(c, r, direction) ?? {});\n }\n }\n}\n\nexport default GridRange;\n"],"mappings":"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"}
1
+ {"version":3,"file":"GridRange.js","names":["SELECTION_DIRECTION","GridRange","normalize","startColumn","startRow","endColumn","endRow","left","top","right","bottom","makeNormalized","makeCell","column","row","makeColumn","makeRow","minOrNull","index1","index2","Math","min","maxOrNull","max","consolidate","ranges","result","slice","wasModified","i","length","range","j","other","contains","splice","touches","isAxisRangeTouching","start1","end1","start2","end2","rangeArraysEqual","ranges1","ranges2","equals","intersection","otherRange","subtractFromRange","subtractRange","subtract","push","subtractFromRanges","subtractRangesFromRanges","subtractRanges","isBounded","boundedRange","columnCount","rowCount","boundedRanges","map","r","offset","columnOffset","rowOffset","nextCell","direction","DOWN","rangeIndex","findIndex","containsCell","RIGHT","nextRangeIndex","nextRange","startCell","LEFT","UP","Error","cellCount","reduce","NaN","forEachCell","callback","forEach","constructor","c"],"sources":["../src/GridRange.ts"],"sourcesContent":["export type GridRangeIndex = number | null;\ntype LeftIndex = GridRangeIndex;\ntype RightIndex = GridRangeIndex;\ntype TopIndex = GridRangeIndex;\ntype BottomIndex = GridRangeIndex;\n\nexport type GridCell = { column: number; row: number };\n\nexport interface BoundedGridRange extends GridRange {\n startColumn: number;\n startRow: number;\n endColumn: number;\n endRow: number;\n}\n\n// Also exported via GridRange.SELECTION_DIRECTION\nexport enum SELECTION_DIRECTION {\n DOWN = 'DOWN',\n UP = 'UP',\n LEFT = 'LEFT',\n RIGHT = 'RIGHT',\n}\n\nexport class GridRange {\n startColumn: GridRangeIndex;\n\n startRow: GridRangeIndex;\n\n endColumn: GridRangeIndex;\n\n endRow: GridRangeIndex;\n\n static SELECTION_DIRECTION = SELECTION_DIRECTION;\n\n /**\n * Returns a normalized array of indexes ensuring left <= right and top <= bottom\n * @param startColumn Start column index\n * @param startRow Start row index\n * @param endColumn End column index\n * @param endRow End row index\n * @returns Array containing normalized indexes [left, top, right, bottom]\n */\n static normalize(\n startColumn: GridRangeIndex,\n startRow: GridRangeIndex,\n endColumn: GridRangeIndex,\n endRow: GridRangeIndex\n ): [LeftIndex, TopIndex, RightIndex, BottomIndex] {\n let left = startColumn;\n let top = startRow;\n let right = endColumn;\n let bottom = endRow;\n\n if (left != null && right != null && right < left) {\n left = right;\n right = startColumn;\n }\n\n if (top != null && bottom != null && bottom < top) {\n top = bottom;\n bottom = startRow;\n }\n\n return [left, top, right, bottom];\n }\n\n /**\n * Makes a GridRange ensuring startColumn <= endColumn, startRow <= endRow\n * @param startColumn Start column index\n * @param startRow Start row index\n * @param endColumn End column index\n * @param endRow End row index\n * @returns Normalized GridRange\n */\n static makeNormalized(\n startColumn: GridRangeIndex,\n startRow: GridRangeIndex,\n endColumn: GridRangeIndex,\n endRow: GridRangeIndex\n ): GridRange {\n return new GridRange(\n ...GridRange.normalize(startColumn, startRow, endColumn, endRow)\n );\n }\n\n /**\n * Creates a GridRange representing a single cell\n * @param column Column index\n * @param row Row index\n * @returns GridRange representing the cell\n */\n static makeCell(column: GridRangeIndex, row: GridRangeIndex): GridRange {\n return new GridRange(column, row, column, row);\n }\n\n /**\n * Creates a GridRange representing an infinite length column\n * @param column Column index\n * @returns GridRange representing the column\n */\n static makeColumn(column: GridRangeIndex): GridRange {\n return new GridRange(column, null, column, null);\n }\n\n /**\n * Creates a GridRange representing an infinite length row\n * @param row Row index\n * @returns GridRange representing the row\n */\n static makeRow(row: GridRangeIndex): GridRange {\n return new GridRange(null, row, null, row);\n }\n\n /**\n * Returns the minimum value between 2 range indexes or null if at least 1 is null\n * @param index1 First grid range index\n * @param index2 Second grid range index\n * @returns Minimum index or null if either index is null\n */\n static minOrNull(\n index1: GridRangeIndex,\n index2: GridRangeIndex\n ): number | null {\n if (index1 == null || index2 == null) {\n return null;\n }\n\n return Math.min(index1, index2);\n }\n\n /**\n * Returns the maximum value between 2 range indexes or null if at least 1 is null\n * @param index1 First grid range index\n * @param index2 Second grid range index\n * @returns Maximum index or null if either index is null\n */\n static maxOrNull(\n index1: GridRangeIndex,\n index2: GridRangeIndex\n ): number | null {\n if (index1 == null || index2 == null) {\n return null;\n }\n\n return Math.max(index1, index2);\n }\n\n /**\n * Consolidate the passed in ranges to the minimum set, merging overlapping ranges.\n * @param ranges The ranges to consolidate\n * @returns Consolidated ranges\n */\n static consolidate(ranges: GridRange[]): GridRange[] {\n const result = ranges.slice();\n\n let wasModified = true;\n while (wasModified) {\n wasModified = false;\n for (let i = 0; i < result.length && !wasModified; i += 1) {\n const range = result[i];\n for (let j = result.length - 1; j > i; j -= 1) {\n const other = result[j];\n\n // If one contains the other, we can just keep the bigger one\n if (range.contains(other)) {\n result.splice(j, 1);\n } else if (other.contains(range)) {\n wasModified = true;\n result[i] = other;\n result.splice(j, 1);\n break;\n } else if (\n range.startRow === other.startRow &&\n range.endRow === other.endRow\n ) {\n if (range.touches(other)) {\n // If the start/end rows match, and columns touch, consolidate\n const { startRow, endRow } = range;\n const startColumn = GridRange.minOrNull(\n range.startColumn,\n other.startColumn\n );\n const endColumn = GridRange.maxOrNull(\n range.endColumn,\n other.endColumn\n );\n\n wasModified = true;\n result[i] = new GridRange(\n startColumn,\n startRow,\n endColumn,\n endRow\n );\n result.splice(j, 1);\n break;\n }\n } else if (\n range.startColumn === other.startColumn &&\n range.endColumn === other.endColumn\n ) {\n if (range.touches(other)) {\n // If the start/end rows match, and columns touch, consolidate\n const { startColumn, endColumn } = range;\n const startRow = GridRange.minOrNull(\n range.startRow,\n other.startRow\n );\n const endRow = GridRange.maxOrNull(range.endRow, other.endRow);\n\n wasModified = true;\n result[i] = new GridRange(\n startColumn,\n startRow,\n endColumn,\n endRow\n );\n result.splice(j, 1);\n break;\n }\n }\n }\n }\n }\n\n return result;\n }\n\n /**\n * Checks if the 1-D ranges between 2 index pairs overlap or are continuous.\n * For example ranges [0, 1] and [2, 3] are continuous and will return true.\n * [0, 1] and [1, 3] overlap and return true.\n * [0, 1] and [3, 4] do not overlap and have a gap so this will return false.\n * @param start1 Start of 1st range\n * @param end1 End of 1st range\n * @param start2 Start of 2nd range\n * @param end2 End of 2nd range\n * @returns True if the ranges overlap or touch, else false\n */\n static isAxisRangeTouching(\n start1: GridRangeIndex,\n end1: GridRangeIndex,\n start2: GridRangeIndex,\n end2: GridRangeIndex\n ): boolean {\n if (start1 == null) {\n if (end1 == null) {\n return true;\n }\n\n if (start2 == null) {\n return true;\n }\n\n return start2 <= end1 + 1;\n }\n\n if (end1 == null) {\n if (end2 == null) {\n return true;\n }\n\n return end2 >= start1 - 1;\n }\n\n if (start2 == null) {\n if (end2 == null) {\n return true;\n }\n\n return start1 <= end2 + 1;\n }\n\n if (end2 == null) {\n return end1 >= start2 - 1;\n }\n\n if (start2 >= start1 - 1) {\n return start2 <= end1 + 1;\n }\n\n return end2 >= start1 - 1;\n }\n\n /**\n * Checks if 2 arrays of ranges are the same ranges\n * @param ranges1 First array of ranges\n * @param ranges2 Second array of ranges\n * @returns True if the arrays contain the same ranges in the same order\n */\n static rangeArraysEqual(ranges1: GridRange[], ranges2: GridRange[]): boolean {\n if (ranges1 === ranges2) {\n return true;\n }\n\n if (\n ranges1 == null ||\n ranges2 == null ||\n ranges1.length !== ranges2.length\n ) {\n return false;\n }\n\n for (let i = 0; i < ranges1.length; i += 1) {\n if (!ranges1[i].equals(ranges2[i])) {\n return false;\n }\n }\n\n return true;\n }\n\n /**\n * Get the intersection (overlapping area) of two ranges\n * @param range One range to check for the intersection\n * @param otherRange The other range to check for the intersection\n * @returns Intersection of the two ranges. If they do not intersect, returns `null`.\n */\n static intersection(\n range: GridRange,\n otherRange: GridRange\n ): GridRange | null {\n if (range.equals(otherRange)) {\n return range;\n }\n\n let { startColumn, startRow, endColumn, endRow } = range;\n startColumn =\n startColumn != null && otherRange.startColumn != null\n ? Math.max(startColumn, otherRange.startColumn)\n : startColumn ?? otherRange.startColumn;\n endColumn =\n endColumn != null && otherRange.endColumn != null\n ? Math.min(endColumn, otherRange.endColumn)\n : endColumn ?? otherRange.endColumn;\n startRow =\n startRow != null && otherRange.startRow != null\n ? Math.max(startRow, otherRange.startRow)\n : startRow ?? otherRange.startRow;\n endRow =\n endRow != null && otherRange.endRow != null\n ? Math.min(endRow, otherRange.endRow)\n : endRow ?? otherRange.endRow;\n\n if (\n (startColumn != null && startColumn > (endColumn ?? -1)) ||\n (startRow != null && startRow > (endRow ?? -1))\n ) {\n return null;\n }\n\n return new GridRange(startColumn, startRow, endColumn, endRow);\n }\n\n /**\n * Subtracts 1 range from another\n * @param range The range to be subtracted from\n * @param subtractRange The range to subtract from within this range\n * @returns The ranges needed to represent the remaining\n */\n static subtractFromRange(\n range: GridRange,\n subtractRange: GridRange\n ): GridRange[] {\n const result = [];\n\n // Make it a little easier by finding only the part the subtraction range intersects\n const subtract = GridRange.intersection(range, subtractRange);\n if (subtract == null) {\n return [range];\n }\n\n // Go through each of the quadrants for deselection, there can be up to 4\n // Top quadrant (above the subtracted area)\n if (\n subtract.startRow != null &&\n (range.startRow == null || range.startRow < subtract.startRow)\n ) {\n result.push(\n new GridRange(\n range.startColumn,\n range.startRow,\n range.endColumn,\n subtract.startRow - 1\n )\n );\n }\n\n // middle left\n if (\n subtract.startColumn != null &&\n (range.startColumn == null || range.startColumn < subtract.startColumn)\n ) {\n result.push(\n new GridRange(\n range.startColumn,\n subtract.startRow,\n subtract.startColumn - 1,\n subtract.endRow\n )\n );\n }\n\n // middle right\n if (\n subtract.endColumn != null &&\n (range.endColumn == null || range.endColumn > subtract.endColumn)\n ) {\n result.push(\n new GridRange(\n subtract.endColumn + 1,\n subtract.startRow,\n range.endColumn,\n subtract.endRow\n )\n );\n }\n\n // Bottom quadrant\n if (\n subtract.endRow != null &&\n (range.endRow == null || range.endRow > subtract.endRow)\n ) {\n result.push(\n new GridRange(\n range.startColumn,\n subtract.endRow + 1,\n range.endColumn,\n range.endRow\n )\n );\n }\n\n return result;\n }\n\n /**\n * Subtract a range from multiple ranges\n * @param ranges The ranges to be subtracted from\n * @param subtractRange The range to subtract from within these ranges\n * @returns The ranges needed to represent the remaining\n */\n static subtractFromRanges(\n ranges: GridRange[],\n subtractRange: GridRange\n ): GridRange[] {\n const result: GridRange[] = [];\n for (let i = 0; i < ranges.length; i += 1) {\n result.push(...GridRange.subtractFromRange(ranges[i], subtractRange));\n }\n\n return result;\n }\n\n /**\n * Subtract multiple ranges from multiple ranges\n * @param ranges The ranges to be subtracted from\n * @param subtractRanges The ranges to subtract from within these ranges\n * @returns The ranges needed to represent the remaining\n */\n static subtractRangesFromRanges(\n ranges: GridRange[],\n subtractRanges: GridRange[]\n ): GridRange[] {\n if (!subtractRanges || subtractRanges.length === 0) {\n return ranges;\n }\n\n let result = [...ranges];\n for (let i = 0; i < subtractRanges.length; i += 1) {\n result = GridRange.subtractFromRanges(result, subtractRanges[i]);\n }\n\n return result;\n }\n\n /**\n * Test if a given range is bounded (all values are non-null)\n * @param range The range to test\n * @returns True if this range is bounded, false otherwise\n */\n static isBounded(range: GridRange): range is BoundedGridRange {\n return (\n range.startRow != null &&\n range.startColumn != null &&\n range.endRow != null &&\n range.endColumn != null\n );\n }\n\n /**\n * Converts any GridRange passed in that is a full row or column selection to be bound\n * to the `columnCount` and `rowCount` passed in\n *\n * @param range The range to get the bounded range of\n * @param columnCount The number of columns\n * @param rowCount The number of rows\n * @returns The passed in GridRange with any null values filled in\n */\n static boundedRange(\n range: GridRange,\n columnCount: number,\n rowCount: number\n ): GridRange {\n if (GridRange.isBounded(range)) {\n return range;\n }\n\n return new GridRange(\n range.startColumn ?? 0,\n range.startRow ?? 0,\n range.endColumn ?? columnCount - 1,\n range.endRow ?? rowCount - 1\n );\n }\n\n /**\n * Converts the GridRanges passed in to be bound to the `columnCount` and `rowCount` passed in\n *\n * @param ranges The ranges to get the bounded ranges of\n * @param columnCount The number of columns\n * @param rowCount The number of rows\n * @returns The passed in GridRange with any null values filled in\n */\n static boundedRanges(\n ranges: GridRange[],\n columnCount: number,\n rowCount: number\n ): GridRange[] {\n return ranges.map(r => GridRange.boundedRange(r, columnCount, rowCount));\n }\n\n /**\n * Offsets a GridRange by the specified amount in the x and y directions\n *\n * @param range The range to offset\n * @param columnOffset The number of columns to offset\n * @param rowOffset The number of rows to offset\n * @returns The new grid range offset from the original\n */\n static offset(\n range: GridRange,\n columnOffset: number,\n rowOffset: number\n ): GridRange {\n return new GridRange(\n range.startColumn != null ? range.startColumn + columnOffset : null,\n range.startRow != null ? range.startRow + rowOffset : null,\n range.endColumn != null ? range.endColumn + columnOffset : null,\n range.endRow != null ? range.endRow + rowOffset : null\n );\n }\n\n /**\n * Get the next cell given the selected ranges and the current cell\n * @param ranges The selected bounded ranges within the grid\n * @param column The cursor column, or null if none focused\n * @param row The cursor row, or null if none focused\n * @param direction The direction in which to select next\n * @returns The next cell to focus, or null if there should be no more focus\n */\n static nextCell(\n ranges: GridRange[],\n column: GridRangeIndex = null,\n row: GridRangeIndex = null,\n direction = GridRange.SELECTION_DIRECTION.DOWN\n ): GridCell | null {\n if (ranges.length === 0) {\n return null;\n }\n\n let rangeIndex = -1;\n if (column != null && row != null) {\n rangeIndex = ranges.findIndex(r => r.containsCell(column, row));\n\n if (rangeIndex >= 0) {\n const range = ranges[rangeIndex];\n const nextCell = range.nextCell(column, row, direction);\n if (nextCell != null) {\n return nextCell;\n }\n }\n }\n\n // Otherwise go to the start of the next range (could be same range if only one range)\n switch (direction) {\n case GridRange.SELECTION_DIRECTION.DOWN:\n case GridRange.SELECTION_DIRECTION.RIGHT: {\n const nextRangeIndex =\n rangeIndex < ranges.length - 1 ? rangeIndex + 1 : 0;\n const nextRange = ranges[nextRangeIndex];\n return nextRange.startCell(direction);\n }\n case GridRange.SELECTION_DIRECTION.LEFT:\n case GridRange.SELECTION_DIRECTION.UP: {\n const nextRangeIndex =\n rangeIndex > 0 ? rangeIndex - 1 : ranges.length - 1;\n const nextRange = ranges[nextRangeIndex];\n return nextRange.startCell(direction);\n }\n default:\n throw new Error(`Invalid direction: ${direction}`);\n }\n }\n\n /**\n * Count the number of cells in the provided grid ranges\n * @param ranges The ranges to count the rows of\n * @returns The number of cells in the ranges, or `NaN` if any of the ranges were unbounded\n */\n static cellCount(ranges: GridRange[]): number {\n return ranges.reduce(\n (cellCount, range) =>\n cellCount +\n ((range.endRow ?? NaN) - (range.startRow ?? NaN) + 1) *\n ((range.endColumn ?? NaN) - (range.startColumn ?? NaN) + 1),\n 0\n );\n }\n\n /**\n * Count the number of rows in the provided grid ranges\n * @param ranges The ranges to count the rows of\n * @returns The number of rows in the ranges, or `NaN` if any of the ranges were unbounded\n */\n static rowCount(ranges: GridRange[]): number {\n return ranges.reduce(\n (rowCount, range) =>\n rowCount + (range.endRow ?? NaN) - (range.startRow ?? NaN) + 1,\n 0\n );\n }\n\n /**\n * Count the number of columns in the provided grid ranges\n * @param ranges The ranges to count the columns of\n * @returns The number of columns in the ranges, or `NaN` if any of the ranges were unbounded\n */\n static columnCount(ranges: GridRange[]): number {\n return ranges.reduce(\n (columnCount, range) =>\n columnCount + (range.endColumn ?? NaN) - (range.startColumn ?? NaN) + 1,\n 0\n );\n }\n\n /**\n * Check if the provided ranges contain the provided cell\n * @param ranges The ranges to check\n * @param column The column index\n * @param row The row index\n * @returns True if the cell is within the provided ranges, false otherwise.\n */\n static containsCell(\n ranges: GridRange[],\n column: GridRangeIndex,\n row: GridRangeIndex\n ): boolean {\n for (let i = 0; i < ranges.length; i += 1) {\n const range = ranges[i];\n if (range.containsCell(column, row)) {\n return true;\n }\n }\n return false;\n }\n\n /**\n * Iterate through each cell in the provided ranges\n * @param ranges The ranges to iterate through\n * @param {(column: number, row: number, index: number) => void} callback The callback to execute. `index` is the index within that range\n * @param {GridRange.SELECTION_DIRECTION} direction The direction to iterate in\n */\n static forEachCell(\n ranges: GridRange[],\n callback: (column: number, row: number, index: number) => void,\n direction = GridRange.SELECTION_DIRECTION.RIGHT\n ): void {\n for (let i = 0; i < ranges.length; i += 1) {\n ranges[i].forEach(callback, direction);\n }\n }\n\n constructor(\n startColumn: GridRangeIndex,\n startRow: GridRangeIndex,\n endColumn: GridRangeIndex,\n endRow: GridRangeIndex\n ) {\n this.startColumn = startColumn;\n this.startRow = startRow;\n this.endColumn = endColumn;\n this.endRow = endRow;\n }\n\n /**\n * Checks if the provided range is equivalent to this range (same start and end column/row indexes)\n * @param other Grid range to check against\n * @returns True if the ranges cover the same area\n */\n equals(other: GridRange): boolean {\n return (\n this.startColumn === other.startColumn &&\n this.startRow === other.startRow &&\n this.endColumn === other.endColumn &&\n this.endRow === other.endRow\n );\n }\n\n /**\n * Checks if this GridRange contains another range\n * @param other The range to check\n * @returns True if this GridRange completely contains `other`\n * */\n contains(other: GridRange): boolean {\n return (\n (this.startColumn == null ||\n (other.startColumn != null && this.startColumn <= other.startColumn)) &&\n (this.startRow == null ||\n (other.startRow != null && this.startRow <= other.startRow)) &&\n (this.endColumn == null ||\n (other.endColumn != null && this.endColumn >= other.endColumn)) &&\n (this.endRow == null ||\n (other.endRow != null && this.endRow >= other.endRow))\n );\n }\n\n /**\n * Check if the provided cell is in this range\n * @param column The column to check\n * @param row The row to check\n * @returns True if this cell is within this range\n */\n containsCell(column: GridRangeIndex, row: GridRangeIndex): boolean {\n if (column == null || row == null) {\n return false;\n }\n\n return (\n (this.startColumn == null || this.startColumn <= column) &&\n (this.endColumn == null || this.endColumn >= column) &&\n (this.startRow == null || this.startRow <= row) &&\n (this.endRow == null || this.endRow >= row)\n );\n }\n\n /**\n * Check if the provided range touches (or overlaps) this GridRange\n * Effectively checks if the 2 ranges could be represented by 1 continuous range\n * @param other The range to check\n * @returns True if this GridRange touches `other`\n * */\n touches(other: GridRange): boolean {\n return (\n GridRange.isAxisRangeTouching(\n this.startRow,\n this.endRow,\n other.startRow,\n other.endRow\n ) &&\n GridRange.isAxisRangeTouching(\n this.startColumn,\n this.endColumn,\n other.startColumn,\n other.endColumn\n )\n );\n }\n\n /**\n * Subtracts a range from this range\n * @param other The range to deselect from within this range\n * @returns The ranges needed to represent the remaining\n */\n subtract(other: GridRange): GridRange[] {\n return GridRange.subtractFromRange(this, other);\n }\n\n /**\n * Get the first cell in this range. Throws if this range is unbounded.\n *\n * @param direction The direction to get the starting cell in. Defaults to DOWN\n * @returns The first cell in this range in the direction specified\n */\n startCell(direction = GridRange.SELECTION_DIRECTION.DOWN): GridCell {\n if (!GridRange.isBounded(this)) {\n throw new Error('Cannot get the startCell of an unbounded range');\n }\n\n switch (direction) {\n case GridRange.SELECTION_DIRECTION.DOWN:\n case GridRange.SELECTION_DIRECTION.RIGHT:\n return { column: this.startColumn, row: this.startRow };\n case GridRange.SELECTION_DIRECTION.LEFT:\n case GridRange.SELECTION_DIRECTION.UP: {\n return { column: this.endColumn, row: this.endRow };\n }\n default:\n throw new Error(`Invalid direction: ${direction}`);\n }\n }\n\n /**\n * Get the next cell in the direction specified. Throws if this range is unbounded.\n * If already at the bounds of the range in that direction, wrap to the next column or row\n * If at the end of the entire range, return null\n * If outside of the range, returns the next cell closest within this range.\n *\n * @param column The cursor column\n * @param row The cursor row\n * @param direction The direction to go in\n * @returns The next cell in the direction specified, or `null` if at the end of the range\n */\n nextCell(\n column: GridRangeIndex,\n row: GridRangeIndex,\n direction: SELECTION_DIRECTION\n ): GridCell | null {\n if (!GridRange.isBounded(this)) {\n throw new Error('Bounded range required');\n }\n if (column == null || row == null) {\n throw new Error('Require a non-null cursor');\n }\n\n const { startColumn, endColumn, startRow, endRow } = this;\n\n switch (direction) {\n case GridRange.SELECTION_DIRECTION.DOWN:\n if (row < endRow) {\n return { column, row: Math.max(row + 1, startRow) };\n }\n\n if (column < endColumn) {\n return { column: Math.max(column + 1, startColumn), row: startRow };\n }\n break;\n case GridRange.SELECTION_DIRECTION.UP:\n if (row > startRow) {\n return { column, row: Math.min(row - 1, endRow) };\n }\n\n if (column > startColumn) {\n return { column: Math.min(column - 1, endColumn), row: endRow };\n }\n break;\n case GridRange.SELECTION_DIRECTION.RIGHT:\n if (column < endColumn) {\n return { column: Math.max(column + 1, startColumn), row };\n }\n\n if (row < endRow) {\n return { column: startColumn, row: Math.max(row + 1, startRow) };\n }\n break;\n case GridRange.SELECTION_DIRECTION.LEFT:\n if (column > startColumn) {\n return { column: Math.min(column - 1, endColumn), row };\n }\n\n if (row > startRow) {\n return { column: endColumn, row: Math.min(row - 1, endRow) };\n }\n break;\n default:\n throw new Error(`Invalid direction: ${direction}`);\n }\n\n return null;\n }\n\n /**\n * Iterate through each cell in the range\n * @param callback Callback to execute. `index` is the index within this range\n * @param direction The direction to iterate in\n */\n forEach(\n callback: (column: number, row: number, index: number) => void,\n direction = GridRange.SELECTION_DIRECTION.RIGHT\n ): void {\n let i = 0;\n let {\n column: c,\n row: r,\n }: { column?: number; row?: number } = this.startCell(direction);\n while (c != null && r != null) {\n callback(c, r, i);\n i += 1;\n\n ({ column: c, row: r } = this.nextCell(c, r, direction) ?? {});\n }\n }\n}\n\nexport default GridRange;\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"GridRenderer.d.ts","sourceRoot":"","sources":["../src/GridRenderer.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"GridRenderer.d.ts","sourceRoot":"","sources":["../src/GridRenderer.ts"],"names":[],"mappings":"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"}
@@ -1339,6 +1339,9 @@ export class GridRenderer {
1339
1339
  var columnIndex = startIndex;
1340
1340
 
1341
1341
  while (columnIndex <= endIndex) {
1342
+ var {
1343
+ columnCount
1344
+ } = metrics;
1342
1345
  var modelColumn = getOrThrow(modelColumns, columnIndex);
1343
1346
  var columnGroupName = model.textForColumnHeader(modelColumn, depth);
1344
1347
  var columnGroupColor = model.colorForColumnHeader(modelColumn, depth);
@@ -1351,7 +1354,7 @@ export class GridRenderer {
1351
1354
  // The group will be drawn as if it were a column with a max width of the bounds width
1352
1355
  var prevColumnIndex = columnIndex - 1;
1353
1356
 
1354
- while (columnGroupRight - columnGroupLeft < visibleWidth || columnGroupLeft > minX) {
1357
+ while (prevColumnIndex >= 0 && (columnGroupRight - columnGroupLeft < visibleWidth || columnGroupLeft > minX)) {
1355
1358
  var _modelColumns$get, _ref3, _userColumnWidths$get;
1356
1359
 
1357
1360
  var prevModelIndex = (_modelColumns$get = modelColumns.get(prevColumnIndex)) !== null && _modelColumns$get !== void 0 ? _modelColumns$get : GridUtils.getModelIndex(prevColumnIndex, movedColumns);
@@ -1369,7 +1372,7 @@ export class GridRenderer {
1369
1372
 
1370
1373
  var nextColumnIndex = columnIndex + 1;
1371
1374
 
1372
- while (columnGroupRight - columnGroupLeft < visibleWidth || columnGroupRight < maxX) {
1375
+ while (nextColumnIndex < columnCount && (columnGroupRight - columnGroupLeft < visibleWidth || columnGroupRight < maxX)) {
1373
1376
  var _modelColumns$get2, _ref4, _userColumnWidths$get2;
1374
1377
 
1375
1378
  var nextModelIndex = (_modelColumns$get2 = modelColumns.get(nextColumnIndex)) !== null && _modelColumns$get2 !== void 0 ? _modelColumns$get2 : GridUtils.getModelIndex(nextColumnIndex, movedColumns);
@@ -1 +1 @@
1
- {"version":3,"file":"GridRenderer.js","names":["clamp","memoizeClear","GridUtils","GridColorUtils","isExpandableGridModel","getOrThrow","isEditableGridModel","GridColumnSeparatorMouseHandler","GridRenderer","context","text","width","fontWidth","truncationChar","truncateToWidth","max","backgroundColors","maxDepth","split","map","color","colors","i","push","darkenForDepth","alpha","colorWithAlpha","truncate","str","len","length","substr","binaryTruncateToWidth","start","end","measureText","charWidth","repeat","Math","floor","lo","hi","min","result","mid","ceil","truncatedStr","DEFAULT_FONT_WIDTH","drawCanvas","state","save","configureContext","drawBackground","drawGrid","drawHeaders","drawFooters","drawDraggingColumn","drawDraggingRow","drawScrollBars","restore","theme","font","textBaseline","lineCap","metrics","height","fillStyle","backgroundColor","fillRect","draggingRow","draggingColumn","gridX","gridY","translate","drawGridBackground","drawCellContents","drawFloatingRows","drawFloatingColumns","floatingTopRowCount","floatingBottomRowCount","floatingRows","rowCount","visibleColumns","visibleRowYs","visibleRowHeights","floatingRowBackgroundColors","drawRowStripesForRows","drawFloatingMouseRowHover","drawGridLinesForItems","floatingGridColumnColor","floatingGridRowColor","drawCellBackgroundsForItems","drawFloatingBorders","drawSelectedRanges","top","bottom","maxY","minY","c","column","r","row","drawCellContent","floatingLeftColumnCount","floatingRightColumnCount","floatingLeftWidth","floatingRightWidth","floatingColumns","maxX","columnCount","visibleRows","visibleColumnXs","visibleColumnWidths","beginPath","rect","clip","left","right","minX","floatingDividerOuterColor","floatingDividerInnerColor","lineWidth","strokeStyle","y","moveTo","lineTo","x","stroke","drawHover","drawRowStripes","drawMouseColumnHover","drawMouseRowHover","drawGridLines","drawCellBackgrounds","has","rowBackgroundColors","rows","model","shadowBlur","shadowColor","colorSets","getCachedBackgroundColors","colorRowMap","Map","topShadowRows","bottomShadowRows","addRowToColorMap","rowAbove","depth","depthForRow","colorSet","set","get","depthAbove","undefined","forEach","colorRows","rowHeight","fill","startColor","getCachedColorWithAlpha","endColor","gradient","createLinearGradient","addColorStop","gradientY","mouseX","mouseY","mouseColumn","getColumnAtX","columnHoverBackgroundColor","columnWidth","rowHoverBackgroundColor","mouseRow","getRowAtY","drawMouseRowHoverForRow","rowFooterWidth","selectedRanges","startRow","endRow","selectedRowHoverBackgroundColor","gridColumnColor","gridRowColor","columns","columnColor","rowColor","drawGridLinesForColumns","drawGridLinesForRows","metricsMaxX","j","rowAfter","drawCellBackground","firstColumn","modelColumns","modelRows","modelRow","modelColumn","backgroundColorForCell","isFirstColumn","hasExpandableRows","drawCellRowTreeDepthLines","drawColumnCellContents","getTextRenderMetrics","textAlign","cellHorizontalPadding","treeDepthIndent","treeHorizontalPadding","treeIndent","textWidth","textX","textY","textOverride","fontWidths","textColor","textForCell","truncationCharForCell","textAlignForCell","colorForCell","truncatedText","getCachedTruncatedString","fillText","drawCellRowTreeMarker","visibleRowTreeBoxes","treeMarkerColor","treeMarkerHoverColor","columnX","rowY","isRowExpandable","treeBox","drawTreeMarker","isRowExpanded","isExpanded","x1","y1","x2","y2","markerText","treeLineColor","depthRowAfter","depthDiff","lineX","headerFont","drawColumnHeaders","drawRowHeaders","drawRowFooters","draggingColumnSeparator","isDragging","columnHeaderHeight","columnHeaderMaxDepth","headerHiddenSeparatorSize","headerHiddenSeparatorHoverColor","headerSeparatorColor","headerSeparatorHoverColor","hiddenSeparatorHeight","hiddenY","containsFrozenColumns","drawColumnHeadersForRange","hiddenColumns","entries","filter","_","w","index","highlightedSeparator","separator","getColumnSeparator","getGridPointFromXY","shouldDrawSeparator","columnIndex","nextColumnIndex","textForColumnHeader","visibleColumnIndex","indexOf","nextColumn","nextColumnWidth","isColumnHidden","isNextColumnHidden","range","bounds","d","drawColumnHeadersAtDepth","calculatedColumnWidths","userColumnWidths","movedColumns","headerBackgroundColor","headerColor","visibleWidth","startIndex","endIndex","drawColumnHeader","separatorColor","drawColumnHeaderAtIndex","columnGroupName","columnGroupColor","colorForColumnHeader","columnGroupLeft","columnGroupRight","prevColumnIndex","prevModelIndex","getModelIndex","prevColumnWidth","nextModelIndex","isFullWidth","columnText","style","headerHorizontalPadding","maxWidth","maxLength","renderText","substring","columnLeft","visibleLeft","columnRight","visibleRight","isBeyondLeft","isBeyondRight","draggingRowSeparator","rowHeaderWidth","hiddenSeparatorWidth","hiddenX","hiddenRows","isPreviousRowHidden","getRowSeparatorIndex","visibleRowIndex","nextRow","nextRowHeight","isRowHidden","isNextRowHidden","drawRowHeader","textForRowHeader","verticalBarWidth","textForRowFooter","viewport","cursorColumn","cursorRow","editingCell","isCursorVisible","isEditable","h","selectedRange","startColumn","endColumn","round","endX","endY","selectionColor","selectionOutlineCasingColor","selectionOutlineColor","drawActiveCell","borderWidth","ACTIVE_CELL_BORDER_WIDTH","cellX","cellY","cellW","cellH","drawRoundedRect","DEFAULT_EDGE_RADIUS","quadraticCurveTo","closePath","draggingColumnVisibleRange","draggingColumnDepth","draggingModelIndex","draggingGroup","getColumnHeaderGroup","originalLeft","originalRight","originalWidth","draggingLeft","reorderOffset","columnHeaderOffset","draggingRowOffset","isDraggingHorizontalScrollBar","isDraggingVerticalScrollBar","scrollBarSize","handleHeight","handleWidth","scrollX","scrollY","hasHorizontalBar","hasVerticalBar","barWidth","barHeight","scrollBarBackgroundColor","scrollBarHoverBackgroundColor","scrollBarCasingColor","scrollBarCornerColor","scrollBarColor","scrollBarHoverColor","scrollBarActiveColor","scrollBarHoverSize","scrollBarCasingWidth","scrollBarSelectionTick","scrollBarSelectionTickColor","scrollBarActiveSelectionTickColor","autoSelectRow","autoSelectColumn","isInbounds","isVerticalBarHover","isHorizontalBarHover","hScrollBarSize","vScrollBarSize","lastLeft","filteredRanges","value","sortedRanges","sort","compareRanges","mergedRanges","mergeSortedRanges","getTickX","tickX","tickWidth","trackHeight","lastTop","getTickY","tickY","trackWidth","tickHeight"],"sources":["../src/GridRenderer.ts"],"sourcesContent":["import clamp from 'lodash.clamp';\nimport memoizeClear from './memoizeClear';\nimport GridUtils from './GridUtils';\nimport GridColorUtils from './GridColorUtils';\nimport { isExpandableGridModel } from './ExpandableGridModel';\nimport {\n GridColor,\n GridColorWay,\n GridTheme,\n NullableGridColor,\n} from './GridTheme';\nimport GridModel from './GridModel';\nimport GridRange from './GridRange';\nimport GridMetrics, {\n BoxCoordinates,\n Coordinate,\n VisibleIndex,\n} from './GridMetrics';\nimport { getOrThrow } from './GridMetricCalculator';\nimport { isEditableGridModel } from './EditableGridModel';\nimport type { GridSeparator } from './mouse-handlers/GridSeparatorMouseHandler';\nimport { DraggingColumn } from './mouse-handlers/GridColumnMoveMouseHandler';\nimport GridColumnSeparatorMouseHandler from './mouse-handlers/GridColumnSeparatorMouseHandler';\nimport { BoundedAxisRange } from './GridAxisRange';\n\nexport type EditingCellTextSelectionRange = [start: number, end: number];\n\ntype NoneNullColumnRange = { startColumn: number; endColumn: number };\n\ntype NoneNullRowRange = { startRow: number; endRow: number };\n\nexport type EditingCell = {\n // Index of the editing cell\n column: VisibleIndex;\n row: VisibleIndex;\n\n // Selection within the text\n selectionRange?: EditingCellTextSelectionRange;\n\n // The value to use for the edit\n value: string;\n\n // Whether the selection was triggered with a quick edit action (e.g. Start typing with the cell in focus)\n isQuickEdit?: boolean;\n};\n\nexport type GridRenderState = {\n // The top/left cell of the scrolled viewport\n left: VisibleIndex;\n top: VisibleIndex;\n\n // Width and height of the total canvas area\n width: number;\n height: number;\n\n // The canvas context\n context: CanvasRenderingContext2D;\n\n // The grid theme\n theme: GridTheme;\n\n // The model used by the grid\n model: GridModel;\n\n // The grid metrics\n metrics: GridMetrics;\n\n // Location of the mouse on the grid\n mouseX: Coordinate | null;\n mouseY: Coordinate | null;\n\n // Where the keyboard cursor is located\n cursorColumn: VisibleIndex | null;\n cursorRow: VisibleIndex | null;\n\n // Currently selected ranges\n selectedRanges: GridRange[];\n\n // Currently dragged column/row information\n draggingColumn: DraggingColumn | null;\n draggingColumnSeparator: GridSeparator | null;\n draggingRow: VisibleIndex | null;\n draggingRowOffset: number | null;\n draggingRowSeparator: GridSeparator | null;\n\n // The currently editing cell\n editingCell: EditingCell | null;\n isDraggingHorizontalScrollBar: boolean;\n isDraggingVerticalScrollBar: boolean;\n isDragging: boolean;\n};\n\n/* eslint react/destructuring-assignment: \"off\" */\n/* eslint class-methods-use-this: \"off\" */\n/* eslint no-param-reassign: \"off\" */\n/**\n * A GridRenderer handles rendering the different parts of the grid\n * This default rendering just renders a basic grid. Extend this class and implement\n * your own methods to customize drawing of the grid (eg. Draw icons or special features)\n */\nexport class GridRenderer {\n // Default font width in pixels if it cannot be retrieved from the context\n static DEFAULT_FONT_WIDTH = 10;\n\n // Default radius in pixels for corners for some elements (like the active cell)\n static DEFAULT_EDGE_RADIUS = 2;\n\n // Default width in pixels for the border of the active cell\n static ACTIVE_CELL_BORDER_WIDTH = 2;\n\n /**\n * Truncate a string to the specified length and add ellipses if necessary\n * @param str The string to truncate\n * @param len The length to truncate the string to. If longer than the actual string, just returns the string\n * @returns The truncated string\n */\n static truncate(str: string, len: number): string {\n if (len < str.length) {\n // eslint-disable-next-line prefer-template\n return str.substr(0, len) + '…';\n }\n return str;\n }\n\n /**\n * Uses binary search to truncate a string to fit in the provided width\n * @param context The drawing context to measure the text in\n * @param str The string to get the maximum length it can draw\n * @param width The width to truncate it to\n * @param start The low boundary to start the search\n * @param end The high boundary to start the search\n * @param truncationChar This char will be repeated as the display string if the string is truncated instead of just adding an ellipsis\n * @returns The truncated string\n */\n static binaryTruncateToWidth(\n context: CanvasRenderingContext2D,\n str: string,\n width: number,\n start = 0,\n end = str.length,\n truncationChar?: string\n ): string {\n if (end >= str.length && context.measureText(str).width <= width) {\n // IDS-6069 If the whole string can fit, don't bother checking for truncation\n // The ellipses are actually slightly wider than other chars, and it's possible\n // that the \"truncation\" ends up being slightly longer, which messes up the search\n // algorithm below.\n // Besides, if we already fit, it's just faster to not bother checking other truncations.\n return str;\n }\n\n if (truncationChar) {\n const charWidth = context.measureText(truncationChar).width;\n return truncationChar.repeat(Math.max(1, Math.floor(width / charWidth)));\n }\n\n let lo = start;\n let hi = Math.min(str.length - 1, end);\n let result = str;\n while (hi >= lo) {\n const mid = Math.ceil((hi + lo) / 2);\n const truncatedStr = GridRenderer.truncate(str, mid);\n if (context.measureText(truncatedStr).width <= width) {\n result = truncatedStr;\n if (lo === mid) {\n break;\n }\n lo = mid;\n } else if (mid === 0) {\n // We already truncated to zero chars and it still doesn't fit, no need to keep looking\n result = truncatedStr;\n break;\n } else {\n hi = mid - 1;\n }\n }\n\n return result;\n }\n\n /**\n * Truncate a string (if necessary) to fit in the specified width.\n * First uses the estimated font width to calculate a lower/upper bound\n * Then uses binary search within those bounds to find the exact max length\n * @param context The drawing context\n * @param str The string to calculate max length for\n * @param width The width to truncate within\n * @param fontWidth The estimated width of each character\n * @param truncationChar This char will be repeated as the display string if the string is truncated instead of just adding an ellipsis\n * @returns The truncated string that fits within the width provided\n */\n static truncateToWidth(\n context: CanvasRenderingContext2D,\n str: string,\n width: number,\n fontWidth = GridRenderer.DEFAULT_FONT_WIDTH,\n truncationChar?: string\n ): string {\n if (width <= 0 || str.length <= 0) {\n return '';\n }\n\n // Estimate the possible low and high boundaries for truncating the text\n // Use the width of the space divided by the estimated width of each character,\n // and take half that as the low (minus 5 just to be extra safe), and double that as the high.\n const lo = Math.min(\n Math.max(0, Math.floor(width / fontWidth / 2) - 5),\n str.length\n );\n const hi = Math.min(Math.ceil((width / fontWidth) * 2), str.length);\n\n return GridRenderer.binaryTruncateToWidth(\n context,\n str,\n width,\n lo,\n hi,\n truncationChar\n );\n }\n\n /**\n * Draw the grid canvas with the state provided\n * @param state The state of the grid\n */\n drawCanvas(state: GridRenderState): void {\n const { context } = state;\n\n context.save();\n\n this.configureContext(context, state);\n\n this.drawBackground(context, state);\n\n this.drawGrid(context, state);\n\n this.drawHeaders(context, state);\n\n this.drawFooters(context, state);\n\n this.drawDraggingColumn(context, state);\n\n this.drawDraggingRow(context, state);\n\n this.drawScrollBars(context, state);\n\n context.restore();\n }\n\n configureContext(\n context: CanvasRenderingContext2D,\n state: GridRenderState\n ): void {\n const { theme } = state;\n context.font = theme.font;\n context.textBaseline = 'middle';\n context.lineCap = 'butt';\n }\n\n drawBackground(\n context: CanvasRenderingContext2D,\n state: GridRenderState\n ): void {\n const { theme, metrics } = state;\n const { width, height } = metrics;\n context.fillStyle = theme.backgroundColor;\n context.fillRect(0, 0, width, height);\n }\n\n drawGrid(context: CanvasRenderingContext2D, state: GridRenderState): void {\n const { metrics, draggingRow, draggingColumn } = state;\n const { gridX, gridY } = metrics;\n\n context.translate(gridX, gridY);\n\n this.drawGridBackground(\n context,\n state,\n draggingRow == null && draggingColumn == null\n );\n\n this.drawCellContents(context, state);\n\n this.drawFloatingRows(context, state);\n\n this.drawFloatingColumns(context, state);\n\n context.translate(-gridX, -gridY);\n }\n\n drawFloatingRows(\n context: CanvasRenderingContext2D,\n state: GridRenderState\n ): void {\n const { draggingRow, draggingColumn, metrics, theme } = state;\n const {\n floatingTopRowCount,\n floatingBottomRowCount,\n floatingRows,\n rowCount,\n visibleColumns,\n visibleRowYs,\n visibleRowHeights,\n } = metrics;\n\n if (floatingRows.length === 0) {\n return;\n }\n\n if (theme.floatingRowBackgroundColors) {\n this.drawRowStripesForRows(\n context,\n state,\n floatingRows,\n theme.floatingRowBackgroundColors\n );\n }\n\n if (draggingRow == null && draggingColumn == null) {\n this.drawFloatingMouseRowHover(context, state);\n }\n\n this.drawGridLinesForItems(\n context,\n state,\n visibleColumns,\n floatingRows,\n theme.floatingGridColumnColor,\n theme.floatingGridRowColor\n );\n\n this.drawCellBackgroundsForItems(\n context,\n state,\n visibleColumns,\n floatingRows\n );\n\n this.drawFloatingBorders(context, state);\n\n // Draw the floating row selection...\n if (floatingTopRowCount > 0) {\n this.drawSelectedRanges(context, state, {\n top: 0,\n bottom: floatingTopRowCount - 1,\n maxY:\n getOrThrow(visibleRowYs, floatingTopRowCount - 1) +\n getOrThrow(visibleRowHeights, floatingTopRowCount - 1) -\n 0.5,\n });\n }\n if (floatingBottomRowCount > 0) {\n this.drawSelectedRanges(context, state, {\n top: rowCount - floatingBottomRowCount - 1,\n bottom: rowCount - 1,\n minY: getOrThrow(visibleRowYs, rowCount - floatingBottomRowCount) + 0.5,\n maxY:\n getOrThrow(visibleRowYs, rowCount - 1) +\n getOrThrow(visibleRowHeights, rowCount - 1) -\n 0.5,\n });\n }\n\n // Draw the cell content...\n for (let c = 0; c < visibleColumns.length; c += 1) {\n const column = visibleColumns[c];\n for (let r = 0; r < floatingRows.length; r += 1) {\n const row = floatingRows[r];\n this.drawCellContent(context, state, column, row);\n }\n }\n }\n\n drawFloatingColumns(\n context: CanvasRenderingContext2D,\n state: GridRenderState\n ): void {\n const { draggingRow, draggingColumn, metrics, theme } = state;\n const {\n floatingLeftColumnCount,\n floatingRightColumnCount,\n floatingLeftWidth,\n floatingRightWidth,\n floatingColumns,\n gridX,\n maxX,\n columnCount,\n visibleRows,\n visibleColumnXs,\n visibleColumnWidths,\n width,\n height,\n } = metrics;\n\n if (floatingColumns.length === 0) {\n return;\n }\n\n if (theme.floatingRowBackgroundColors) {\n this.drawRowStripesForRows(\n context,\n state,\n visibleRows,\n theme.floatingRowBackgroundColors,\n 0,\n floatingLeftWidth\n );\n this.drawRowStripesForRows(\n context,\n state,\n visibleRows,\n theme.floatingRowBackgroundColors,\n width - gridX - floatingRightWidth,\n maxX\n );\n }\n\n if (draggingRow == null && draggingColumn == null) {\n this.drawFloatingMouseRowHover(context, state);\n }\n\n // Clip floated column grid lines.\n context.save();\n context.beginPath();\n context.rect(0, 0, floatingLeftWidth, height);\n context.clip();\n\n this.drawGridLinesForItems(\n context,\n state,\n floatingColumns,\n visibleRows,\n theme.floatingGridColumnColor,\n theme.floatingGridRowColor\n );\n\n context.restore();\n\n this.drawCellBackgroundsForItems(\n context,\n state,\n floatingColumns,\n visibleRows\n );\n\n this.drawFloatingBorders(context, state);\n\n // Draw the floating column selection...\n if (floatingLeftColumnCount > 0) {\n this.drawSelectedRanges(context, state, {\n left: 0,\n maxX:\n getOrThrow(visibleColumnXs, floatingLeftColumnCount - 1) +\n getOrThrow(visibleColumnWidths, floatingLeftColumnCount - 1),\n });\n }\n if (floatingRightColumnCount > 0) {\n this.drawSelectedRanges(context, state, {\n left: columnCount - floatingRightColumnCount,\n right: columnCount - 1,\n minX:\n getOrThrow(visibleColumnXs, columnCount - floatingRightColumnCount) +\n 0.5,\n maxX:\n getOrThrow(visibleColumnXs, columnCount - 1) +\n getOrThrow(visibleColumnWidths, columnCount - 1),\n });\n }\n\n // Draw the cell content...\n for (let c = 0; c < floatingColumns.length; c += 1) {\n const column = floatingColumns[c];\n for (let r = 0; r < visibleRows.length; r += 1) {\n const row = visibleRows[r];\n this.drawCellContent(context, state, column, row);\n }\n }\n }\n\n drawFloatingBorders(\n context: CanvasRenderingContext2D,\n state: GridRenderState\n ): void {\n const { metrics, theme } = state;\n const {\n floatingTopRowCount,\n floatingBottomRowCount,\n floatingLeftColumnCount,\n floatingRightColumnCount,\n rowCount,\n columnCount,\n visibleRowYs,\n visibleColumnXs,\n visibleRowHeights,\n visibleColumnWidths,\n maxX,\n maxY,\n } = metrics;\n const { floatingDividerOuterColor, floatingDividerInnerColor } = theme;\n\n context.lineWidth = 3;\n context.beginPath();\n context.strokeStyle = floatingDividerOuterColor;\n\n if (floatingTopRowCount > 0) {\n const y =\n getOrThrow(visibleRowYs, floatingTopRowCount - 1) +\n getOrThrow(visibleRowHeights, floatingTopRowCount - 1) +\n 0.5;\n context.moveTo(0, y);\n context.lineTo(maxX, y);\n }\n\n if (floatingBottomRowCount > 0) {\n const y =\n getOrThrow(visibleRowYs, rowCount - floatingBottomRowCount) - 0.5;\n context.moveTo(0, y);\n context.lineTo(maxX, y);\n }\n\n if (floatingLeftColumnCount > 0) {\n const x =\n getOrThrow(visibleColumnXs, floatingLeftColumnCount - 1) +\n getOrThrow(visibleColumnWidths, floatingLeftColumnCount - 1) +\n 0.5;\n context.moveTo(x, 0);\n context.lineTo(x, maxY);\n }\n\n if (floatingRightColumnCount > 0) {\n const x =\n getOrThrow(visibleColumnXs, columnCount - floatingRightColumnCount) -\n 0.5;\n context.moveTo(x, 0);\n context.lineTo(x, maxY);\n }\n\n context.stroke();\n\n context.beginPath();\n context.lineWidth = 1;\n context.strokeStyle = floatingDividerInnerColor;\n\n if (floatingTopRowCount > 0) {\n const y =\n getOrThrow(visibleRowYs, floatingTopRowCount - 1) +\n getOrThrow(visibleRowHeights, floatingTopRowCount - 1) +\n 0.5;\n context.moveTo(0, y);\n context.lineTo(maxX, y);\n }\n\n if (floatingBottomRowCount > 0) {\n const y =\n getOrThrow(visibleRowYs, rowCount - floatingBottomRowCount) - 0.5;\n context.moveTo(0, y);\n context.lineTo(maxX, y);\n }\n\n if (floatingLeftColumnCount > 0) {\n const x =\n getOrThrow(visibleColumnXs, floatingLeftColumnCount - 1) +\n getOrThrow(visibleColumnWidths, floatingLeftColumnCount - 1) +\n 0.5;\n context.moveTo(x, 0);\n context.lineTo(x, maxY);\n }\n\n if (floatingRightColumnCount > 0) {\n const x =\n getOrThrow(visibleColumnXs, columnCount - floatingRightColumnCount) -\n 0.5;\n context.moveTo(x, 0);\n context.lineTo(x, maxY);\n }\n\n context.stroke();\n }\n\n drawGridBackground(\n context: CanvasRenderingContext2D,\n state: GridRenderState,\n drawHover = false\n ): void {\n this.drawRowStripes(context, state);\n\n if (drawHover) {\n this.drawMouseColumnHover(context, state);\n\n this.drawMouseRowHover(context, state);\n }\n\n this.drawGridLines(context, state);\n\n this.drawCellBackgrounds(context, state);\n\n const { metrics } = state;\n const {\n bottom,\n right,\n floatingBottomRowCount,\n floatingLeftColumnCount,\n floatingRightColumnCount,\n floatingTopRowCount,\n columnCount,\n rowCount,\n visibleRowHeights,\n visibleRowYs,\n visibleColumnXs,\n visibleColumnWidths,\n width,\n height,\n } = metrics;\n this.drawSelectedRanges(context, state, {\n bottom: Math.min(bottom, rowCount - floatingBottomRowCount - 1),\n right: Math.min(right, columnCount - floatingRightColumnCount - 1),\n minX:\n floatingLeftColumnCount > 0 &&\n visibleColumnXs.has(floatingLeftColumnCount + 1)\n ? getOrThrow(visibleColumnXs, floatingLeftColumnCount + 1)\n : -10,\n minY:\n floatingTopRowCount > 0 && visibleRowYs.has(floatingTopRowCount + 1)\n ? getOrThrow(visibleRowYs, floatingTopRowCount + 1)\n : -10,\n maxX:\n floatingRightColumnCount > 0 &&\n visibleColumnXs.has(columnCount - floatingRightColumnCount - 1)\n ? getOrThrow(\n visibleColumnXs,\n columnCount - floatingRightColumnCount - 1\n ) +\n getOrThrow(\n visibleColumnWidths,\n columnCount - floatingRightColumnCount - 1\n ) -\n 0.5\n : width + 10,\n maxY:\n floatingBottomRowCount > 0 &&\n visibleRowYs.has(rowCount - floatingBottomRowCount - 1)\n ? getOrThrow(visibleRowYs, rowCount - floatingBottomRowCount - 1) +\n getOrThrow(\n visibleRowHeights,\n rowCount - floatingBottomRowCount - 1\n ) -\n 0.5\n : height + 10,\n });\n }\n\n drawRowStripes(\n context: CanvasRenderingContext2D,\n state: GridRenderState\n ): void {\n const { metrics, theme } = state;\n const { visibleRows } = metrics;\n const { rowBackgroundColors } = theme;\n if (!rowBackgroundColors) {\n return;\n }\n this.drawRowStripesForRows(\n context,\n state,\n visibleRows,\n rowBackgroundColors\n );\n }\n\n drawRowStripesForRows(\n context: CanvasRenderingContext2D,\n state: GridRenderState,\n rows: VisibleIndex[],\n rowBackgroundColors: GridColorWay,\n minX = 0,\n maxX = state.metrics.maxX\n ): void {\n const { theme, metrics, model } = state;\n const { maxDepth, shadowBlur, shadowColor } = theme;\n\n const colorSets = this.getCachedBackgroundColors(\n rowBackgroundColors,\n maxDepth\n );\n const { visibleRowYs, visibleRowHeights } = metrics;\n\n // Optimize by grouping together all rows that end up with the same color\n const colorRowMap = new Map();\n const topShadowRows: VisibleIndex[] = []; // Rows that are deeper than the row above them\n const bottomShadowRows: VisibleIndex[] = [];\n const addRowToColorMap = (\n row: VisibleIndex,\n rowAbove?: VisibleIndex\n ): void => {\n const depth = isExpandableGridModel(model) ? model.depthForRow(row) : 0;\n const colorSet = colorSets[row % colorSets.length];\n const color = colorSet[Math.min(depth, colorSet.length - 1)];\n if (!colorRowMap.has(color)) {\n colorRowMap.set(color, []);\n }\n colorRowMap.get(color).push(row);\n if (rowAbove != null) {\n const depthAbove = isExpandableGridModel(model)\n ? model.depthForRow(rowAbove)\n : 0;\n if (depthAbove < depth) {\n topShadowRows.push(row);\n } else if (depthAbove > depth) {\n bottomShadowRows.push(rowAbove);\n }\n }\n };\n\n // Add all the regular row stripes\n for (let i = 0; i < rows.length; i += 1) {\n const row = rows[i];\n const rowAbove = i > 0 ? rows[i - 1] : undefined;\n addRowToColorMap(row, rowAbove);\n }\n\n colorRowMap.forEach((colorRows, color) => {\n context.fillStyle = color;\n\n context.beginPath();\n\n for (let i = 0; i < colorRows.length; i += 1) {\n const row = colorRows[i];\n const y = getOrThrow(visibleRowYs, row);\n const rowHeight = getOrThrow(visibleRowHeights, row);\n context.rect(minX, y, maxX, rowHeight);\n }\n\n context.fill();\n });\n\n if (topShadowRows.length > 0) {\n context.save();\n\n const startColor = this.getCachedColorWithAlpha(shadowColor, 0.15);\n const endColor = this.getCachedColorWithAlpha(shadowColor, 0);\n const gradient = context.createLinearGradient(0, 0, 0, shadowBlur);\n gradient.addColorStop(0, startColor);\n gradient.addColorStop(1, endColor);\n context.fillStyle = gradient;\n\n for (let i = 0; i < topShadowRows.length; i += 1) {\n const row = topShadowRows[i];\n const y = getOrThrow(visibleRowYs, row);\n // Use a translate so we can reuse the gradient\n context.translate(0, y);\n context.fillRect(minX, 0, maxX, shadowBlur);\n context.translate(0, -y);\n }\n\n context.restore();\n }\n\n if (bottomShadowRows.length > 0) {\n context.save();\n\n const startColor = this.getCachedColorWithAlpha(shadowColor, 0);\n const endColor = this.getCachedColorWithAlpha(shadowColor, 0.15);\n const gradient = context.createLinearGradient(0, 0, 0, shadowBlur);\n gradient.addColorStop(0, startColor);\n gradient.addColorStop(1, endColor);\n context.fillStyle = gradient;\n\n for (let i = 0; i < bottomShadowRows.length; i += 1) {\n const row = bottomShadowRows[i];\n const y = getOrThrow(visibleRowYs, row);\n const rowHeight = getOrThrow(visibleRowHeights, row);\n const gradientY = y + rowHeight - shadowBlur;\n // Use a translate so we can reuse the gradient\n context.translate(0, gradientY);\n context.fillRect(minX, 0, maxX, shadowBlur);\n context.translate(0, -gradientY);\n }\n\n context.restore();\n }\n }\n\n drawMouseColumnHover(\n context: CanvasRenderingContext2D,\n state: GridRenderState\n ): void {\n const { mouseX, mouseY, theme, metrics } = state;\n if (mouseX == null || mouseY == null) return;\n\n const mouseColumn = GridUtils.getColumnAtX(mouseX, metrics);\n if (mouseColumn == null || !theme.columnHoverBackgroundColor) {\n return;\n }\n\n const { visibleColumnWidths, visibleColumnXs, maxY } = metrics;\n if (mouseY > maxY) {\n return;\n }\n\n const x = getOrThrow(visibleColumnXs, mouseColumn);\n const columnWidth = getOrThrow(visibleColumnWidths, mouseColumn);\n\n context.fillStyle = theme.columnHoverBackgroundColor;\n context.fillRect(x, 0, columnWidth, maxY);\n }\n\n drawMouseRowHover(\n context: CanvasRenderingContext2D,\n state: GridRenderState\n ): void {\n const { mouseX, mouseY, theme, metrics } = state;\n if (mouseX == null || mouseY == null) return;\n\n const { maxX } = metrics;\n if (mouseX > maxX || !theme.rowHoverBackgroundColor) {\n return;\n }\n\n const mouseRow = GridUtils.getRowAtY(mouseY, metrics);\n if (mouseRow == null) {\n return;\n }\n\n this.drawMouseRowHoverForRow(context, state, mouseRow);\n }\n\n drawFloatingMouseRowHover(\n context: CanvasRenderingContext2D,\n state: GridRenderState\n ): void {\n const { mouseX, mouseY, theme, metrics } = state;\n const {\n maxX,\n floatingTopRowCount,\n floatingBottomRowCount,\n rowCount,\n rowFooterWidth,\n } = metrics;\n if (\n mouseX == null ||\n mouseY == null ||\n mouseX > maxX + rowFooterWidth ||\n !theme.rowHoverBackgroundColor\n ) {\n return;\n }\n\n const mouseRow = GridUtils.getRowAtY(mouseY, metrics);\n if (\n mouseRow != null &&\n (mouseRow < floatingTopRowCount ||\n rowCount - floatingBottomRowCount <= mouseRow)\n ) {\n this.drawMouseRowHoverForRow(context, state, mouseRow);\n }\n }\n\n drawMouseRowHoverForRow(\n context: CanvasRenderingContext2D,\n state: GridRenderState,\n row: VisibleIndex\n ): void {\n const { metrics, selectedRanges, theme } = state;\n const { visibleRowHeights, visibleRowYs, maxX } = metrics;\n\n const y = getOrThrow(visibleRowYs, row);\n const rowHeight = getOrThrow(visibleRowHeights, row);\n\n if (theme.rowHoverBackgroundColor) {\n context.fillStyle = theme.rowHoverBackgroundColor;\n }\n for (let i = 0; i < selectedRanges.length; i += 1) {\n const { startRow, endRow } = selectedRanges[i];\n if (\n startRow != null &&\n endRow != null &&\n startRow <= row &&\n endRow >= row\n ) {\n if (theme.selectedRowHoverBackgroundColor) {\n context.fillStyle = theme.selectedRowHoverBackgroundColor;\n }\n break;\n }\n }\n context.fillRect(0, y, maxX, rowHeight);\n }\n\n drawGridLines(\n context: CanvasRenderingContext2D,\n state: GridRenderState\n ): void {\n const { metrics, theme } = state;\n const { visibleColumns, visibleRows } = metrics;\n\n this.drawGridLinesForItems(\n context,\n state,\n visibleColumns,\n visibleRows,\n theme.gridColumnColor,\n theme.gridRowColor\n );\n }\n\n drawGridLinesForItems(\n context: CanvasRenderingContext2D,\n state: GridRenderState,\n columns: VisibleIndex[],\n rows: VisibleIndex[],\n columnColor: NullableGridColor,\n rowColor: NullableGridColor\n ): void {\n if (!columnColor && !rowColor) {\n return;\n }\n\n context.lineWidth = 1;\n context.beginPath();\n\n if (columnColor) {\n context.strokeStyle = columnColor;\n this.drawGridLinesForColumns(context, state, columns);\n }\n if (rowColor) {\n context.strokeStyle = rowColor;\n this.drawGridLinesForRows(context, state, rows);\n }\n\n context.stroke();\n }\n\n drawGridLinesForColumns(\n context: CanvasRenderingContext2D,\n state: GridRenderState,\n columns: VisibleIndex[]\n ): void {\n const { metrics } = state;\n const { visibleColumnXs, maxY } = metrics;\n for (let i = 0; i < columns.length; i += 1) {\n const column = columns[i];\n const x = getOrThrow(visibleColumnXs, column) + 0.5;\n context.moveTo(x, 0);\n context.lineTo(x, maxY);\n }\n }\n\n drawGridLinesForRows(\n context: CanvasRenderingContext2D,\n state: GridRenderState,\n rows: VisibleIndex[]\n ): void {\n const { metrics } = state;\n const { visibleRowYs, maxX: metricsMaxX } = metrics;\n const maxX = metricsMaxX;\n\n // Draw row lines\n for (let i = 0; i < rows.length; i += 1) {\n const row = rows[i];\n const y = getOrThrow(visibleRowYs, row) + 0.5;\n context.moveTo(0.5, y);\n context.lineTo(maxX - 0.5, y);\n }\n }\n\n drawCellBackgrounds(\n context: CanvasRenderingContext2D,\n state: GridRenderState\n ): void {\n const { metrics } = state;\n const { visibleColumns, visibleRows } = metrics;\n this.drawCellBackgroundsForItems(\n context,\n state,\n visibleColumns,\n visibleRows\n );\n }\n\n drawCellBackgroundsForItems(\n context: CanvasRenderingContext2D,\n state: GridRenderState,\n columns: VisibleIndex[],\n rows: VisibleIndex[]\n ): void {\n context.save();\n\n for (let i = 0; i < columns.length; i += 1) {\n const column = columns[i];\n\n for (let j = 0; j < rows.length; j += 1) {\n const row = rows[j];\n const rowAfter = j + 1 < rows.length ? rows[j + 1] : undefined;\n this.drawCellBackground(context, state, column, row, rowAfter);\n }\n }\n\n context.restore();\n }\n\n drawCellBackground(\n context: CanvasRenderingContext2D,\n state: GridRenderState,\n column: VisibleIndex,\n row: VisibleIndex,\n rowAfter?: VisibleIndex\n ): void {\n const { metrics, model, theme } = state;\n const {\n firstColumn,\n modelColumns,\n modelRows,\n visibleColumnXs,\n visibleColumnWidths,\n visibleRowYs,\n visibleRowHeights,\n } = metrics;\n const modelRow = getOrThrow(modelRows, row);\n const modelColumn = getOrThrow(modelColumns, column);\n const backgroundColor = model.backgroundColorForCell(\n modelColumn,\n modelRow,\n theme\n );\n const isFirstColumn = column === firstColumn;\n const hasExpandableRows =\n isExpandableGridModel(model) && model.hasExpandableRows;\n\n if (backgroundColor) {\n const x = getOrThrow(visibleColumnXs, column) + 1;\n const y = getOrThrow(visibleRowYs, row) + 1;\n const columnWidth = getOrThrow(visibleColumnWidths, column) - 1;\n const rowHeight = getOrThrow(visibleRowHeights, row) - 1;\n context.fillStyle = backgroundColor;\n context.fillRect(x, y, columnWidth, rowHeight);\n }\n\n if (isFirstColumn && hasExpandableRows) {\n this.drawCellRowTreeDepthLines(context, state, row, rowAfter);\n }\n }\n\n drawCellContents(\n context: CanvasRenderingContext2D,\n state: GridRenderState\n ): void {\n const { metrics } = state;\n const { visibleColumns } = metrics;\n\n for (let i = 0; i < visibleColumns.length; i += 1) {\n const column = visibleColumns[i];\n this.drawColumnCellContents(context, state, column);\n }\n }\n\n drawColumnCellContents(\n context: CanvasRenderingContext2D,\n state: GridRenderState,\n column: VisibleIndex\n ): void {\n const { metrics } = state;\n const {\n visibleColumnXs,\n visibleColumnWidths,\n visibleRows,\n height,\n } = metrics;\n const x = getOrThrow(visibleColumnXs, column);\n const columnWidth = getOrThrow(visibleColumnWidths, column);\n\n context.save();\n\n context.beginPath();\n context.rect(x, 0, columnWidth, height);\n context.clip();\n\n for (let i = 0; i < visibleRows.length; i += 1) {\n const row = visibleRows[i];\n this.drawCellContent(context, state, column, row);\n }\n context.restore();\n }\n\n /**\n * Gets textWidth and X-Y position for a specific cell\n * The textWidth returned is the width that the text can occupy accounting for any other cell markings\n * The width accounts for tree table indents and cell padding, so it is the width the text may consume\n *\n * @param context Canvas context\n * @param state GridRenderState to get the text metrics for\n * @param column Column of cell to get text metrics for\n * @param row Row of cell to get text metrics for\n * @returns Object with width, x, and y of the text\n */\n getTextRenderMetrics(\n context: CanvasRenderingContext2D,\n state: GridRenderState,\n column: VisibleIndex,\n row: VisibleIndex\n ): {\n width: number;\n x: number;\n y: number;\n } {\n const { textAlign } = context;\n const { metrics, model, theme } = state;\n const {\n firstColumn,\n visibleColumnXs,\n visibleColumnWidths,\n visibleRowYs,\n visibleRowHeights,\n } = metrics;\n const {\n cellHorizontalPadding,\n treeDepthIndent,\n treeHorizontalPadding,\n } = theme;\n\n const x = getOrThrow(visibleColumnXs, column);\n const y = getOrThrow(visibleRowYs, row);\n const columnWidth = getOrThrow(visibleColumnWidths, column);\n const rowHeight = getOrThrow(visibleRowHeights, row);\n const isFirstColumn = column === firstColumn;\n let treeIndent = 0;\n if (\n isExpandableGridModel(model) &&\n model.hasExpandableRows &&\n isFirstColumn\n ) {\n treeIndent =\n treeDepthIndent * (model.depthForRow(row) + 1) + treeHorizontalPadding;\n }\n const textWidth = columnWidth - treeIndent;\n let textX = x + cellHorizontalPadding;\n const textY = y + rowHeight * 0.5;\n if (textAlign === 'right') {\n textX = x + textWidth - cellHorizontalPadding;\n } else if (textAlign === 'center') {\n textX = x + textWidth * 0.5;\n }\n textX += treeIndent;\n\n return {\n width: textWidth - cellHorizontalPadding * 2,\n x: textX,\n y: textY,\n };\n }\n\n drawCellContent(\n context: CanvasRenderingContext2D,\n state: GridRenderState,\n column: VisibleIndex,\n row: VisibleIndex,\n textOverride?: string\n ): void {\n const { metrics, model, theme } = state;\n const {\n firstColumn,\n fontWidths,\n modelColumns,\n modelRows,\n visibleRowHeights,\n } = metrics;\n const { textColor } = theme;\n const rowHeight = getOrThrow(visibleRowHeights, row);\n const modelRow = getOrThrow(modelRows, row);\n const modelColumn = getOrThrow(modelColumns, column);\n const text = textOverride ?? model.textForCell(modelColumn, modelRow);\n const truncationChar = model.truncationCharForCell(modelColumn, modelRow);\n const isFirstColumn = column === firstColumn;\n\n if (text && rowHeight > 0) {\n const textAlign = model.textAlignForCell(modelColumn, modelRow) || 'left';\n context.textAlign = textAlign;\n\n const color =\n model.colorForCell(modelColumn, modelRow, theme) || textColor;\n context.fillStyle = color;\n\n const {\n width: textWidth,\n x: textX,\n y: textY,\n } = this.getTextRenderMetrics(context, state, column, row);\n\n const fontWidth =\n fontWidths.get(context.font) ?? GridRenderer.DEFAULT_FONT_WIDTH;\n const truncatedText = this.getCachedTruncatedString(\n context,\n text,\n textWidth,\n fontWidth,\n truncationChar\n );\n if (truncatedText) {\n context.fillText(truncatedText, textX, textY);\n }\n }\n\n if (\n isFirstColumn &&\n isExpandableGridModel(model) &&\n model.hasExpandableRows\n ) {\n this.drawCellRowTreeMarker(context, state, row);\n }\n }\n\n drawCellRowTreeMarker(\n context: CanvasRenderingContext2D,\n state: GridRenderState,\n row: VisibleIndex\n ): void {\n const { metrics, model, mouseX, mouseY, theme } = state;\n const {\n firstColumn,\n gridX,\n gridY,\n visibleColumnXs,\n visibleColumnWidths,\n visibleRowYs,\n visibleRowHeights,\n visibleRowTreeBoxes,\n } = metrics;\n const { treeMarkerColor, treeMarkerHoverColor } = theme;\n const columnX = getOrThrow(visibleColumnXs, firstColumn);\n const columnWidth = getOrThrow(visibleColumnWidths, firstColumn);\n const rowY = getOrThrow(visibleRowYs, row);\n const rowHeight = getOrThrow(visibleRowHeights, row);\n if (!isExpandableGridModel(model) || !model.isRowExpandable(row)) {\n return;\n }\n\n const treeBox = getOrThrow(visibleRowTreeBoxes, row);\n const color =\n mouseX != null &&\n mouseY != null &&\n mouseX >= gridX + columnX &&\n mouseX <= gridX + columnX + columnWidth &&\n mouseY >= gridY + rowY &&\n mouseY <= gridY + rowY + rowHeight\n ? treeMarkerHoverColor\n : treeMarkerColor;\n\n this.drawTreeMarker(\n context,\n state,\n columnX,\n rowY,\n treeBox,\n color,\n model.isRowExpanded(row)\n );\n }\n\n drawTreeMarker(\n context: CanvasRenderingContext2D,\n state: GridRenderState,\n columnX: Coordinate,\n rowY: Coordinate,\n treeBox: BoxCoordinates,\n color: GridColor,\n isExpanded: boolean\n ): void {\n const { x1, y1, x2, y2 } = treeBox;\n const markerText = isExpanded ? '⊟' : '⊞';\n const textX = columnX + (x1 + x2) * 0.5 + 0.5;\n const textY = rowY + (y1 + y2) * 0.5 + 0.5;\n context.fillStyle = color;\n context.textAlign = 'center';\n context.fillText(markerText, textX, textY);\n }\n\n drawCellRowTreeDepthLines(\n context: CanvasRenderingContext2D,\n state: GridRenderState,\n row: VisibleIndex,\n rowAfter?: VisibleIndex\n ): void {\n const { metrics, model, theme } = state;\n\n if (!isExpandableGridModel(model)) return;\n\n const depth = model.depthForRow(row);\n if (depth === 0) return;\n\n const {\n firstColumn,\n visibleColumnXs,\n visibleRowYs,\n visibleRowHeights,\n } = metrics;\n const { treeDepthIndent, treeHorizontalPadding, treeLineColor } = theme;\n const columnX = getOrThrow(visibleColumnXs, firstColumn);\n const rowY = getOrThrow(visibleRowYs, row);\n const rowHeight = getOrThrow(visibleRowHeights, row);\n const depthRowAfter =\n rowAfter !== undefined ? model.depthForRow(rowAfter) : 0;\n const depthDiff = depth > depthRowAfter ? depth - depthRowAfter : 0;\n\n context.strokeStyle = treeLineColor;\n context.lineWidth = 1;\n\n // draw normal depth lines\n if (depth - depthDiff > 0) {\n context.beginPath();\n for (let i = 0; i < depth - depthDiff; i += 1) {\n const lineX =\n columnX +\n i * treeDepthIndent +\n treeDepthIndent * 0.5 +\n treeHorizontalPadding +\n 0.5;\n context.moveTo(lineX, rowY);\n context.lineTo(lineX, rowY + rowHeight);\n }\n context.stroke();\n }\n\n // draw as hockey stick if last row at depth\n if (depthDiff > 0) {\n context.beginPath();\n for (let i = depth - depthDiff; i < depth; i += 1) {\n const lineX =\n columnX +\n i * treeDepthIndent +\n treeDepthIndent * 0.5 +\n treeHorizontalPadding +\n 0.5;\n context.moveTo(lineX, rowY);\n context.lineTo(lineX, rowY + Math.ceil(rowHeight / 2));\n // extra moveTo prevents halfpixel in corner\n context.moveTo(lineX - 0.5, rowY + Math.ceil(rowHeight / 2) + 0.5);\n context.lineTo(\n lineX + treeDepthIndent - 0.5,\n rowY + Math.ceil(rowHeight / 2) + 0.5\n );\n }\n context.stroke();\n }\n }\n\n getCachedTruncatedString = memoizeClear(\n (\n context: CanvasRenderingContext2D,\n text: string,\n width: number,\n fontWidth: number,\n truncationChar?: string\n ): string =>\n GridRenderer.truncateToWidth(\n context,\n text,\n width,\n fontWidth,\n truncationChar\n ),\n { max: 10000 }\n );\n\n getCachedBackgroundColors = memoizeClear(\n (backgroundColors: GridColorWay, maxDepth: number): GridColor[][] =>\n backgroundColors.split(' ').map(color => {\n const colors = [];\n for (let i = 0; i < maxDepth; i += 1) {\n colors.push(GridColorUtils.darkenForDepth(color, i, maxDepth));\n }\n return colors;\n }),\n { max: 1000 }\n );\n\n getCachedColorWithAlpha = memoizeClear(\n (color, alpha) => GridColorUtils.colorWithAlpha(color, alpha),\n { max: 1000 }\n );\n\n drawHeaders(context: CanvasRenderingContext2D, state: GridRenderState): void {\n const { theme } = state;\n\n context.font = theme.headerFont;\n\n this.drawColumnHeaders(context, state);\n\n this.drawRowHeaders(context, state);\n }\n\n drawFooters(context: CanvasRenderingContext2D, state: GridRenderState): void {\n const { theme } = state;\n\n context.font = theme.headerFont;\n\n this.drawRowFooters(context, state);\n }\n\n drawColumnHeaders(\n context: CanvasRenderingContext2D,\n state: GridRenderState\n ): void {\n const {\n mouseX,\n mouseY,\n theme,\n metrics,\n draggingColumnSeparator,\n isDragging,\n model,\n } = state;\n const {\n columnHeaderHeight,\n floatingColumns,\n gridX,\n width,\n visibleColumns,\n visibleColumnWidths,\n visibleColumnXs,\n floatingLeftColumnCount,\n floatingLeftWidth,\n floatingRightWidth,\n modelColumns,\n columnHeaderMaxDepth,\n } = metrics;\n if (columnHeaderHeight <= 0) {\n return;\n }\n\n const {\n headerHiddenSeparatorSize,\n headerHiddenSeparatorHoverColor,\n headerSeparatorColor,\n headerSeparatorHoverColor,\n } = theme;\n const hiddenSeparatorHeight = columnHeaderHeight * 0.5;\n const hiddenY =\n columnHeaderHeight * (columnHeaderMaxDepth - 1) +\n columnHeaderHeight * 0.5 -\n hiddenSeparatorHeight * 0.5;\n const containsFrozenColumns = floatingLeftColumnCount > 0;\n\n context.save();\n\n this.drawColumnHeadersForRange(\n context,\n state,\n [visibleColumns[0], visibleColumns[visibleColumns.length - 1]],\n {\n minX: gridX + floatingLeftWidth,\n maxX: width - floatingRightWidth,\n }\n );\n\n if (containsFrozenColumns) {\n this.drawColumnHeadersForRange(\n context,\n state,\n [floatingColumns[0], floatingColumns[floatingColumns.length - 1]],\n {\n minX: gridX,\n maxX: gridX + floatingLeftWidth,\n }\n );\n }\n\n if (headerSeparatorColor) {\n context.strokeStyle = headerSeparatorColor;\n\n const hiddenColumns = [...visibleColumnWidths.entries()]\n .filter(([_, w]) => w === 0)\n .map(([index]) => index);\n\n // Now draw the hidden column separator boxes\n context.beginPath();\n context.fillStyle = headerSeparatorColor;\n for (let i = 0; i < hiddenColumns.length; i += 1) {\n const column = hiddenColumns[i];\n const columnX = getOrThrow(visibleColumnXs, column);\n const columnWidth = getOrThrow(visibleColumnWidths, column);\n const minX =\n gridX + columnX + columnWidth + 0.5 - headerHiddenSeparatorSize * 0.5;\n context.rect(\n minX,\n hiddenY,\n headerHiddenSeparatorSize,\n hiddenSeparatorHeight\n );\n }\n context.fill();\n }\n\n if (headerSeparatorHoverColor) {\n let { index: highlightedSeparator, depth } =\n draggingColumnSeparator ?? {};\n\n if (highlightedSeparator == null && mouseX != null && mouseY != null) {\n const separator = GridColumnSeparatorMouseHandler.getColumnSeparator(\n GridUtils.getGridPointFromXY(mouseX, mouseY, metrics),\n metrics,\n model,\n theme\n );\n highlightedSeparator = separator?.index;\n depth = separator?.depth;\n }\n\n let shouldDrawSeparator: boolean;\n\n if (highlightedSeparator == null) {\n shouldDrawSeparator = false;\n } else {\n const columnIndex = modelColumns.get(highlightedSeparator);\n const nextColumnIndex = modelColumns.get(highlightedSeparator + 1);\n if (columnIndex == null || nextColumnIndex == null) {\n shouldDrawSeparator = false;\n } else {\n shouldDrawSeparator =\n model.textForColumnHeader(columnIndex, depth) !==\n model.textForColumnHeader(nextColumnIndex, depth);\n }\n }\n\n if (\n shouldDrawSeparator &&\n highlightedSeparator != null &&\n depth != null &&\n (!isDragging || draggingColumnSeparator != null)\n ) {\n context.strokeStyle = headerSeparatorHoverColor;\n\n const columnX = getOrThrow(visibleColumnXs, highlightedSeparator);\n const columnWidth = getOrThrow(\n visibleColumnWidths,\n highlightedSeparator\n );\n const x = gridX + columnX + columnWidth + 0.5;\n const visibleColumnIndex = visibleColumns.indexOf(highlightedSeparator);\n const nextColumn =\n visibleColumnIndex < visibleColumns.length - 1\n ? visibleColumns[visibleColumnIndex + 1]\n : null;\n const nextColumnWidth =\n nextColumn != null ? visibleColumnWidths.get(nextColumn) : null;\n const isColumnHidden = columnWidth === 0;\n const isNextColumnHidden =\n nextColumnWidth != null && nextColumnWidth === 0;\n if (isColumnHidden) {\n context.strokeStyle = headerHiddenSeparatorHoverColor;\n context.fillStyle = headerHiddenSeparatorHoverColor;\n context.fillRect(\n x,\n hiddenY,\n headerHiddenSeparatorSize * 0.5,\n hiddenSeparatorHeight\n );\n } else if (isNextColumnHidden) {\n context.fillStyle = headerSeparatorHoverColor;\n context.fillRect(\n x - headerHiddenSeparatorSize * 0.5,\n hiddenY,\n headerHiddenSeparatorSize * 0.5,\n hiddenSeparatorHeight\n );\n }\n\n // column seperator hover line\n context.beginPath();\n context.moveTo(\n x,\n (columnHeaderMaxDepth - depth - 1) * columnHeaderHeight\n );\n context.lineTo(\n x,\n (columnHeaderMaxDepth - depth) * columnHeaderHeight - 1\n );\n context.stroke();\n }\n }\n\n context.restore();\n }\n\n drawColumnHeadersForRange(\n context: CanvasRenderingContext2D,\n state: GridRenderState,\n range: BoundedAxisRange,\n bounds: { minX: number; maxX: number }\n ): void {\n const { model } = state;\n const { columnHeaderMaxDepth } = model;\n\n if (columnHeaderMaxDepth === 0) {\n return;\n }\n\n for (let d = 0; d <= columnHeaderMaxDepth; d += 1) {\n this.drawColumnHeadersAtDepth(context, state, range, bounds, d);\n }\n }\n\n drawColumnHeadersAtDepth(\n context: CanvasRenderingContext2D,\n state: GridRenderState,\n range: BoundedAxisRange,\n bounds: { minX: number; maxX: number },\n depth: number\n ): void {\n const { metrics, model, theme } = state;\n const {\n modelColumns,\n visibleColumnXs,\n gridX,\n calculatedColumnWidths,\n userColumnWidths,\n visibleColumnWidths,\n movedColumns,\n } = metrics;\n const {\n headerBackgroundColor,\n headerColor,\n headerSeparatorColor,\n columnHeaderHeight,\n columnWidth,\n } = theme;\n const { columnHeaderMaxDepth } = model;\n const { minX, maxX } = bounds;\n const visibleWidth = maxX - minX;\n\n if (columnHeaderMaxDepth === 0) {\n return;\n }\n\n const startIndex = range[0];\n const endIndex = range[1];\n\n context.save();\n context.translate(\n 0,\n (columnHeaderMaxDepth - depth - 1) * columnHeaderHeight\n );\n\n if (depth === 0) {\n // Make sure base column header background always goes to the right edge\n this.drawColumnHeader(context, state, '', minX, maxX, {\n backgroundColor: headerBackgroundColor,\n separatorColor: headerSeparatorColor,\n });\n\n // Draw base column headers\n for (let i = startIndex; i <= endIndex; i += 1) {\n this.drawColumnHeaderAtIndex(context, state, i, bounds);\n }\n }\n\n // Draw column header group\n if (depth > 0) {\n let columnIndex = startIndex;\n\n while (columnIndex <= endIndex) {\n const modelColumn = getOrThrow(modelColumns, columnIndex);\n const columnGroupName = model.textForColumnHeader(modelColumn, depth);\n const columnGroupColor = model.colorForColumnHeader(modelColumn, depth);\n let columnGroupLeft = getOrThrow(visibleColumnXs, columnIndex) + gridX;\n let columnGroupRight =\n columnGroupLeft + getOrThrow(visibleColumnWidths, columnIndex);\n\n if (columnGroupName != null) {\n // Need to determine if the column group is at least the width of the bounds\n // And if the left/right of the group extend past the bounds\n // The group will be drawn as if it were a column with a max width of the bounds width\n let prevColumnIndex = columnIndex - 1;\n while (\n columnGroupRight - columnGroupLeft < visibleWidth ||\n columnGroupLeft > minX\n ) {\n const prevModelIndex =\n modelColumns.get(prevColumnIndex) ??\n GridUtils.getModelIndex(prevColumnIndex, movedColumns);\n if (\n prevModelIndex == null ||\n model.textForColumnHeader(prevModelIndex, depth) !==\n columnGroupName\n ) {\n // Previous column not in the same group\n break;\n }\n\n // Use this instead of visibleColumnWidths b/c the columns may be off screen\n const prevColumnWidth =\n userColumnWidths.get(prevModelIndex) ??\n calculatedColumnWidths.get(prevModelIndex) ??\n columnWidth;\n\n columnGroupLeft -= prevColumnWidth;\n prevColumnIndex -= 1;\n }\n\n let nextColumnIndex = columnIndex + 1;\n while (\n columnGroupRight - columnGroupLeft < visibleWidth ||\n columnGroupRight < maxX\n ) {\n const nextModelIndex =\n modelColumns.get(nextColumnIndex) ??\n GridUtils.getModelIndex(nextColumnIndex, movedColumns);\n if (\n model.textForColumnHeader(nextModelIndex, depth) !==\n columnGroupName\n ) {\n // Next column not in the same group\n break;\n }\n\n // Use this instead of visibleColumnWidths b/c the columns may be off screen\n const nextColumnWidth =\n userColumnWidths.get(nextModelIndex) ??\n calculatedColumnWidths.get(nextModelIndex) ??\n columnWidth;\n\n columnGroupRight += nextColumnWidth;\n nextColumnIndex += 1;\n }\n\n // Set column index to end of the current group\n columnIndex = nextColumnIndex - 1;\n\n const isFullWidth =\n columnGroupRight - columnGroupLeft >= visibleWidth;\n let x = columnGroupLeft;\n if (isFullWidth) {\n if (columnGroupRight < maxX) {\n x = columnGroupRight - visibleWidth;\n } else if (columnGroupLeft < minX) {\n x = minX;\n }\n }\n\n this.drawColumnHeader(\n context,\n state,\n columnGroupName,\n x,\n Math.min(columnGroupRight - columnGroupLeft, visibleWidth),\n {\n backgroundColor: columnGroupColor ?? headerBackgroundColor,\n textColor: headerColor,\n separatorColor: headerSeparatorColor,\n },\n bounds\n );\n }\n columnIndex += 1;\n }\n }\n context.restore();\n }\n\n /**\n * Draws the column header for the given visible index\n * @param context Canvas context\n * @param state Grid render state\n * @param index Visible index of the column header to draw\n * @param bounds The horizontal bounds the header can be drawn in\n */\n drawColumnHeaderAtIndex(\n context: CanvasRenderingContext2D,\n state: GridRenderState,\n index: VisibleIndex,\n bounds: { minX: number; maxX: number }\n ): void {\n const { metrics, model, theme } = state;\n const {\n modelColumns,\n visibleColumnWidths,\n visibleColumnXs,\n gridX,\n } = metrics;\n const width = getOrThrow(visibleColumnWidths, index);\n const x = getOrThrow(visibleColumnXs, index) + gridX;\n const modelColumn = getOrThrow(modelColumns, index);\n const text = model.textForColumnHeader(modelColumn);\n const { headerBackgroundColor, headerColor, headerSeparatorColor } = theme;\n\n if (text == null) {\n return;\n }\n\n this.drawColumnHeader(\n context,\n state,\n text,\n x,\n width,\n {\n backgroundColor:\n model.colorForColumnHeader(modelColumn) ?? headerBackgroundColor,\n textColor: headerColor,\n separatorColor: headerSeparatorColor,\n },\n bounds\n );\n }\n\n drawColumnHeader(\n context: CanvasRenderingContext2D,\n state: GridRenderState,\n columnText: string,\n columnX: Coordinate,\n columnWidth: number,\n style?: {\n backgroundColor?: string;\n textColor?: string;\n separatorColor?: string;\n },\n bounds?: { minX?: number; maxX?: number }\n ): void {\n if (columnWidth <= 0) {\n return;\n }\n const { metrics, theme } = state;\n\n const { headerHorizontalPadding, columnHeaderHeight } = theme;\n const { fontWidths, width } = metrics;\n const fontWidth =\n fontWidths.get(context.font) || GridRenderer.DEFAULT_FONT_WIDTH;\n\n const maxWidth = columnWidth - headerHorizontalPadding * 2;\n const maxLength = maxWidth / fontWidth;\n\n const { backgroundColor, textColor = '#ffffff', separatorColor } =\n style ?? {};\n let { minX = 0, maxX = width } = bounds ?? {};\n\n context.save();\n context.rect(minX, 0, maxX - minX, columnHeaderHeight);\n context.clip();\n\n // Fill background color if specified\n if (backgroundColor) {\n context.fillStyle = backgroundColor;\n context.fillRect(columnX, 0, columnWidth, columnHeaderHeight);\n }\n\n if (separatorColor) {\n context.strokeStyle = separatorColor;\n context.beginPath();\n\n // Don't draw left separator if column touches the left edge\n if (columnX > 0) {\n context.moveTo(columnX + 0.5, 0);\n context.lineTo(columnX + 0.5, columnHeaderHeight);\n }\n context.moveTo(columnX + columnWidth + 0.5, 0);\n context.lineTo(columnX + columnWidth + 0.5, columnHeaderHeight);\n\n // Bottom Border, should be interior to the header height\n context.moveTo(columnX, columnHeaderHeight - 0.5);\n context.lineTo(columnX + columnWidth, columnHeaderHeight - 0.5);\n context.stroke();\n }\n\n context.beginPath();\n context.rect(columnX, 0, columnWidth, columnHeaderHeight);\n context.clip();\n context.fillStyle = textColor;\n\n let renderText = columnText;\n\n if (maxLength <= 0) {\n renderText = '';\n } else if (renderText.length > maxLength) {\n renderText = `${renderText.substring(0, maxLength - 1)}…`;\n }\n\n const textWidth = renderText.length * fontWidth;\n let x = columnX + columnWidth * 0.5;\n const y = columnHeaderHeight * 0.5;\n minX += headerHorizontalPadding;\n maxX -= headerHorizontalPadding;\n\n const columnLeft = columnX + headerHorizontalPadding;\n const visibleLeft = clamp(columnLeft, minX, maxX);\n const columnRight = columnX + columnWidth - headerHorizontalPadding;\n const visibleRight = clamp(columnRight, minX, maxX);\n const visibleWidth = visibleRight - visibleLeft;\n\n const isBeyondLeft = x - textWidth * 0.5 < minX;\n const isBeyondRight = x + textWidth * 0.5 > maxX;\n\n if (isBeyondLeft) {\n // Column name would be off the left side of the canvas\n if (textWidth < visibleWidth) {\n // Can render the entire text in the visible space. Stick to left\n x = minX + textWidth * 0.5;\n } else {\n x = columnRight - textWidth * 0.5;\n }\n } else if (isBeyondRight) {\n if (textWidth < visibleWidth) {\n // Can render the entire text in the visible space. Stick to right\n x = maxX - textWidth * 0.5;\n } else {\n x = columnLeft + textWidth * 0.5;\n }\n }\n context.textAlign = 'center';\n context.fillText(renderText, x, y);\n\n context.restore();\n }\n\n drawRowHeaders(\n context: CanvasRenderingContext2D,\n state: GridRenderState\n ): void {\n const { mouseX, mouseY, metrics, theme, draggingRowSeparator } = state;\n const {\n gridY,\n rowHeaderWidth,\n height,\n visibleRows,\n visibleRowHeights,\n visibleRowYs,\n } = metrics;\n if (rowHeaderWidth <= 0) {\n return;\n }\n\n const {\n headerBackgroundColor,\n headerColor,\n headerHiddenSeparatorSize,\n headerHiddenSeparatorHoverColor,\n headerSeparatorColor,\n headerSeparatorHoverColor,\n } = theme;\n const hiddenSeparatorWidth = rowHeaderWidth * 0.5;\n const hiddenX = rowHeaderWidth * 0.5 - hiddenSeparatorWidth * 0.5;\n\n context.save();\n\n context.beginPath();\n\n // Fill in the background\n context.fillStyle = headerBackgroundColor;\n context.fillRect(0, 0, rowHeaderWidth, height);\n\n // Draw the separators\n if (headerSeparatorColor) {\n context.strokeStyle = headerSeparatorColor;\n context.beginPath();\n context.moveTo(0, gridY + 0.5);\n context.lineTo(rowHeaderWidth, gridY + 0.5);\n\n const hiddenRows = [];\n let isPreviousRowHidden = false;\n for (let i = 0; i < visibleRows.length; i += 1) {\n const row = visibleRows[i];\n const rowY = getOrThrow(visibleRowYs, row);\n const rowHeight = getOrThrow(visibleRowHeights, row);\n if (rowHeight > 0) {\n const y = gridY + rowY + rowHeight + 0.5;\n\n context.moveTo(0, y);\n context.lineTo(rowHeaderWidth, y);\n\n isPreviousRowHidden = false;\n } else if (!isPreviousRowHidden) {\n isPreviousRowHidden = true;\n hiddenRows.push(row);\n }\n }\n\n // border right, interior to the headerWidth\n context.moveTo(rowHeaderWidth - 0.5, 0);\n context.lineTo(rowHeaderWidth - 0.5, height);\n\n context.stroke();\n\n // Draw the hidden column separators\n context.beginPath();\n context.fillStyle = headerSeparatorColor;\n for (let i = 0; i < hiddenRows.length; i += 1) {\n const row = hiddenRows[i];\n const rowY = getOrThrow(visibleRowYs, row);\n const rowHeight = getOrThrow(visibleRowHeights, row);\n const minY =\n gridY + rowY + rowHeight + 0.5 - headerHiddenSeparatorSize * 0.5;\n context.rect(\n hiddenX,\n minY,\n hiddenSeparatorWidth,\n headerHiddenSeparatorSize\n );\n }\n\n context.fill();\n }\n\n if (headerSeparatorHoverColor) {\n let { index: highlightedSeparator = null } = draggingRowSeparator ?? {};\n if (highlightedSeparator == null && mouseX != null && mouseY != null) {\n highlightedSeparator = GridUtils.getRowSeparatorIndex(\n mouseX,\n mouseY,\n metrics,\n theme\n );\n }\n\n if (highlightedSeparator != null) {\n context.strokeStyle = headerSeparatorHoverColor;\n\n const rowY = getOrThrow(visibleRowYs, highlightedSeparator);\n const rowHeight = getOrThrow(visibleRowHeights, highlightedSeparator);\n const y = gridY + rowY + rowHeight + 0.5;\n\n const visibleRowIndex = visibleRows.indexOf(highlightedSeparator);\n const nextRow =\n visibleRowIndex < visibleRows.length - 1\n ? visibleRows[visibleRowIndex + 1]\n : null;\n const nextRowHeight =\n nextRow != null ? visibleRowHeights.get(nextRow) : null;\n const isRowHidden = rowHeight === 0;\n const isNextRowHidden = nextRowHeight != null && nextRowHeight === 0;\n if (isRowHidden) {\n context.strokeStyle = headerHiddenSeparatorHoverColor;\n context.fillStyle = headerHiddenSeparatorHoverColor;\n context.fillRect(\n hiddenX,\n y,\n hiddenSeparatorWidth,\n headerHiddenSeparatorSize * 0.5\n );\n } else if (isNextRowHidden) {\n context.fillStyle = headerSeparatorHoverColor;\n context.fillRect(\n hiddenX,\n y - headerHiddenSeparatorSize * 0.5,\n hiddenSeparatorWidth,\n headerHiddenSeparatorSize * 0.5\n );\n }\n\n context.beginPath();\n context.moveTo(0.5, y);\n context.lineTo(rowHeaderWidth + 0.5, y);\n context.stroke();\n }\n }\n\n // Fill in the text\n context.beginPath();\n context.rect(0, gridY, rowHeaderWidth, height);\n context.clip();\n\n context.fillStyle = headerColor;\n context.textAlign = 'right';\n\n for (let i = 0; i < visibleRows.length; i += 1) {\n const row = visibleRows[i];\n const rowHeight = getOrThrow(visibleRowHeights, row);\n const y = getOrThrow(visibleRowYs, row) + gridY;\n this.drawRowHeader(context, state, row, y, rowHeight);\n }\n\n context.restore();\n }\n\n drawRowHeader(\n context: CanvasRenderingContext2D,\n state: GridRenderState,\n row: VisibleIndex,\n rowY: Coordinate,\n rowHeight: number\n ): void {\n if (rowHeight <= 0) {\n return;\n }\n const { metrics, model, theme } = state;\n const { modelRows, rowHeaderWidth } = metrics;\n const modelRow = getOrThrow(modelRows, row);\n const x = rowHeaderWidth - theme.cellHorizontalPadding;\n const y = rowY + rowHeight * 0.5;\n context.fillText(model.textForRowHeader(modelRow), x, y);\n }\n\n drawRowFooters(\n context: CanvasRenderingContext2D,\n state: GridRenderState\n ): void {\n const {\n mouseX,\n mouseY,\n metrics,\n model,\n theme,\n draggingRowSeparator,\n } = state;\n const {\n gridY,\n gridX,\n maxX,\n modelRows,\n rowFooterWidth,\n height,\n verticalBarWidth,\n visibleRows,\n visibleRowHeights,\n visibleRowYs,\n width,\n } = metrics;\n if (rowFooterWidth <= 0) {\n return;\n }\n\n const {\n cellHorizontalPadding,\n headerBackgroundColor,\n headerColor,\n headerHiddenSeparatorSize,\n headerHiddenSeparatorHoverColor,\n headerSeparatorColor,\n headerSeparatorHoverColor,\n } = theme;\n const hiddenSeparatorWidth = rowFooterWidth * 0.5;\n const hiddenX = rowFooterWidth * 0.5 - hiddenSeparatorWidth * 0.5;\n const x = Math.min(gridX + maxX, width - rowFooterWidth - verticalBarWidth);\n\n context.save();\n\n context.beginPath();\n\n // Fill in the background\n context.fillStyle = headerBackgroundColor;\n context.fillRect(x, gridY, rowFooterWidth, height);\n\n // Draw the separators\n if (headerSeparatorColor) {\n context.strokeStyle = headerSeparatorColor;\n context.beginPath();\n context.moveTo(x, gridY + 0.5);\n context.lineTo(rowFooterWidth, gridY + 0.5);\n\n const hiddenRows = [];\n let isPreviousRowHidden = false;\n for (let i = 0; i < visibleRows.length; i += 1) {\n const row = visibleRows[i];\n const rowY = getOrThrow(visibleRowYs, row);\n const rowHeight = getOrThrow(visibleRowHeights, row);\n if (rowHeight > 0) {\n const y = gridY + rowY + rowHeight + 0.5;\n\n context.moveTo(x + 0.5, y);\n context.lineTo(x + rowFooterWidth - 0.5, y);\n\n isPreviousRowHidden = false;\n } else if (!isPreviousRowHidden) {\n isPreviousRowHidden = true;\n hiddenRows.push(row);\n }\n }\n\n // border left, interior to the headerWidth\n context.moveTo(x + 0.5, gridY);\n context.lineTo(x + 0.5, height);\n\n context.stroke();\n\n // Draw the hidden column separators\n context.beginPath();\n context.fillStyle = headerSeparatorColor;\n for (let i = 0; i < hiddenRows.length; i += 1) {\n const row = hiddenRows[i];\n const rowY = getOrThrow(visibleRowYs, row);\n const rowHeight = getOrThrow(visibleRowHeights, row);\n const minY =\n gridY + rowY + rowHeight + 0.5 - headerHiddenSeparatorSize * 0.5;\n context.rect(\n x + hiddenX,\n minY,\n hiddenSeparatorWidth,\n headerHiddenSeparatorSize\n );\n }\n\n context.fill();\n }\n\n if (headerSeparatorHoverColor) {\n let { index: highlightedSeparator = null } = draggingRowSeparator ?? {};\n if (highlightedSeparator == null && mouseX != null && mouseY != null) {\n highlightedSeparator = GridUtils.getRowSeparatorIndex(\n mouseX,\n mouseY,\n metrics,\n theme\n );\n }\n\n if (highlightedSeparator != null) {\n context.strokeStyle = headerSeparatorHoverColor;\n\n const rowY = getOrThrow(visibleRowYs, highlightedSeparator);\n const rowHeight = getOrThrow(visibleRowHeights, highlightedSeparator);\n const y = gridY + rowY + rowHeight + 0.5;\n\n const visibleRowIndex = visibleRows.indexOf(highlightedSeparator);\n const nextRow =\n visibleRowIndex < visibleRows.length - 1\n ? visibleRows[visibleRowIndex + 1]\n : null;\n const nextRowHeight =\n nextRow != null ? visibleRowHeights.get(nextRow) : null;\n const isRowHidden = rowHeight === 0;\n const isNextRowHidden = nextRowHeight != null && nextRowHeight === 0;\n if (isRowHidden) {\n context.strokeStyle = headerHiddenSeparatorHoverColor;\n context.fillStyle = headerHiddenSeparatorHoverColor;\n context.fillRect(\n hiddenX,\n y,\n hiddenSeparatorWidth,\n headerHiddenSeparatorSize * 0.5\n );\n } else if (isNextRowHidden) {\n context.fillStyle = headerSeparatorHoverColor;\n context.fillRect(\n hiddenX,\n y - headerHiddenSeparatorSize * 0.5,\n hiddenSeparatorWidth,\n headerHiddenSeparatorSize * 0.5\n );\n }\n\n context.beginPath();\n context.moveTo(x + 0.5, y);\n context.lineTo(x + rowFooterWidth + 0.5, y);\n context.stroke();\n }\n }\n\n // Fill in the text\n context.beginPath();\n context.rect(x, gridY, rowFooterWidth, height);\n context.clip();\n\n context.fillStyle = headerColor;\n context.textAlign = 'left';\n\n const textX = x + cellHorizontalPadding;\n for (let i = 0; i < visibleRows.length; i += 1) {\n const row = visibleRows[i];\n const rowHeight = getOrThrow(visibleRowHeights, row);\n if (rowHeight > 0) {\n const rowY = getOrThrow(visibleRowYs, row) + gridY;\n const modelRow = getOrThrow(modelRows, row);\n const textY = rowY + rowHeight * 0.5;\n context.fillText(model.textForRowFooter(modelRow), textX, textY);\n }\n }\n\n context.restore();\n }\n\n drawSelectedRanges(\n context: CanvasRenderingContext2D,\n state: GridRenderState,\n viewport: {\n left?: VisibleIndex;\n top?: VisibleIndex;\n right?: VisibleIndex;\n bottom?: VisibleIndex;\n minX?: Coordinate;\n minY?: Coordinate;\n maxX?: Coordinate;\n maxY?: Coordinate;\n } = {}\n ): void {\n const {\n cursorColumn: column,\n cursorRow: row,\n draggingRow,\n draggingColumn,\n editingCell,\n metrics,\n model,\n selectedRanges,\n theme,\n } = state;\n const {\n visibleColumnWidths,\n visibleColumnXs,\n visibleRowHeights,\n visibleRowYs,\n width,\n height,\n } = metrics;\n const {\n left = metrics.left,\n top = metrics.top,\n right = metrics.right,\n bottom = metrics.bottom,\n minY = -10,\n maxY = height + 10,\n minX = -10,\n maxX = width + 10,\n } = viewport;\n if (selectedRanges.length === 0) {\n return;\n }\n\n const isCursorVisible =\n isEditableGridModel(model) &&\n model.isEditable &&\n editingCell == null &&\n draggingRow == null &&\n draggingColumn == null &&\n column != null &&\n row != null &&\n visibleColumnXs.has(column) &&\n visibleRowYs.has(row);\n if (isCursorVisible) {\n // Punch a hole out where the active cell is, it gets styled differently.\n const x = getOrThrow(visibleColumnXs, column);\n const y = getOrThrow(visibleRowYs, row);\n const w = getOrThrow(visibleColumnWidths, column);\n const h = getOrThrow(visibleRowHeights, row);\n\n context.save();\n\n context.beginPath();\n\n context.rect(0, 0, width, height);\n context.rect(x, y, w, h);\n\n context.clip('evenodd');\n }\n\n // Draw selection ranges\n context.beginPath();\n for (let i = 0; i < selectedRanges.length; i += 1) {\n const selectedRange = selectedRanges[i];\n const startColumn =\n selectedRange.startColumn !== null ? selectedRange.startColumn : left;\n const startRow =\n selectedRange.startRow !== null ? selectedRange.startRow : top;\n const endColumn =\n selectedRange.endColumn !== null ? selectedRange.endColumn : right;\n const endRow =\n selectedRange.endRow !== null ? selectedRange.endRow : bottom;\n if (\n endRow >= top &&\n bottom >= startRow &&\n endColumn >= left &&\n right >= startColumn\n ) {\n // Need to offset the x/y coordinates so that the line draws nice and crisp\n const x =\n startColumn >= left && visibleColumnXs.has(startColumn)\n ? Math.round(getOrThrow(visibleColumnXs, startColumn)) + 0.5\n : minX;\n const y =\n startRow >= top && visibleRowYs.has(startRow)\n ? Math.max(\n Math.round(getOrThrow(visibleRowYs, startRow)) + 0.5,\n 0.5\n )\n : minY;\n\n const endX =\n endColumn <= right && visibleColumnXs.has(endColumn)\n ? Math.round(\n getOrThrow(visibleColumnXs, endColumn) +\n getOrThrow(visibleColumnWidths, endColumn)\n ) - 0.5\n : maxX;\n const endY =\n endRow <= bottom && visibleRowYs.has(endRow)\n ? Math.round(\n getOrThrow(visibleRowYs, endRow) +\n getOrThrow(visibleRowHeights, endRow)\n ) - 0.5\n : maxY;\n\n context.rect(x, y, endX - x, endY - y);\n }\n\n // draw the inner transparent fill\n context.fillStyle = theme.selectionColor;\n context.fill();\n\n /**\n * draw an \"inner stroke\" that's clipped to just inside of the rects\n * to act as a casing to the outer stroke. 3px width because 1px is outside\n * the rect (but clipped), 1px is \"on\" the rect (technically this pixel is\n * a half pixel clip as well due to rects offset, but we are immediately painting\n * over it), and then the 1px inside (which is the desired pixel).\n */\n context.save();\n context.clip();\n context.strokeStyle = theme.selectionOutlineCasingColor;\n context.lineWidth = 3;\n context.stroke();\n context.restore();\n\n // draw the outerstroke border on top of the inner stroke\n context.strokeStyle = theme.selectionOutlineColor;\n context.lineWidth = 1;\n context.stroke();\n }\n\n if (isCursorVisible && column != null && row != null) {\n context.restore();\n\n this.drawActiveCell(context, state, column, row);\n }\n }\n\n drawActiveCell(\n context: CanvasRenderingContext2D,\n state: GridRenderState,\n column: VisibleIndex,\n row: VisibleIndex,\n borderWidth = GridRenderer.ACTIVE_CELL_BORDER_WIDTH\n ): void {\n const { metrics, theme } = state;\n const {\n visibleColumnWidths,\n visibleColumnXs,\n visibleRowHeights,\n visibleRowYs,\n } = metrics;\n const cellX = getOrThrow(visibleColumnXs, column);\n const cellY = getOrThrow(visibleRowYs, row);\n const cellW = getOrThrow(visibleColumnWidths, column);\n const cellH = getOrThrow(visibleRowHeights, row);\n\n // Now get the outline for the active cell\n let x = cellX - borderWidth * 0.5;\n let y = cellY - borderWidth * 0.5;\n let w = cellW + borderWidth;\n let h = cellH + borderWidth;\n\n // Make sure the outline is interior on the edge\n if (x <= 0) {\n w += x - 1;\n x = 1;\n }\n if (y <= 0) {\n h += y - 1;\n y = 1;\n }\n\n const { lineWidth } = context;\n context.beginPath();\n context.lineWidth = borderWidth;\n context.strokeStyle = theme.selectionOutlineColor;\n this.drawRoundedRect(context, x, y, w, h);\n context.stroke();\n context.lineWidth = lineWidth;\n }\n\n /**\n * Draws a rounded rectangle using the current state of the canvas.\n *\n * @param context The canvas context\n * @param x coordinate of the left side\n * @param y coordinate of the top side\n * @param w width of the rectangle\n * @param h height of the rectangle\n * @param r corner radius of the rectangle\n */\n drawRoundedRect(\n context: CanvasRenderingContext2D,\n x: Coordinate,\n y: Coordinate,\n w: number,\n h: number,\n r = GridRenderer.DEFAULT_EDGE_RADIUS\n ): void {\n context.beginPath();\n context.moveTo(x + r, y);\n context.lineTo(x + w - r, y);\n context.quadraticCurveTo(x + w, y, x + w, y + r);\n context.lineTo(x + w, y + h - r);\n context.quadraticCurveTo(x + w, y + h, x + w - r, y + h);\n context.lineTo(x + r, y + h);\n context.quadraticCurveTo(x, y + h, x, y + h - r);\n context.lineTo(x, y + r);\n context.quadraticCurveTo(x, y, x + r, y);\n context.closePath();\n }\n\n drawDraggingColumn(\n context: CanvasRenderingContext2D,\n state: GridRenderState\n ): void {\n const { draggingColumn, metrics, mouseX, theme, model } = state;\n if (draggingColumn == null || mouseX == null) {\n return;\n }\n\n const {\n range: draggingColumnVisibleRange,\n depth: draggingColumnDepth,\n } = draggingColumn;\n\n const {\n gridX,\n gridY,\n visibleColumnXs,\n visibleColumnWidths,\n height,\n width,\n columnHeaderMaxDepth,\n columnHeaderHeight,\n movedColumns,\n modelColumns,\n floatingLeftWidth,\n } = metrics;\n\n const draggingModelIndex =\n modelColumns.get(draggingColumnVisibleRange[0]) ??\n GridUtils.getModelIndex(draggingColumnVisibleRange[0], movedColumns);\n\n const draggingGroup = model.getColumnHeaderGroup(\n draggingModelIndex,\n draggingColumnDepth\n );\n\n if (draggingColumnDepth > 0 && !draggingGroup) {\n return;\n }\n\n const [startIndex, endIndex] = draggingColumnVisibleRange;\n\n const originalLeft = getOrThrow(visibleColumnXs, startIndex);\n const originalRight =\n getOrThrow(visibleColumnXs, endIndex) +\n getOrThrow(visibleColumnWidths, endIndex);\n const originalWidth = originalRight - originalLeft;\n\n const draggingLeft = draggingColumn.left;\n\n const {\n backgroundColor,\n font,\n headerFont,\n reorderOffset,\n shadowBlur,\n shadowColor,\n } = theme;\n\n const columnHeaderOffset =\n (columnHeaderMaxDepth - draggingColumnDepth - 1) * columnHeaderHeight;\n\n context.save();\n\n context.translate(gridX, 0);\n\n context.save();\n context.beginPath();\n\n // Don't draw over frozen columns\n context.rect(floatingLeftWidth, 0, width, height);\n context.clip();\n\n // First, we need to draw over where the column is coming from\n context.fillStyle = backgroundColor;\n context.fillRect(originalLeft, columnHeaderOffset, originalWidth, height);\n context.restore();\n\n // Then draw the shadow of the moving column\n context.translate(0, reorderOffset);\n\n context.save();\n context.shadowColor = shadowColor;\n context.shadowBlur = shadowBlur;\n\n context.fillStyle = backgroundColor;\n context.fillRect(\n draggingColumn.left,\n columnHeaderOffset + reorderOffset,\n draggingColumn.width,\n height\n );\n context.restore(); // Reset style\n\n // Now set the clipping region and pretty much just redraw this column and all it's contents\n context.beginPath();\n context.rect(\n draggingColumn.left,\n columnHeaderOffset,\n draggingColumn.width + 1,\n height\n );\n context.clip();\n\n context.translate(draggingLeft - originalLeft, 0);\n context.font = headerFont;\n\n const visibleColumns: VisibleIndex[] = [];\n for (\n let i = draggingColumn.range[0];\n i <= draggingColumn.range[1];\n i += 1\n ) {\n visibleColumns.push(i);\n }\n\n /**\n * This will not draw the header text properly, but extensions of Grid\n * may draw extra things in the header like sorts and filters\n */\n this.drawColumnHeaders(context, state);\n\n // Ensure the column header gets drawn\n this.drawColumnHeadersForRange(\n context,\n state,\n [visibleColumns[0], visibleColumns[visibleColumns.length - 1]],\n {\n minX: originalLeft,\n maxX: width,\n }\n );\n\n context.translate(0, gridY);\n context.font = font;\n\n this.drawGridBackground(context, state);\n\n for (let i = startIndex; i <= endIndex; i += 1) {\n this.drawColumnCellContents(context, state, i);\n }\n\n context.restore();\n }\n\n drawDraggingRow(\n context: CanvasRenderingContext2D,\n state: GridRenderState\n ): void {\n const { draggingRow, draggingRowOffset, metrics, mouseY, theme } = state;\n if (draggingRow == null || mouseY == null) {\n return;\n }\n\n const { gridX, gridY, visibleRowYs, visibleRowHeights, width } = metrics;\n const y = getOrThrow(visibleRowYs, draggingRow);\n const rowHeight = getOrThrow(visibleRowHeights, draggingRow) + 1;\n const {\n backgroundColor,\n font,\n headerFont,\n reorderOffset,\n shadowBlur,\n shadowColor,\n } = theme;\n\n context.save();\n\n context.translate(0, gridY);\n\n // First, we need to draw over the row stripes where the row is coming from\n context.fillStyle = backgroundColor;\n context.fillRect(0, y, width, rowHeight);\n\n context.translate(\n gridX + reorderOffset,\n mouseY - y - gridY - (draggingRowOffset ?? 0)\n );\n\n // Then draw the shadow of the moving row\n context.save();\n\n context.shadowColor = shadowColor;\n context.shadowBlur = shadowBlur;\n\n context.fillStyle = backgroundColor;\n context.fillRect(-gridX, y, width, rowHeight);\n\n context.restore();\n\n // Now set the clipping region and pretty much just redraw this row and all it's contents\n context.beginPath();\n context.rect(-gridX, y, width, rowHeight);\n context.clip();\n\n context.font = font;\n\n this.drawGridBackground(context, state);\n\n this.drawCellContents(context, state);\n\n // Now translate it back up and draw the header\n context.translate(-gridX, -gridY);\n\n context.font = headerFont;\n\n this.drawRowHeaders(context, state);\n\n context.restore();\n }\n\n drawScrollBars(\n context: CanvasRenderingContext2D,\n state: GridRenderState\n ): void {\n const {\n isDraggingHorizontalScrollBar,\n isDraggingVerticalScrollBar,\n isDragging,\n metrics,\n mouseX,\n mouseY,\n theme,\n } = state;\n if (theme.scrollBarSize <= 0) {\n return;\n }\n\n const {\n rowHeaderWidth,\n columnHeaderHeight,\n width,\n height,\n handleHeight,\n handleWidth,\n scrollX,\n scrollY,\n hasHorizontalBar,\n hasVerticalBar,\n barWidth,\n barHeight,\n } = metrics;\n const {\n scrollBarBackgroundColor,\n scrollBarHoverBackgroundColor,\n scrollBarCasingColor,\n scrollBarCornerColor,\n scrollBarColor,\n scrollBarHoverColor,\n scrollBarActiveColor,\n scrollBarSize,\n scrollBarHoverSize,\n scrollBarCasingWidth,\n scrollBarSelectionTick,\n scrollBarSelectionTickColor,\n scrollBarActiveSelectionTickColor,\n autoSelectRow,\n autoSelectColumn,\n } = theme;\n\n const isInbounds =\n mouseX != null && mouseY != null && mouseX <= width && mouseY <= height;\n\n const isVerticalBarHover =\n isDraggingVerticalScrollBar ||\n (hasVerticalBar &&\n !isDraggingHorizontalScrollBar &&\n !isDragging &&\n mouseX != null &&\n mouseY != null &&\n mouseX >= width - scrollBarHoverSize &&\n mouseY <= barHeight + columnHeaderHeight &&\n isInbounds);\n\n const isHorizontalBarHover =\n isDraggingHorizontalScrollBar ||\n (hasHorizontalBar &&\n !isDraggingVerticalScrollBar &&\n !isDragging &&\n !isVerticalBarHover && // vert bar gets priorty in overlapped corner hover area\n mouseX != null &&\n mouseY != null &&\n mouseY >= height - scrollBarHoverSize &&\n mouseX <= barWidth - rowHeaderWidth &&\n isInbounds);\n\n const hScrollBarSize = isHorizontalBarHover\n ? scrollBarHoverSize\n : scrollBarSize;\n const vScrollBarSize = isVerticalBarHover\n ? scrollBarHoverSize\n : scrollBarSize;\n\n context.translate(rowHeaderWidth, columnHeaderHeight);\n\n if (hasHorizontalBar && hasVerticalBar) {\n // That little corner in the bottom right\n context.fillStyle = scrollBarCasingColor;\n context.fillRect(\n width - rowHeaderWidth - scrollBarSize,\n height - columnHeaderHeight - scrollBarSize,\n scrollBarSize,\n scrollBarSize\n );\n context.fillStyle = scrollBarCornerColor;\n context.fillRect(\n width - rowHeaderWidth - scrollBarSize + scrollBarCasingWidth,\n height - columnHeaderHeight - scrollBarSize + scrollBarCasingWidth,\n scrollBarSize - scrollBarCasingWidth,\n scrollBarSize - scrollBarCasingWidth\n );\n }\n\n if (hasHorizontalBar) {\n const x = scrollX;\n const y = height - columnHeaderHeight - hScrollBarSize;\n\n // scrollbar casing\n context.fillStyle = scrollBarCasingColor;\n context.fillRect(0, y, barWidth, hScrollBarSize - scrollBarCasingWidth);\n\n // scrollbar track\n context.fillStyle = isHorizontalBarHover\n ? scrollBarHoverBackgroundColor\n : scrollBarBackgroundColor;\n context.fillRect(\n 0,\n y + scrollBarCasingWidth,\n barWidth,\n hScrollBarSize - scrollBarCasingWidth\n );\n\n // scrollbar thumb\n if (isDraggingHorizontalScrollBar) {\n context.fillStyle = scrollBarActiveColor;\n } else if (isHorizontalBarHover) {\n context.fillStyle = scrollBarHoverColor;\n } else {\n context.fillStyle = scrollBarColor;\n }\n\n context.fillRect(\n x,\n y + scrollBarCasingWidth,\n handleWidth,\n hScrollBarSize - scrollBarCasingWidth\n );\n\n if (\n !autoSelectRow &&\n scrollBarSelectionTick &&\n scrollBarSelectionTickColor != null &&\n scrollBarActiveSelectionTickColor != null\n ) {\n context.fillStyle = scrollBarSelectionTickColor;\n // Scrollbar Selection Tick\n const { selectedRanges, cursorColumn } = state;\n const { lastLeft, columnCount } = metrics;\n\n const filteredRanges = [...selectedRanges].filter(\n value => value.startColumn != null && value.endColumn != null\n ) as NoneNullColumnRange[];\n\n const sortedRanges = filteredRanges\n .map(\n (value): BoundedAxisRange => [value.startColumn, value.endColumn]\n )\n .sort(GridUtils.compareRanges);\n\n const mergedRanges = GridUtils.mergeSortedRanges(sortedRanges);\n\n const getTickX = (index: number): number => {\n if (index <= lastLeft) {\n return (index / lastLeft) * (barWidth - handleWidth);\n }\n return (\n barWidth -\n handleWidth +\n ((index - lastLeft) / (columnCount - lastLeft)) * handleWidth\n );\n };\n for (let i = 0; i < mergedRanges.length; i += 1) {\n const range = mergedRanges[i];\n const startColumn = range[0];\n const endColumn = range[1];\n\n if (\n startColumn != null &&\n endColumn != null &&\n (startColumn !== cursorColumn || endColumn !== cursorColumn)\n ) {\n const tickX = getTickX(startColumn);\n const tickWidth = Math.max(\n 1,\n Math.round(getTickX(endColumn + 1) - tickX)\n );\n const trackHeight = hScrollBarSize - scrollBarCasingWidth;\n context.fillRect(\n tickX,\n y + scrollBarCasingWidth + Math.round(trackHeight / 3),\n tickWidth,\n Math.round(trackHeight / 3)\n );\n }\n }\n\n // Current Active Tick\n if (cursorColumn != null) {\n const tickX = getTickX(cursorColumn);\n const tickWidth = 2;\n const trackHeight = hScrollBarSize - scrollBarCasingWidth;\n context.fillStyle = scrollBarActiveSelectionTickColor;\n context.fillRect(\n tickX,\n y + scrollBarCasingWidth,\n tickWidth,\n trackHeight\n );\n }\n }\n }\n\n if (hasVerticalBar) {\n const x = width - rowHeaderWidth - vScrollBarSize;\n const y = scrollY;\n\n // scrollbar casing\n context.fillStyle = scrollBarCasingColor;\n context.fillRect(x, 0, vScrollBarSize - scrollBarCasingWidth, barHeight);\n\n // scrollbar track\n context.fillStyle = isVerticalBarHover\n ? scrollBarHoverBackgroundColor\n : scrollBarBackgroundColor;\n context.fillRect(\n x + scrollBarCasingWidth,\n 0,\n vScrollBarSize - scrollBarCasingWidth,\n barHeight\n );\n\n // scrollbar thumb\n if (isDraggingVerticalScrollBar) {\n context.fillStyle = scrollBarActiveColor;\n } else if (isVerticalBarHover) {\n context.fillStyle = scrollBarHoverColor;\n } else {\n context.fillStyle = scrollBarColor;\n }\n\n context.fillRect(\n x + scrollBarCasingWidth,\n y,\n vScrollBarSize - scrollBarCasingWidth,\n handleHeight\n );\n\n if (\n !autoSelectColumn &&\n scrollBarSelectionTick &&\n scrollBarSelectionTickColor != null &&\n scrollBarActiveSelectionTickColor != null\n ) {\n // Scrollbar Selection Tick\n const { selectedRanges, cursorRow } = state;\n const { lastTop, rowCount } = metrics;\n\n const getTickY = (index: number): number => {\n if (index <= lastTop) {\n return (index / lastTop) * (barHeight - handleHeight);\n }\n return (\n barHeight -\n handleHeight +\n ((index - lastTop) / (rowCount - lastTop)) * handleHeight\n );\n };\n\n context.fillStyle = scrollBarSelectionTickColor;\n\n const filteredRanges = [...selectedRanges].filter(\n value => value.startRow != null && value.endRow != null\n ) as NoneNullRowRange[];\n\n const sortedRanges = filteredRanges\n .map((value): BoundedAxisRange => [value.startRow, value.endRow])\n .sort(GridUtils.compareRanges);\n\n const mergedRanges = GridUtils.mergeSortedRanges(sortedRanges);\n\n for (let i = 0; i < mergedRanges.length; i += 1) {\n const range = mergedRanges[i];\n const startRow = range[0];\n const endRow = range[1];\n if (\n startRow != null &&\n endRow != null &&\n (startRow !== cursorRow || endRow !== cursorRow)\n ) {\n const tickY = getTickY(startRow);\n const trackWidth = vScrollBarSize - scrollBarCasingWidth;\n const tickHeight = Math.max(\n 1,\n Math.round(getTickY(endRow + 1) - tickY)\n );\n context.fillRect(\n x + scrollBarCasingWidth + Math.round(trackWidth / 3),\n tickY,\n Math.round(trackWidth / 3),\n tickHeight\n );\n }\n }\n\n // Current Active Tick\n if (cursorRow != null) {\n const tickY = Math.round(getTickY(cursorRow));\n\n const trackWidth = vScrollBarSize - scrollBarCasingWidth;\n const tickHeight = 2;\n\n context.fillStyle = scrollBarActiveSelectionTickColor;\n context.fillRect(\n x + scrollBarCasingWidth,\n tickY,\n trackWidth,\n tickHeight\n );\n }\n }\n }\n\n context.translate(-rowHeaderWidth, -columnHeaderHeight);\n }\n}\n\nexport default GridRenderer;\n"],"mappings":"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"}
1
+ {"version":3,"file":"GridRenderer.js","names":["clamp","memoizeClear","GridUtils","GridColorUtils","isExpandableGridModel","getOrThrow","isEditableGridModel","GridColumnSeparatorMouseHandler","GridRenderer","context","text","width","fontWidth","truncationChar","truncateToWidth","max","backgroundColors","maxDepth","split","map","color","colors","i","push","darkenForDepth","alpha","colorWithAlpha","truncate","str","len","length","substr","binaryTruncateToWidth","start","end","measureText","charWidth","repeat","Math","floor","lo","hi","min","result","mid","ceil","truncatedStr","DEFAULT_FONT_WIDTH","drawCanvas","state","save","configureContext","drawBackground","drawGrid","drawHeaders","drawFooters","drawDraggingColumn","drawDraggingRow","drawScrollBars","restore","theme","font","textBaseline","lineCap","metrics","height","fillStyle","backgroundColor","fillRect","draggingRow","draggingColumn","gridX","gridY","translate","drawGridBackground","drawCellContents","drawFloatingRows","drawFloatingColumns","floatingTopRowCount","floatingBottomRowCount","floatingRows","rowCount","visibleColumns","visibleRowYs","visibleRowHeights","floatingRowBackgroundColors","drawRowStripesForRows","drawFloatingMouseRowHover","drawGridLinesForItems","floatingGridColumnColor","floatingGridRowColor","drawCellBackgroundsForItems","drawFloatingBorders","drawSelectedRanges","top","bottom","maxY","minY","c","column","r","row","drawCellContent","floatingLeftColumnCount","floatingRightColumnCount","floatingLeftWidth","floatingRightWidth","floatingColumns","maxX","columnCount","visibleRows","visibleColumnXs","visibleColumnWidths","beginPath","rect","clip","left","right","minX","floatingDividerOuterColor","floatingDividerInnerColor","lineWidth","strokeStyle","y","moveTo","lineTo","x","stroke","drawHover","drawRowStripes","drawMouseColumnHover","drawMouseRowHover","drawGridLines","drawCellBackgrounds","has","rowBackgroundColors","rows","model","shadowBlur","shadowColor","colorSets","getCachedBackgroundColors","colorRowMap","Map","topShadowRows","bottomShadowRows","addRowToColorMap","rowAbove","depth","depthForRow","colorSet","set","get","depthAbove","undefined","forEach","colorRows","rowHeight","fill","startColor","getCachedColorWithAlpha","endColor","gradient","createLinearGradient","addColorStop","gradientY","mouseX","mouseY","mouseColumn","getColumnAtX","columnHoverBackgroundColor","columnWidth","rowHoverBackgroundColor","mouseRow","getRowAtY","drawMouseRowHoverForRow","rowFooterWidth","selectedRanges","startRow","endRow","selectedRowHoverBackgroundColor","gridColumnColor","gridRowColor","columns","columnColor","rowColor","drawGridLinesForColumns","drawGridLinesForRows","metricsMaxX","j","rowAfter","drawCellBackground","firstColumn","modelColumns","modelRows","modelRow","modelColumn","backgroundColorForCell","isFirstColumn","hasExpandableRows","drawCellRowTreeDepthLines","drawColumnCellContents","getTextRenderMetrics","textAlign","cellHorizontalPadding","treeDepthIndent","treeHorizontalPadding","treeIndent","textWidth","textX","textY","textOverride","fontWidths","textColor","textForCell","truncationCharForCell","textAlignForCell","colorForCell","truncatedText","getCachedTruncatedString","fillText","drawCellRowTreeMarker","visibleRowTreeBoxes","treeMarkerColor","treeMarkerHoverColor","columnX","rowY","isRowExpandable","treeBox","drawTreeMarker","isRowExpanded","isExpanded","x1","y1","x2","y2","markerText","treeLineColor","depthRowAfter","depthDiff","lineX","headerFont","drawColumnHeaders","drawRowHeaders","drawRowFooters","draggingColumnSeparator","isDragging","columnHeaderHeight","columnHeaderMaxDepth","headerHiddenSeparatorSize","headerHiddenSeparatorHoverColor","headerSeparatorColor","headerSeparatorHoverColor","hiddenSeparatorHeight","hiddenY","containsFrozenColumns","drawColumnHeadersForRange","hiddenColumns","entries","filter","_","w","index","highlightedSeparator","separator","getColumnSeparator","getGridPointFromXY","shouldDrawSeparator","columnIndex","nextColumnIndex","textForColumnHeader","visibleColumnIndex","indexOf","nextColumn","nextColumnWidth","isColumnHidden","isNextColumnHidden","range","bounds","d","drawColumnHeadersAtDepth","calculatedColumnWidths","userColumnWidths","movedColumns","headerBackgroundColor","headerColor","visibleWidth","startIndex","endIndex","drawColumnHeader","separatorColor","drawColumnHeaderAtIndex","columnGroupName","columnGroupColor","colorForColumnHeader","columnGroupLeft","columnGroupRight","prevColumnIndex","prevModelIndex","getModelIndex","prevColumnWidth","nextModelIndex","isFullWidth","columnText","style","headerHorizontalPadding","maxWidth","maxLength","renderText","substring","columnLeft","visibleLeft","columnRight","visibleRight","isBeyondLeft","isBeyondRight","draggingRowSeparator","rowHeaderWidth","hiddenSeparatorWidth","hiddenX","hiddenRows","isPreviousRowHidden","getRowSeparatorIndex","visibleRowIndex","nextRow","nextRowHeight","isRowHidden","isNextRowHidden","drawRowHeader","textForRowHeader","verticalBarWidth","textForRowFooter","viewport","cursorColumn","cursorRow","editingCell","isCursorVisible","isEditable","h","selectedRange","startColumn","endColumn","round","endX","endY","selectionColor","selectionOutlineCasingColor","selectionOutlineColor","drawActiveCell","borderWidth","ACTIVE_CELL_BORDER_WIDTH","cellX","cellY","cellW","cellH","drawRoundedRect","DEFAULT_EDGE_RADIUS","quadraticCurveTo","closePath","draggingColumnVisibleRange","draggingColumnDepth","draggingModelIndex","draggingGroup","getColumnHeaderGroup","originalLeft","originalRight","originalWidth","draggingLeft","reorderOffset","columnHeaderOffset","draggingRowOffset","isDraggingHorizontalScrollBar","isDraggingVerticalScrollBar","scrollBarSize","handleHeight","handleWidth","scrollX","scrollY","hasHorizontalBar","hasVerticalBar","barWidth","barHeight","scrollBarBackgroundColor","scrollBarHoverBackgroundColor","scrollBarCasingColor","scrollBarCornerColor","scrollBarColor","scrollBarHoverColor","scrollBarActiveColor","scrollBarHoverSize","scrollBarCasingWidth","scrollBarSelectionTick","scrollBarSelectionTickColor","scrollBarActiveSelectionTickColor","autoSelectRow","autoSelectColumn","isInbounds","isVerticalBarHover","isHorizontalBarHover","hScrollBarSize","vScrollBarSize","lastLeft","filteredRanges","value","sortedRanges","sort","compareRanges","mergedRanges","mergeSortedRanges","getTickX","tickX","tickWidth","trackHeight","lastTop","getTickY","tickY","trackWidth","tickHeight"],"sources":["../src/GridRenderer.ts"],"sourcesContent":["import clamp from 'lodash.clamp';\nimport memoizeClear from './memoizeClear';\nimport GridUtils from './GridUtils';\nimport GridColorUtils from './GridColorUtils';\nimport { isExpandableGridModel } from './ExpandableGridModel';\nimport {\n GridColor,\n GridColorWay,\n GridTheme,\n NullableGridColor,\n} from './GridTheme';\nimport GridModel from './GridModel';\nimport GridRange from './GridRange';\nimport GridMetrics, {\n BoxCoordinates,\n Coordinate,\n VisibleIndex,\n} from './GridMetrics';\nimport { getOrThrow } from './GridMetricCalculator';\nimport { isEditableGridModel } from './EditableGridModel';\nimport type { GridSeparator } from './mouse-handlers/GridSeparatorMouseHandler';\nimport { DraggingColumn } from './mouse-handlers/GridColumnMoveMouseHandler';\nimport GridColumnSeparatorMouseHandler from './mouse-handlers/GridColumnSeparatorMouseHandler';\nimport { BoundedAxisRange } from './GridAxisRange';\n\nexport type EditingCellTextSelectionRange = [start: number, end: number];\n\ntype NoneNullColumnRange = { startColumn: number; endColumn: number };\n\ntype NoneNullRowRange = { startRow: number; endRow: number };\n\nexport type EditingCell = {\n // Index of the editing cell\n column: VisibleIndex;\n row: VisibleIndex;\n\n // Selection within the text\n selectionRange?: EditingCellTextSelectionRange;\n\n // The value to use for the edit\n value: string;\n\n // Whether the selection was triggered with a quick edit action (e.g. Start typing with the cell in focus)\n isQuickEdit?: boolean;\n};\n\nexport type GridRenderState = {\n // The top/left cell of the scrolled viewport\n left: VisibleIndex;\n top: VisibleIndex;\n\n // Width and height of the total canvas area\n width: number;\n height: number;\n\n // The canvas context\n context: CanvasRenderingContext2D;\n\n // The grid theme\n theme: GridTheme;\n\n // The model used by the grid\n model: GridModel;\n\n // The grid metrics\n metrics: GridMetrics;\n\n // Location of the mouse on the grid\n mouseX: Coordinate | null;\n mouseY: Coordinate | null;\n\n // Where the keyboard cursor is located\n cursorColumn: VisibleIndex | null;\n cursorRow: VisibleIndex | null;\n\n // Currently selected ranges\n selectedRanges: GridRange[];\n\n // Currently dragged column/row information\n draggingColumn: DraggingColumn | null;\n draggingColumnSeparator: GridSeparator | null;\n draggingRow: VisibleIndex | null;\n draggingRowOffset: number | null;\n draggingRowSeparator: GridSeparator | null;\n\n // The currently editing cell\n editingCell: EditingCell | null;\n isDraggingHorizontalScrollBar: boolean;\n isDraggingVerticalScrollBar: boolean;\n isDragging: boolean;\n};\n\n/* eslint react/destructuring-assignment: \"off\" */\n/* eslint class-methods-use-this: \"off\" */\n/* eslint no-param-reassign: \"off\" */\n/**\n * A GridRenderer handles rendering the different parts of the grid\n * This default rendering just renders a basic grid. Extend this class and implement\n * your own methods to customize drawing of the grid (eg. Draw icons or special features)\n */\nexport class GridRenderer {\n // Default font width in pixels if it cannot be retrieved from the context\n static DEFAULT_FONT_WIDTH = 10;\n\n // Default radius in pixels for corners for some elements (like the active cell)\n static DEFAULT_EDGE_RADIUS = 2;\n\n // Default width in pixels for the border of the active cell\n static ACTIVE_CELL_BORDER_WIDTH = 2;\n\n /**\n * Truncate a string to the specified length and add ellipses if necessary\n * @param str The string to truncate\n * @param len The length to truncate the string to. If longer than the actual string, just returns the string\n * @returns The truncated string\n */\n static truncate(str: string, len: number): string {\n if (len < str.length) {\n // eslint-disable-next-line prefer-template\n return str.substr(0, len) + '…';\n }\n return str;\n }\n\n /**\n * Uses binary search to truncate a string to fit in the provided width\n * @param context The drawing context to measure the text in\n * @param str The string to get the maximum length it can draw\n * @param width The width to truncate it to\n * @param start The low boundary to start the search\n * @param end The high boundary to start the search\n * @param truncationChar This char will be repeated as the display string if the string is truncated instead of just adding an ellipsis\n * @returns The truncated string\n */\n static binaryTruncateToWidth(\n context: CanvasRenderingContext2D,\n str: string,\n width: number,\n start = 0,\n end = str.length,\n truncationChar?: string\n ): string {\n if (end >= str.length && context.measureText(str).width <= width) {\n // IDS-6069 If the whole string can fit, don't bother checking for truncation\n // The ellipses are actually slightly wider than other chars, and it's possible\n // that the \"truncation\" ends up being slightly longer, which messes up the search\n // algorithm below.\n // Besides, if we already fit, it's just faster to not bother checking other truncations.\n return str;\n }\n\n if (truncationChar) {\n const charWidth = context.measureText(truncationChar).width;\n return truncationChar.repeat(Math.max(1, Math.floor(width / charWidth)));\n }\n\n let lo = start;\n let hi = Math.min(str.length - 1, end);\n let result = str;\n while (hi >= lo) {\n const mid = Math.ceil((hi + lo) / 2);\n const truncatedStr = GridRenderer.truncate(str, mid);\n if (context.measureText(truncatedStr).width <= width) {\n result = truncatedStr;\n if (lo === mid) {\n break;\n }\n lo = mid;\n } else if (mid === 0) {\n // We already truncated to zero chars and it still doesn't fit, no need to keep looking\n result = truncatedStr;\n break;\n } else {\n hi = mid - 1;\n }\n }\n\n return result;\n }\n\n /**\n * Truncate a string (if necessary) to fit in the specified width.\n * First uses the estimated font width to calculate a lower/upper bound\n * Then uses binary search within those bounds to find the exact max length\n * @param context The drawing context\n * @param str The string to calculate max length for\n * @param width The width to truncate within\n * @param fontWidth The estimated width of each character\n * @param truncationChar This char will be repeated as the display string if the string is truncated instead of just adding an ellipsis\n * @returns The truncated string that fits within the width provided\n */\n static truncateToWidth(\n context: CanvasRenderingContext2D,\n str: string,\n width: number,\n fontWidth = GridRenderer.DEFAULT_FONT_WIDTH,\n truncationChar?: string\n ): string {\n if (width <= 0 || str.length <= 0) {\n return '';\n }\n\n // Estimate the possible low and high boundaries for truncating the text\n // Use the width of the space divided by the estimated width of each character,\n // and take half that as the low (minus 5 just to be extra safe), and double that as the high.\n const lo = Math.min(\n Math.max(0, Math.floor(width / fontWidth / 2) - 5),\n str.length\n );\n const hi = Math.min(Math.ceil((width / fontWidth) * 2), str.length);\n\n return GridRenderer.binaryTruncateToWidth(\n context,\n str,\n width,\n lo,\n hi,\n truncationChar\n );\n }\n\n /**\n * Draw the grid canvas with the state provided\n * @param state The state of the grid\n */\n drawCanvas(state: GridRenderState): void {\n const { context } = state;\n\n context.save();\n\n this.configureContext(context, state);\n\n this.drawBackground(context, state);\n\n this.drawGrid(context, state);\n\n this.drawHeaders(context, state);\n\n this.drawFooters(context, state);\n\n this.drawDraggingColumn(context, state);\n\n this.drawDraggingRow(context, state);\n\n this.drawScrollBars(context, state);\n\n context.restore();\n }\n\n configureContext(\n context: CanvasRenderingContext2D,\n state: GridRenderState\n ): void {\n const { theme } = state;\n context.font = theme.font;\n context.textBaseline = 'middle';\n context.lineCap = 'butt';\n }\n\n drawBackground(\n context: CanvasRenderingContext2D,\n state: GridRenderState\n ): void {\n const { theme, metrics } = state;\n const { width, height } = metrics;\n context.fillStyle = theme.backgroundColor;\n context.fillRect(0, 0, width, height);\n }\n\n drawGrid(context: CanvasRenderingContext2D, state: GridRenderState): void {\n const { metrics, draggingRow, draggingColumn } = state;\n const { gridX, gridY } = metrics;\n\n context.translate(gridX, gridY);\n\n this.drawGridBackground(\n context,\n state,\n draggingRow == null && draggingColumn == null\n );\n\n this.drawCellContents(context, state);\n\n this.drawFloatingRows(context, state);\n\n this.drawFloatingColumns(context, state);\n\n context.translate(-gridX, -gridY);\n }\n\n drawFloatingRows(\n context: CanvasRenderingContext2D,\n state: GridRenderState\n ): void {\n const { draggingRow, draggingColumn, metrics, theme } = state;\n const {\n floatingTopRowCount,\n floatingBottomRowCount,\n floatingRows,\n rowCount,\n visibleColumns,\n visibleRowYs,\n visibleRowHeights,\n } = metrics;\n\n if (floatingRows.length === 0) {\n return;\n }\n\n if (theme.floatingRowBackgroundColors) {\n this.drawRowStripesForRows(\n context,\n state,\n floatingRows,\n theme.floatingRowBackgroundColors\n );\n }\n\n if (draggingRow == null && draggingColumn == null) {\n this.drawFloatingMouseRowHover(context, state);\n }\n\n this.drawGridLinesForItems(\n context,\n state,\n visibleColumns,\n floatingRows,\n theme.floatingGridColumnColor,\n theme.floatingGridRowColor\n );\n\n this.drawCellBackgroundsForItems(\n context,\n state,\n visibleColumns,\n floatingRows\n );\n\n this.drawFloatingBorders(context, state);\n\n // Draw the floating row selection...\n if (floatingTopRowCount > 0) {\n this.drawSelectedRanges(context, state, {\n top: 0,\n bottom: floatingTopRowCount - 1,\n maxY:\n getOrThrow(visibleRowYs, floatingTopRowCount - 1) +\n getOrThrow(visibleRowHeights, floatingTopRowCount - 1) -\n 0.5,\n });\n }\n if (floatingBottomRowCount > 0) {\n this.drawSelectedRanges(context, state, {\n top: rowCount - floatingBottomRowCount - 1,\n bottom: rowCount - 1,\n minY: getOrThrow(visibleRowYs, rowCount - floatingBottomRowCount) + 0.5,\n maxY:\n getOrThrow(visibleRowYs, rowCount - 1) +\n getOrThrow(visibleRowHeights, rowCount - 1) -\n 0.5,\n });\n }\n\n // Draw the cell content...\n for (let c = 0; c < visibleColumns.length; c += 1) {\n const column = visibleColumns[c];\n for (let r = 0; r < floatingRows.length; r += 1) {\n const row = floatingRows[r];\n this.drawCellContent(context, state, column, row);\n }\n }\n }\n\n drawFloatingColumns(\n context: CanvasRenderingContext2D,\n state: GridRenderState\n ): void {\n const { draggingRow, draggingColumn, metrics, theme } = state;\n const {\n floatingLeftColumnCount,\n floatingRightColumnCount,\n floatingLeftWidth,\n floatingRightWidth,\n floatingColumns,\n gridX,\n maxX,\n columnCount,\n visibleRows,\n visibleColumnXs,\n visibleColumnWidths,\n width,\n height,\n } = metrics;\n\n if (floatingColumns.length === 0) {\n return;\n }\n\n if (theme.floatingRowBackgroundColors) {\n this.drawRowStripesForRows(\n context,\n state,\n visibleRows,\n theme.floatingRowBackgroundColors,\n 0,\n floatingLeftWidth\n );\n this.drawRowStripesForRows(\n context,\n state,\n visibleRows,\n theme.floatingRowBackgroundColors,\n width - gridX - floatingRightWidth,\n maxX\n );\n }\n\n if (draggingRow == null && draggingColumn == null) {\n this.drawFloatingMouseRowHover(context, state);\n }\n\n // Clip floated column grid lines.\n context.save();\n context.beginPath();\n context.rect(0, 0, floatingLeftWidth, height);\n context.clip();\n\n this.drawGridLinesForItems(\n context,\n state,\n floatingColumns,\n visibleRows,\n theme.floatingGridColumnColor,\n theme.floatingGridRowColor\n );\n\n context.restore();\n\n this.drawCellBackgroundsForItems(\n context,\n state,\n floatingColumns,\n visibleRows\n );\n\n this.drawFloatingBorders(context, state);\n\n // Draw the floating column selection...\n if (floatingLeftColumnCount > 0) {\n this.drawSelectedRanges(context, state, {\n left: 0,\n maxX:\n getOrThrow(visibleColumnXs, floatingLeftColumnCount - 1) +\n getOrThrow(visibleColumnWidths, floatingLeftColumnCount - 1),\n });\n }\n if (floatingRightColumnCount > 0) {\n this.drawSelectedRanges(context, state, {\n left: columnCount - floatingRightColumnCount,\n right: columnCount - 1,\n minX:\n getOrThrow(visibleColumnXs, columnCount - floatingRightColumnCount) +\n 0.5,\n maxX:\n getOrThrow(visibleColumnXs, columnCount - 1) +\n getOrThrow(visibleColumnWidths, columnCount - 1),\n });\n }\n\n // Draw the cell content...\n for (let c = 0; c < floatingColumns.length; c += 1) {\n const column = floatingColumns[c];\n for (let r = 0; r < visibleRows.length; r += 1) {\n const row = visibleRows[r];\n this.drawCellContent(context, state, column, row);\n }\n }\n }\n\n drawFloatingBorders(\n context: CanvasRenderingContext2D,\n state: GridRenderState\n ): void {\n const { metrics, theme } = state;\n const {\n floatingTopRowCount,\n floatingBottomRowCount,\n floatingLeftColumnCount,\n floatingRightColumnCount,\n rowCount,\n columnCount,\n visibleRowYs,\n visibleColumnXs,\n visibleRowHeights,\n visibleColumnWidths,\n maxX,\n maxY,\n } = metrics;\n const { floatingDividerOuterColor, floatingDividerInnerColor } = theme;\n\n context.lineWidth = 3;\n context.beginPath();\n context.strokeStyle = floatingDividerOuterColor;\n\n if (floatingTopRowCount > 0) {\n const y =\n getOrThrow(visibleRowYs, floatingTopRowCount - 1) +\n getOrThrow(visibleRowHeights, floatingTopRowCount - 1) +\n 0.5;\n context.moveTo(0, y);\n context.lineTo(maxX, y);\n }\n\n if (floatingBottomRowCount > 0) {\n const y =\n getOrThrow(visibleRowYs, rowCount - floatingBottomRowCount) - 0.5;\n context.moveTo(0, y);\n context.lineTo(maxX, y);\n }\n\n if (floatingLeftColumnCount > 0) {\n const x =\n getOrThrow(visibleColumnXs, floatingLeftColumnCount - 1) +\n getOrThrow(visibleColumnWidths, floatingLeftColumnCount - 1) +\n 0.5;\n context.moveTo(x, 0);\n context.lineTo(x, maxY);\n }\n\n if (floatingRightColumnCount > 0) {\n const x =\n getOrThrow(visibleColumnXs, columnCount - floatingRightColumnCount) -\n 0.5;\n context.moveTo(x, 0);\n context.lineTo(x, maxY);\n }\n\n context.stroke();\n\n context.beginPath();\n context.lineWidth = 1;\n context.strokeStyle = floatingDividerInnerColor;\n\n if (floatingTopRowCount > 0) {\n const y =\n getOrThrow(visibleRowYs, floatingTopRowCount - 1) +\n getOrThrow(visibleRowHeights, floatingTopRowCount - 1) +\n 0.5;\n context.moveTo(0, y);\n context.lineTo(maxX, y);\n }\n\n if (floatingBottomRowCount > 0) {\n const y =\n getOrThrow(visibleRowYs, rowCount - floatingBottomRowCount) - 0.5;\n context.moveTo(0, y);\n context.lineTo(maxX, y);\n }\n\n if (floatingLeftColumnCount > 0) {\n const x =\n getOrThrow(visibleColumnXs, floatingLeftColumnCount - 1) +\n getOrThrow(visibleColumnWidths, floatingLeftColumnCount - 1) +\n 0.5;\n context.moveTo(x, 0);\n context.lineTo(x, maxY);\n }\n\n if (floatingRightColumnCount > 0) {\n const x =\n getOrThrow(visibleColumnXs, columnCount - floatingRightColumnCount) -\n 0.5;\n context.moveTo(x, 0);\n context.lineTo(x, maxY);\n }\n\n context.stroke();\n }\n\n drawGridBackground(\n context: CanvasRenderingContext2D,\n state: GridRenderState,\n drawHover = false\n ): void {\n this.drawRowStripes(context, state);\n\n if (drawHover) {\n this.drawMouseColumnHover(context, state);\n\n this.drawMouseRowHover(context, state);\n }\n\n this.drawGridLines(context, state);\n\n this.drawCellBackgrounds(context, state);\n\n const { metrics } = state;\n const {\n bottom,\n right,\n floatingBottomRowCount,\n floatingLeftColumnCount,\n floatingRightColumnCount,\n floatingTopRowCount,\n columnCount,\n rowCount,\n visibleRowHeights,\n visibleRowYs,\n visibleColumnXs,\n visibleColumnWidths,\n width,\n height,\n } = metrics;\n this.drawSelectedRanges(context, state, {\n bottom: Math.min(bottom, rowCount - floatingBottomRowCount - 1),\n right: Math.min(right, columnCount - floatingRightColumnCount - 1),\n minX:\n floatingLeftColumnCount > 0 &&\n visibleColumnXs.has(floatingLeftColumnCount + 1)\n ? getOrThrow(visibleColumnXs, floatingLeftColumnCount + 1)\n : -10,\n minY:\n floatingTopRowCount > 0 && visibleRowYs.has(floatingTopRowCount + 1)\n ? getOrThrow(visibleRowYs, floatingTopRowCount + 1)\n : -10,\n maxX:\n floatingRightColumnCount > 0 &&\n visibleColumnXs.has(columnCount - floatingRightColumnCount - 1)\n ? getOrThrow(\n visibleColumnXs,\n columnCount - floatingRightColumnCount - 1\n ) +\n getOrThrow(\n visibleColumnWidths,\n columnCount - floatingRightColumnCount - 1\n ) -\n 0.5\n : width + 10,\n maxY:\n floatingBottomRowCount > 0 &&\n visibleRowYs.has(rowCount - floatingBottomRowCount - 1)\n ? getOrThrow(visibleRowYs, rowCount - floatingBottomRowCount - 1) +\n getOrThrow(\n visibleRowHeights,\n rowCount - floatingBottomRowCount - 1\n ) -\n 0.5\n : height + 10,\n });\n }\n\n drawRowStripes(\n context: CanvasRenderingContext2D,\n state: GridRenderState\n ): void {\n const { metrics, theme } = state;\n const { visibleRows } = metrics;\n const { rowBackgroundColors } = theme;\n if (!rowBackgroundColors) {\n return;\n }\n this.drawRowStripesForRows(\n context,\n state,\n visibleRows,\n rowBackgroundColors\n );\n }\n\n drawRowStripesForRows(\n context: CanvasRenderingContext2D,\n state: GridRenderState,\n rows: VisibleIndex[],\n rowBackgroundColors: GridColorWay,\n minX = 0,\n maxX = state.metrics.maxX\n ): void {\n const { theme, metrics, model } = state;\n const { maxDepth, shadowBlur, shadowColor } = theme;\n\n const colorSets = this.getCachedBackgroundColors(\n rowBackgroundColors,\n maxDepth\n );\n const { visibleRowYs, visibleRowHeights } = metrics;\n\n // Optimize by grouping together all rows that end up with the same color\n const colorRowMap = new Map();\n const topShadowRows: VisibleIndex[] = []; // Rows that are deeper than the row above them\n const bottomShadowRows: VisibleIndex[] = [];\n const addRowToColorMap = (\n row: VisibleIndex,\n rowAbove?: VisibleIndex\n ): void => {\n const depth = isExpandableGridModel(model) ? model.depthForRow(row) : 0;\n const colorSet = colorSets[row % colorSets.length];\n const color = colorSet[Math.min(depth, colorSet.length - 1)];\n if (!colorRowMap.has(color)) {\n colorRowMap.set(color, []);\n }\n colorRowMap.get(color).push(row);\n if (rowAbove != null) {\n const depthAbove = isExpandableGridModel(model)\n ? model.depthForRow(rowAbove)\n : 0;\n if (depthAbove < depth) {\n topShadowRows.push(row);\n } else if (depthAbove > depth) {\n bottomShadowRows.push(rowAbove);\n }\n }\n };\n\n // Add all the regular row stripes\n for (let i = 0; i < rows.length; i += 1) {\n const row = rows[i];\n const rowAbove = i > 0 ? rows[i - 1] : undefined;\n addRowToColorMap(row, rowAbove);\n }\n\n colorRowMap.forEach((colorRows, color) => {\n context.fillStyle = color;\n\n context.beginPath();\n\n for (let i = 0; i < colorRows.length; i += 1) {\n const row = colorRows[i];\n const y = getOrThrow(visibleRowYs, row);\n const rowHeight = getOrThrow(visibleRowHeights, row);\n context.rect(minX, y, maxX, rowHeight);\n }\n\n context.fill();\n });\n\n if (topShadowRows.length > 0) {\n context.save();\n\n const startColor = this.getCachedColorWithAlpha(shadowColor, 0.15);\n const endColor = this.getCachedColorWithAlpha(shadowColor, 0);\n const gradient = context.createLinearGradient(0, 0, 0, shadowBlur);\n gradient.addColorStop(0, startColor);\n gradient.addColorStop(1, endColor);\n context.fillStyle = gradient;\n\n for (let i = 0; i < topShadowRows.length; i += 1) {\n const row = topShadowRows[i];\n const y = getOrThrow(visibleRowYs, row);\n // Use a translate so we can reuse the gradient\n context.translate(0, y);\n context.fillRect(minX, 0, maxX, shadowBlur);\n context.translate(0, -y);\n }\n\n context.restore();\n }\n\n if (bottomShadowRows.length > 0) {\n context.save();\n\n const startColor = this.getCachedColorWithAlpha(shadowColor, 0);\n const endColor = this.getCachedColorWithAlpha(shadowColor, 0.15);\n const gradient = context.createLinearGradient(0, 0, 0, shadowBlur);\n gradient.addColorStop(0, startColor);\n gradient.addColorStop(1, endColor);\n context.fillStyle = gradient;\n\n for (let i = 0; i < bottomShadowRows.length; i += 1) {\n const row = bottomShadowRows[i];\n const y = getOrThrow(visibleRowYs, row);\n const rowHeight = getOrThrow(visibleRowHeights, row);\n const gradientY = y + rowHeight - shadowBlur;\n // Use a translate so we can reuse the gradient\n context.translate(0, gradientY);\n context.fillRect(minX, 0, maxX, shadowBlur);\n context.translate(0, -gradientY);\n }\n\n context.restore();\n }\n }\n\n drawMouseColumnHover(\n context: CanvasRenderingContext2D,\n state: GridRenderState\n ): void {\n const { mouseX, mouseY, theme, metrics } = state;\n if (mouseX == null || mouseY == null) return;\n\n const mouseColumn = GridUtils.getColumnAtX(mouseX, metrics);\n if (mouseColumn == null || !theme.columnHoverBackgroundColor) {\n return;\n }\n\n const { visibleColumnWidths, visibleColumnXs, maxY } = metrics;\n if (mouseY > maxY) {\n return;\n }\n\n const x = getOrThrow(visibleColumnXs, mouseColumn);\n const columnWidth = getOrThrow(visibleColumnWidths, mouseColumn);\n\n context.fillStyle = theme.columnHoverBackgroundColor;\n context.fillRect(x, 0, columnWidth, maxY);\n }\n\n drawMouseRowHover(\n context: CanvasRenderingContext2D,\n state: GridRenderState\n ): void {\n const { mouseX, mouseY, theme, metrics } = state;\n if (mouseX == null || mouseY == null) return;\n\n const { maxX } = metrics;\n if (mouseX > maxX || !theme.rowHoverBackgroundColor) {\n return;\n }\n\n const mouseRow = GridUtils.getRowAtY(mouseY, metrics);\n if (mouseRow == null) {\n return;\n }\n\n this.drawMouseRowHoverForRow(context, state, mouseRow);\n }\n\n drawFloatingMouseRowHover(\n context: CanvasRenderingContext2D,\n state: GridRenderState\n ): void {\n const { mouseX, mouseY, theme, metrics } = state;\n const {\n maxX,\n floatingTopRowCount,\n floatingBottomRowCount,\n rowCount,\n rowFooterWidth,\n } = metrics;\n if (\n mouseX == null ||\n mouseY == null ||\n mouseX > maxX + rowFooterWidth ||\n !theme.rowHoverBackgroundColor\n ) {\n return;\n }\n\n const mouseRow = GridUtils.getRowAtY(mouseY, metrics);\n if (\n mouseRow != null &&\n (mouseRow < floatingTopRowCount ||\n rowCount - floatingBottomRowCount <= mouseRow)\n ) {\n this.drawMouseRowHoverForRow(context, state, mouseRow);\n }\n }\n\n drawMouseRowHoverForRow(\n context: CanvasRenderingContext2D,\n state: GridRenderState,\n row: VisibleIndex\n ): void {\n const { metrics, selectedRanges, theme } = state;\n const { visibleRowHeights, visibleRowYs, maxX } = metrics;\n\n const y = getOrThrow(visibleRowYs, row);\n const rowHeight = getOrThrow(visibleRowHeights, row);\n\n if (theme.rowHoverBackgroundColor) {\n context.fillStyle = theme.rowHoverBackgroundColor;\n }\n for (let i = 0; i < selectedRanges.length; i += 1) {\n const { startRow, endRow } = selectedRanges[i];\n if (\n startRow != null &&\n endRow != null &&\n startRow <= row &&\n endRow >= row\n ) {\n if (theme.selectedRowHoverBackgroundColor) {\n context.fillStyle = theme.selectedRowHoverBackgroundColor;\n }\n break;\n }\n }\n context.fillRect(0, y, maxX, rowHeight);\n }\n\n drawGridLines(\n context: CanvasRenderingContext2D,\n state: GridRenderState\n ): void {\n const { metrics, theme } = state;\n const { visibleColumns, visibleRows } = metrics;\n\n this.drawGridLinesForItems(\n context,\n state,\n visibleColumns,\n visibleRows,\n theme.gridColumnColor,\n theme.gridRowColor\n );\n }\n\n drawGridLinesForItems(\n context: CanvasRenderingContext2D,\n state: GridRenderState,\n columns: VisibleIndex[],\n rows: VisibleIndex[],\n columnColor: NullableGridColor,\n rowColor: NullableGridColor\n ): void {\n if (!columnColor && !rowColor) {\n return;\n }\n\n context.lineWidth = 1;\n context.beginPath();\n\n if (columnColor) {\n context.strokeStyle = columnColor;\n this.drawGridLinesForColumns(context, state, columns);\n }\n if (rowColor) {\n context.strokeStyle = rowColor;\n this.drawGridLinesForRows(context, state, rows);\n }\n\n context.stroke();\n }\n\n drawGridLinesForColumns(\n context: CanvasRenderingContext2D,\n state: GridRenderState,\n columns: VisibleIndex[]\n ): void {\n const { metrics } = state;\n const { visibleColumnXs, maxY } = metrics;\n for (let i = 0; i < columns.length; i += 1) {\n const column = columns[i];\n const x = getOrThrow(visibleColumnXs, column) + 0.5;\n context.moveTo(x, 0);\n context.lineTo(x, maxY);\n }\n }\n\n drawGridLinesForRows(\n context: CanvasRenderingContext2D,\n state: GridRenderState,\n rows: VisibleIndex[]\n ): void {\n const { metrics } = state;\n const { visibleRowYs, maxX: metricsMaxX } = metrics;\n const maxX = metricsMaxX;\n\n // Draw row lines\n for (let i = 0; i < rows.length; i += 1) {\n const row = rows[i];\n const y = getOrThrow(visibleRowYs, row) + 0.5;\n context.moveTo(0.5, y);\n context.lineTo(maxX - 0.5, y);\n }\n }\n\n drawCellBackgrounds(\n context: CanvasRenderingContext2D,\n state: GridRenderState\n ): void {\n const { metrics } = state;\n const { visibleColumns, visibleRows } = metrics;\n this.drawCellBackgroundsForItems(\n context,\n state,\n visibleColumns,\n visibleRows\n );\n }\n\n drawCellBackgroundsForItems(\n context: CanvasRenderingContext2D,\n state: GridRenderState,\n columns: VisibleIndex[],\n rows: VisibleIndex[]\n ): void {\n context.save();\n\n for (let i = 0; i < columns.length; i += 1) {\n const column = columns[i];\n\n for (let j = 0; j < rows.length; j += 1) {\n const row = rows[j];\n const rowAfter = j + 1 < rows.length ? rows[j + 1] : undefined;\n this.drawCellBackground(context, state, column, row, rowAfter);\n }\n }\n\n context.restore();\n }\n\n drawCellBackground(\n context: CanvasRenderingContext2D,\n state: GridRenderState,\n column: VisibleIndex,\n row: VisibleIndex,\n rowAfter?: VisibleIndex\n ): void {\n const { metrics, model, theme } = state;\n const {\n firstColumn,\n modelColumns,\n modelRows,\n visibleColumnXs,\n visibleColumnWidths,\n visibleRowYs,\n visibleRowHeights,\n } = metrics;\n const modelRow = getOrThrow(modelRows, row);\n const modelColumn = getOrThrow(modelColumns, column);\n const backgroundColor = model.backgroundColorForCell(\n modelColumn,\n modelRow,\n theme\n );\n const isFirstColumn = column === firstColumn;\n const hasExpandableRows =\n isExpandableGridModel(model) && model.hasExpandableRows;\n\n if (backgroundColor) {\n const x = getOrThrow(visibleColumnXs, column) + 1;\n const y = getOrThrow(visibleRowYs, row) + 1;\n const columnWidth = getOrThrow(visibleColumnWidths, column) - 1;\n const rowHeight = getOrThrow(visibleRowHeights, row) - 1;\n context.fillStyle = backgroundColor;\n context.fillRect(x, y, columnWidth, rowHeight);\n }\n\n if (isFirstColumn && hasExpandableRows) {\n this.drawCellRowTreeDepthLines(context, state, row, rowAfter);\n }\n }\n\n drawCellContents(\n context: CanvasRenderingContext2D,\n state: GridRenderState\n ): void {\n const { metrics } = state;\n const { visibleColumns } = metrics;\n\n for (let i = 0; i < visibleColumns.length; i += 1) {\n const column = visibleColumns[i];\n this.drawColumnCellContents(context, state, column);\n }\n }\n\n drawColumnCellContents(\n context: CanvasRenderingContext2D,\n state: GridRenderState,\n column: VisibleIndex\n ): void {\n const { metrics } = state;\n const {\n visibleColumnXs,\n visibleColumnWidths,\n visibleRows,\n height,\n } = metrics;\n const x = getOrThrow(visibleColumnXs, column);\n const columnWidth = getOrThrow(visibleColumnWidths, column);\n\n context.save();\n\n context.beginPath();\n context.rect(x, 0, columnWidth, height);\n context.clip();\n\n for (let i = 0; i < visibleRows.length; i += 1) {\n const row = visibleRows[i];\n this.drawCellContent(context, state, column, row);\n }\n context.restore();\n }\n\n /**\n * Gets textWidth and X-Y position for a specific cell\n * The textWidth returned is the width that the text can occupy accounting for any other cell markings\n * The width accounts for tree table indents and cell padding, so it is the width the text may consume\n *\n * @param context Canvas context\n * @param state GridRenderState to get the text metrics for\n * @param column Column of cell to get text metrics for\n * @param row Row of cell to get text metrics for\n * @returns Object with width, x, and y of the text\n */\n getTextRenderMetrics(\n context: CanvasRenderingContext2D,\n state: GridRenderState,\n column: VisibleIndex,\n row: VisibleIndex\n ): {\n width: number;\n x: number;\n y: number;\n } {\n const { textAlign } = context;\n const { metrics, model, theme } = state;\n const {\n firstColumn,\n visibleColumnXs,\n visibleColumnWidths,\n visibleRowYs,\n visibleRowHeights,\n } = metrics;\n const {\n cellHorizontalPadding,\n treeDepthIndent,\n treeHorizontalPadding,\n } = theme;\n\n const x = getOrThrow(visibleColumnXs, column);\n const y = getOrThrow(visibleRowYs, row);\n const columnWidth = getOrThrow(visibleColumnWidths, column);\n const rowHeight = getOrThrow(visibleRowHeights, row);\n const isFirstColumn = column === firstColumn;\n let treeIndent = 0;\n if (\n isExpandableGridModel(model) &&\n model.hasExpandableRows &&\n isFirstColumn\n ) {\n treeIndent =\n treeDepthIndent * (model.depthForRow(row) + 1) + treeHorizontalPadding;\n }\n const textWidth = columnWidth - treeIndent;\n let textX = x + cellHorizontalPadding;\n const textY = y + rowHeight * 0.5;\n if (textAlign === 'right') {\n textX = x + textWidth - cellHorizontalPadding;\n } else if (textAlign === 'center') {\n textX = x + textWidth * 0.5;\n }\n textX += treeIndent;\n\n return {\n width: textWidth - cellHorizontalPadding * 2,\n x: textX,\n y: textY,\n };\n }\n\n drawCellContent(\n context: CanvasRenderingContext2D,\n state: GridRenderState,\n column: VisibleIndex,\n row: VisibleIndex,\n textOverride?: string\n ): void {\n const { metrics, model, theme } = state;\n const {\n firstColumn,\n fontWidths,\n modelColumns,\n modelRows,\n visibleRowHeights,\n } = metrics;\n const { textColor } = theme;\n const rowHeight = getOrThrow(visibleRowHeights, row);\n const modelRow = getOrThrow(modelRows, row);\n const modelColumn = getOrThrow(modelColumns, column);\n const text = textOverride ?? model.textForCell(modelColumn, modelRow);\n const truncationChar = model.truncationCharForCell(modelColumn, modelRow);\n const isFirstColumn = column === firstColumn;\n\n if (text && rowHeight > 0) {\n const textAlign = model.textAlignForCell(modelColumn, modelRow) || 'left';\n context.textAlign = textAlign;\n\n const color =\n model.colorForCell(modelColumn, modelRow, theme) || textColor;\n context.fillStyle = color;\n\n const {\n width: textWidth,\n x: textX,\n y: textY,\n } = this.getTextRenderMetrics(context, state, column, row);\n\n const fontWidth =\n fontWidths.get(context.font) ?? GridRenderer.DEFAULT_FONT_WIDTH;\n const truncatedText = this.getCachedTruncatedString(\n context,\n text,\n textWidth,\n fontWidth,\n truncationChar\n );\n if (truncatedText) {\n context.fillText(truncatedText, textX, textY);\n }\n }\n\n if (\n isFirstColumn &&\n isExpandableGridModel(model) &&\n model.hasExpandableRows\n ) {\n this.drawCellRowTreeMarker(context, state, row);\n }\n }\n\n drawCellRowTreeMarker(\n context: CanvasRenderingContext2D,\n state: GridRenderState,\n row: VisibleIndex\n ): void {\n const { metrics, model, mouseX, mouseY, theme } = state;\n const {\n firstColumn,\n gridX,\n gridY,\n visibleColumnXs,\n visibleColumnWidths,\n visibleRowYs,\n visibleRowHeights,\n visibleRowTreeBoxes,\n } = metrics;\n const { treeMarkerColor, treeMarkerHoverColor } = theme;\n const columnX = getOrThrow(visibleColumnXs, firstColumn);\n const columnWidth = getOrThrow(visibleColumnWidths, firstColumn);\n const rowY = getOrThrow(visibleRowYs, row);\n const rowHeight = getOrThrow(visibleRowHeights, row);\n if (!isExpandableGridModel(model) || !model.isRowExpandable(row)) {\n return;\n }\n\n const treeBox = getOrThrow(visibleRowTreeBoxes, row);\n const color =\n mouseX != null &&\n mouseY != null &&\n mouseX >= gridX + columnX &&\n mouseX <= gridX + columnX + columnWidth &&\n mouseY >= gridY + rowY &&\n mouseY <= gridY + rowY + rowHeight\n ? treeMarkerHoverColor\n : treeMarkerColor;\n\n this.drawTreeMarker(\n context,\n state,\n columnX,\n rowY,\n treeBox,\n color,\n model.isRowExpanded(row)\n );\n }\n\n drawTreeMarker(\n context: CanvasRenderingContext2D,\n state: GridRenderState,\n columnX: Coordinate,\n rowY: Coordinate,\n treeBox: BoxCoordinates,\n color: GridColor,\n isExpanded: boolean\n ): void {\n const { x1, y1, x2, y2 } = treeBox;\n const markerText = isExpanded ? '⊟' : '⊞';\n const textX = columnX + (x1 + x2) * 0.5 + 0.5;\n const textY = rowY + (y1 + y2) * 0.5 + 0.5;\n context.fillStyle = color;\n context.textAlign = 'center';\n context.fillText(markerText, textX, textY);\n }\n\n drawCellRowTreeDepthLines(\n context: CanvasRenderingContext2D,\n state: GridRenderState,\n row: VisibleIndex,\n rowAfter?: VisibleIndex\n ): void {\n const { metrics, model, theme } = state;\n\n if (!isExpandableGridModel(model)) return;\n\n const depth = model.depthForRow(row);\n if (depth === 0) return;\n\n const {\n firstColumn,\n visibleColumnXs,\n visibleRowYs,\n visibleRowHeights,\n } = metrics;\n const { treeDepthIndent, treeHorizontalPadding, treeLineColor } = theme;\n const columnX = getOrThrow(visibleColumnXs, firstColumn);\n const rowY = getOrThrow(visibleRowYs, row);\n const rowHeight = getOrThrow(visibleRowHeights, row);\n const depthRowAfter =\n rowAfter !== undefined ? model.depthForRow(rowAfter) : 0;\n const depthDiff = depth > depthRowAfter ? depth - depthRowAfter : 0;\n\n context.strokeStyle = treeLineColor;\n context.lineWidth = 1;\n\n // draw normal depth lines\n if (depth - depthDiff > 0) {\n context.beginPath();\n for (let i = 0; i < depth - depthDiff; i += 1) {\n const lineX =\n columnX +\n i * treeDepthIndent +\n treeDepthIndent * 0.5 +\n treeHorizontalPadding +\n 0.5;\n context.moveTo(lineX, rowY);\n context.lineTo(lineX, rowY + rowHeight);\n }\n context.stroke();\n }\n\n // draw as hockey stick if last row at depth\n if (depthDiff > 0) {\n context.beginPath();\n for (let i = depth - depthDiff; i < depth; i += 1) {\n const lineX =\n columnX +\n i * treeDepthIndent +\n treeDepthIndent * 0.5 +\n treeHorizontalPadding +\n 0.5;\n context.moveTo(lineX, rowY);\n context.lineTo(lineX, rowY + Math.ceil(rowHeight / 2));\n // extra moveTo prevents halfpixel in corner\n context.moveTo(lineX - 0.5, rowY + Math.ceil(rowHeight / 2) + 0.5);\n context.lineTo(\n lineX + treeDepthIndent - 0.5,\n rowY + Math.ceil(rowHeight / 2) + 0.5\n );\n }\n context.stroke();\n }\n }\n\n getCachedTruncatedString = memoizeClear(\n (\n context: CanvasRenderingContext2D,\n text: string,\n width: number,\n fontWidth: number,\n truncationChar?: string\n ): string =>\n GridRenderer.truncateToWidth(\n context,\n text,\n width,\n fontWidth,\n truncationChar\n ),\n { max: 10000 }\n );\n\n getCachedBackgroundColors = memoizeClear(\n (backgroundColors: GridColorWay, maxDepth: number): GridColor[][] =>\n backgroundColors.split(' ').map(color => {\n const colors = [];\n for (let i = 0; i < maxDepth; i += 1) {\n colors.push(GridColorUtils.darkenForDepth(color, i, maxDepth));\n }\n return colors;\n }),\n { max: 1000 }\n );\n\n getCachedColorWithAlpha = memoizeClear(\n (color, alpha) => GridColorUtils.colorWithAlpha(color, alpha),\n { max: 1000 }\n );\n\n drawHeaders(context: CanvasRenderingContext2D, state: GridRenderState): void {\n const { theme } = state;\n\n context.font = theme.headerFont;\n\n this.drawColumnHeaders(context, state);\n\n this.drawRowHeaders(context, state);\n }\n\n drawFooters(context: CanvasRenderingContext2D, state: GridRenderState): void {\n const { theme } = state;\n\n context.font = theme.headerFont;\n\n this.drawRowFooters(context, state);\n }\n\n drawColumnHeaders(\n context: CanvasRenderingContext2D,\n state: GridRenderState\n ): void {\n const {\n mouseX,\n mouseY,\n theme,\n metrics,\n draggingColumnSeparator,\n isDragging,\n model,\n } = state;\n const {\n columnHeaderHeight,\n floatingColumns,\n gridX,\n width,\n visibleColumns,\n visibleColumnWidths,\n visibleColumnXs,\n floatingLeftColumnCount,\n floatingLeftWidth,\n floatingRightWidth,\n modelColumns,\n columnHeaderMaxDepth,\n } = metrics;\n if (columnHeaderHeight <= 0) {\n return;\n }\n\n const {\n headerHiddenSeparatorSize,\n headerHiddenSeparatorHoverColor,\n headerSeparatorColor,\n headerSeparatorHoverColor,\n } = theme;\n const hiddenSeparatorHeight = columnHeaderHeight * 0.5;\n const hiddenY =\n columnHeaderHeight * (columnHeaderMaxDepth - 1) +\n columnHeaderHeight * 0.5 -\n hiddenSeparatorHeight * 0.5;\n const containsFrozenColumns = floatingLeftColumnCount > 0;\n\n context.save();\n\n this.drawColumnHeadersForRange(\n context,\n state,\n [visibleColumns[0], visibleColumns[visibleColumns.length - 1]],\n {\n minX: gridX + floatingLeftWidth,\n maxX: width - floatingRightWidth,\n }\n );\n\n if (containsFrozenColumns) {\n this.drawColumnHeadersForRange(\n context,\n state,\n [floatingColumns[0], floatingColumns[floatingColumns.length - 1]],\n {\n minX: gridX,\n maxX: gridX + floatingLeftWidth,\n }\n );\n }\n\n if (headerSeparatorColor) {\n context.strokeStyle = headerSeparatorColor;\n\n const hiddenColumns = [...visibleColumnWidths.entries()]\n .filter(([_, w]) => w === 0)\n .map(([index]) => index);\n\n // Now draw the hidden column separator boxes\n context.beginPath();\n context.fillStyle = headerSeparatorColor;\n for (let i = 0; i < hiddenColumns.length; i += 1) {\n const column = hiddenColumns[i];\n const columnX = getOrThrow(visibleColumnXs, column);\n const columnWidth = getOrThrow(visibleColumnWidths, column);\n const minX =\n gridX + columnX + columnWidth + 0.5 - headerHiddenSeparatorSize * 0.5;\n context.rect(\n minX,\n hiddenY,\n headerHiddenSeparatorSize,\n hiddenSeparatorHeight\n );\n }\n context.fill();\n }\n\n if (headerSeparatorHoverColor) {\n let { index: highlightedSeparator, depth } =\n draggingColumnSeparator ?? {};\n\n if (highlightedSeparator == null && mouseX != null && mouseY != null) {\n const separator = GridColumnSeparatorMouseHandler.getColumnSeparator(\n GridUtils.getGridPointFromXY(mouseX, mouseY, metrics),\n metrics,\n model,\n theme\n );\n highlightedSeparator = separator?.index;\n depth = separator?.depth;\n }\n\n let shouldDrawSeparator: boolean;\n\n if (highlightedSeparator == null) {\n shouldDrawSeparator = false;\n } else {\n const columnIndex = modelColumns.get(highlightedSeparator);\n const nextColumnIndex = modelColumns.get(highlightedSeparator + 1);\n if (columnIndex == null || nextColumnIndex == null) {\n shouldDrawSeparator = false;\n } else {\n shouldDrawSeparator =\n model.textForColumnHeader(columnIndex, depth) !==\n model.textForColumnHeader(nextColumnIndex, depth);\n }\n }\n\n if (\n shouldDrawSeparator &&\n highlightedSeparator != null &&\n depth != null &&\n (!isDragging || draggingColumnSeparator != null)\n ) {\n context.strokeStyle = headerSeparatorHoverColor;\n\n const columnX = getOrThrow(visibleColumnXs, highlightedSeparator);\n const columnWidth = getOrThrow(\n visibleColumnWidths,\n highlightedSeparator\n );\n const x = gridX + columnX + columnWidth + 0.5;\n const visibleColumnIndex = visibleColumns.indexOf(highlightedSeparator);\n const nextColumn =\n visibleColumnIndex < visibleColumns.length - 1\n ? visibleColumns[visibleColumnIndex + 1]\n : null;\n const nextColumnWidth =\n nextColumn != null ? visibleColumnWidths.get(nextColumn) : null;\n const isColumnHidden = columnWidth === 0;\n const isNextColumnHidden =\n nextColumnWidth != null && nextColumnWidth === 0;\n if (isColumnHidden) {\n context.strokeStyle = headerHiddenSeparatorHoverColor;\n context.fillStyle = headerHiddenSeparatorHoverColor;\n context.fillRect(\n x,\n hiddenY,\n headerHiddenSeparatorSize * 0.5,\n hiddenSeparatorHeight\n );\n } else if (isNextColumnHidden) {\n context.fillStyle = headerSeparatorHoverColor;\n context.fillRect(\n x - headerHiddenSeparatorSize * 0.5,\n hiddenY,\n headerHiddenSeparatorSize * 0.5,\n hiddenSeparatorHeight\n );\n }\n\n // column seperator hover line\n context.beginPath();\n context.moveTo(\n x,\n (columnHeaderMaxDepth - depth - 1) * columnHeaderHeight\n );\n context.lineTo(\n x,\n (columnHeaderMaxDepth - depth) * columnHeaderHeight - 1\n );\n context.stroke();\n }\n }\n\n context.restore();\n }\n\n drawColumnHeadersForRange(\n context: CanvasRenderingContext2D,\n state: GridRenderState,\n range: BoundedAxisRange,\n bounds: { minX: number; maxX: number }\n ): void {\n const { model } = state;\n const { columnHeaderMaxDepth } = model;\n\n if (columnHeaderMaxDepth === 0) {\n return;\n }\n\n for (let d = 0; d <= columnHeaderMaxDepth; d += 1) {\n this.drawColumnHeadersAtDepth(context, state, range, bounds, d);\n }\n }\n\n drawColumnHeadersAtDepth(\n context: CanvasRenderingContext2D,\n state: GridRenderState,\n range: BoundedAxisRange,\n bounds: { minX: number; maxX: number },\n depth: number\n ): void {\n const { metrics, model, theme } = state;\n const {\n modelColumns,\n visibleColumnXs,\n gridX,\n calculatedColumnWidths,\n userColumnWidths,\n visibleColumnWidths,\n movedColumns,\n } = metrics;\n const {\n headerBackgroundColor,\n headerColor,\n headerSeparatorColor,\n columnHeaderHeight,\n columnWidth,\n } = theme;\n const { columnHeaderMaxDepth } = model;\n const { minX, maxX } = bounds;\n const visibleWidth = maxX - minX;\n\n if (columnHeaderMaxDepth === 0) {\n return;\n }\n\n const startIndex = range[0];\n const endIndex = range[1];\n\n context.save();\n context.translate(\n 0,\n (columnHeaderMaxDepth - depth - 1) * columnHeaderHeight\n );\n\n if (depth === 0) {\n // Make sure base column header background always goes to the right edge\n this.drawColumnHeader(context, state, '', minX, maxX, {\n backgroundColor: headerBackgroundColor,\n separatorColor: headerSeparatorColor,\n });\n\n // Draw base column headers\n for (let i = startIndex; i <= endIndex; i += 1) {\n this.drawColumnHeaderAtIndex(context, state, i, bounds);\n }\n }\n\n // Draw column header group\n if (depth > 0) {\n let columnIndex = startIndex;\n\n while (columnIndex <= endIndex) {\n const { columnCount } = metrics;\n const modelColumn = getOrThrow(modelColumns, columnIndex);\n const columnGroupName = model.textForColumnHeader(modelColumn, depth);\n const columnGroupColor = model.colorForColumnHeader(modelColumn, depth);\n let columnGroupLeft = getOrThrow(visibleColumnXs, columnIndex) + gridX;\n let columnGroupRight =\n columnGroupLeft + getOrThrow(visibleColumnWidths, columnIndex);\n\n if (columnGroupName != null) {\n // Need to determine if the column group is at least the width of the bounds\n // And if the left/right of the group extend past the bounds\n // The group will be drawn as if it were a column with a max width of the bounds width\n let prevColumnIndex = columnIndex - 1;\n while (\n prevColumnIndex >= 0 &&\n (columnGroupRight - columnGroupLeft < visibleWidth ||\n columnGroupLeft > minX)\n ) {\n const prevModelIndex =\n modelColumns.get(prevColumnIndex) ??\n GridUtils.getModelIndex(prevColumnIndex, movedColumns);\n if (\n prevModelIndex == null ||\n model.textForColumnHeader(prevModelIndex, depth) !==\n columnGroupName\n ) {\n // Previous column not in the same group\n break;\n }\n\n // Use this instead of visibleColumnWidths b/c the columns may be off screen\n const prevColumnWidth =\n userColumnWidths.get(prevModelIndex) ??\n calculatedColumnWidths.get(prevModelIndex) ??\n columnWidth;\n\n columnGroupLeft -= prevColumnWidth;\n prevColumnIndex -= 1;\n }\n\n let nextColumnIndex = columnIndex + 1;\n while (\n nextColumnIndex < columnCount &&\n (columnGroupRight - columnGroupLeft < visibleWidth ||\n columnGroupRight < maxX)\n ) {\n const nextModelIndex =\n modelColumns.get(nextColumnIndex) ??\n GridUtils.getModelIndex(nextColumnIndex, movedColumns);\n if (\n model.textForColumnHeader(nextModelIndex, depth) !==\n columnGroupName\n ) {\n // Next column not in the same group\n break;\n }\n\n // Use this instead of visibleColumnWidths b/c the columns may be off screen\n const nextColumnWidth =\n userColumnWidths.get(nextModelIndex) ??\n calculatedColumnWidths.get(nextModelIndex) ??\n columnWidth;\n\n columnGroupRight += nextColumnWidth;\n nextColumnIndex += 1;\n }\n\n // Set column index to end of the current group\n columnIndex = nextColumnIndex - 1;\n\n const isFullWidth =\n columnGroupRight - columnGroupLeft >= visibleWidth;\n let x = columnGroupLeft;\n if (isFullWidth) {\n if (columnGroupRight < maxX) {\n x = columnGroupRight - visibleWidth;\n } else if (columnGroupLeft < minX) {\n x = minX;\n }\n }\n\n this.drawColumnHeader(\n context,\n state,\n columnGroupName,\n x,\n Math.min(columnGroupRight - columnGroupLeft, visibleWidth),\n {\n backgroundColor: columnGroupColor ?? headerBackgroundColor,\n textColor: headerColor,\n separatorColor: headerSeparatorColor,\n },\n bounds\n );\n }\n columnIndex += 1;\n }\n }\n context.restore();\n }\n\n /**\n * Draws the column header for the given visible index\n * @param context Canvas context\n * @param state Grid render state\n * @param index Visible index of the column header to draw\n * @param bounds The horizontal bounds the header can be drawn in\n */\n drawColumnHeaderAtIndex(\n context: CanvasRenderingContext2D,\n state: GridRenderState,\n index: VisibleIndex,\n bounds: { minX: number; maxX: number }\n ): void {\n const { metrics, model, theme } = state;\n const {\n modelColumns,\n visibleColumnWidths,\n visibleColumnXs,\n gridX,\n } = metrics;\n const width = getOrThrow(visibleColumnWidths, index);\n const x = getOrThrow(visibleColumnXs, index) + gridX;\n const modelColumn = getOrThrow(modelColumns, index);\n const text = model.textForColumnHeader(modelColumn);\n const { headerBackgroundColor, headerColor, headerSeparatorColor } = theme;\n\n if (text == null) {\n return;\n }\n\n this.drawColumnHeader(\n context,\n state,\n text,\n x,\n width,\n {\n backgroundColor:\n model.colorForColumnHeader(modelColumn) ?? headerBackgroundColor,\n textColor: headerColor,\n separatorColor: headerSeparatorColor,\n },\n bounds\n );\n }\n\n drawColumnHeader(\n context: CanvasRenderingContext2D,\n state: GridRenderState,\n columnText: string,\n columnX: Coordinate,\n columnWidth: number,\n style?: {\n backgroundColor?: string;\n textColor?: string;\n separatorColor?: string;\n },\n bounds?: { minX?: number; maxX?: number }\n ): void {\n if (columnWidth <= 0) {\n return;\n }\n const { metrics, theme } = state;\n\n const { headerHorizontalPadding, columnHeaderHeight } = theme;\n const { fontWidths, width } = metrics;\n const fontWidth =\n fontWidths.get(context.font) || GridRenderer.DEFAULT_FONT_WIDTH;\n\n const maxWidth = columnWidth - headerHorizontalPadding * 2;\n const maxLength = maxWidth / fontWidth;\n\n const { backgroundColor, textColor = '#ffffff', separatorColor } =\n style ?? {};\n let { minX = 0, maxX = width } = bounds ?? {};\n\n context.save();\n context.rect(minX, 0, maxX - minX, columnHeaderHeight);\n context.clip();\n\n // Fill background color if specified\n if (backgroundColor) {\n context.fillStyle = backgroundColor;\n context.fillRect(columnX, 0, columnWidth, columnHeaderHeight);\n }\n\n if (separatorColor) {\n context.strokeStyle = separatorColor;\n context.beginPath();\n\n // Don't draw left separator if column touches the left edge\n if (columnX > 0) {\n context.moveTo(columnX + 0.5, 0);\n context.lineTo(columnX + 0.5, columnHeaderHeight);\n }\n context.moveTo(columnX + columnWidth + 0.5, 0);\n context.lineTo(columnX + columnWidth + 0.5, columnHeaderHeight);\n\n // Bottom Border, should be interior to the header height\n context.moveTo(columnX, columnHeaderHeight - 0.5);\n context.lineTo(columnX + columnWidth, columnHeaderHeight - 0.5);\n context.stroke();\n }\n\n context.beginPath();\n context.rect(columnX, 0, columnWidth, columnHeaderHeight);\n context.clip();\n context.fillStyle = textColor;\n\n let renderText = columnText;\n\n if (maxLength <= 0) {\n renderText = '';\n } else if (renderText.length > maxLength) {\n renderText = `${renderText.substring(0, maxLength - 1)}…`;\n }\n\n const textWidth = renderText.length * fontWidth;\n let x = columnX + columnWidth * 0.5;\n const y = columnHeaderHeight * 0.5;\n minX += headerHorizontalPadding;\n maxX -= headerHorizontalPadding;\n\n const columnLeft = columnX + headerHorizontalPadding;\n const visibleLeft = clamp(columnLeft, minX, maxX);\n const columnRight = columnX + columnWidth - headerHorizontalPadding;\n const visibleRight = clamp(columnRight, minX, maxX);\n const visibleWidth = visibleRight - visibleLeft;\n\n const isBeyondLeft = x - textWidth * 0.5 < minX;\n const isBeyondRight = x + textWidth * 0.5 > maxX;\n\n if (isBeyondLeft) {\n // Column name would be off the left side of the canvas\n if (textWidth < visibleWidth) {\n // Can render the entire text in the visible space. Stick to left\n x = minX + textWidth * 0.5;\n } else {\n x = columnRight - textWidth * 0.5;\n }\n } else if (isBeyondRight) {\n if (textWidth < visibleWidth) {\n // Can render the entire text in the visible space. Stick to right\n x = maxX - textWidth * 0.5;\n } else {\n x = columnLeft + textWidth * 0.5;\n }\n }\n context.textAlign = 'center';\n context.fillText(renderText, x, y);\n\n context.restore();\n }\n\n drawRowHeaders(\n context: CanvasRenderingContext2D,\n state: GridRenderState\n ): void {\n const { mouseX, mouseY, metrics, theme, draggingRowSeparator } = state;\n const {\n gridY,\n rowHeaderWidth,\n height,\n visibleRows,\n visibleRowHeights,\n visibleRowYs,\n } = metrics;\n if (rowHeaderWidth <= 0) {\n return;\n }\n\n const {\n headerBackgroundColor,\n headerColor,\n headerHiddenSeparatorSize,\n headerHiddenSeparatorHoverColor,\n headerSeparatorColor,\n headerSeparatorHoverColor,\n } = theme;\n const hiddenSeparatorWidth = rowHeaderWidth * 0.5;\n const hiddenX = rowHeaderWidth * 0.5 - hiddenSeparatorWidth * 0.5;\n\n context.save();\n\n context.beginPath();\n\n // Fill in the background\n context.fillStyle = headerBackgroundColor;\n context.fillRect(0, 0, rowHeaderWidth, height);\n\n // Draw the separators\n if (headerSeparatorColor) {\n context.strokeStyle = headerSeparatorColor;\n context.beginPath();\n context.moveTo(0, gridY + 0.5);\n context.lineTo(rowHeaderWidth, gridY + 0.5);\n\n const hiddenRows = [];\n let isPreviousRowHidden = false;\n for (let i = 0; i < visibleRows.length; i += 1) {\n const row = visibleRows[i];\n const rowY = getOrThrow(visibleRowYs, row);\n const rowHeight = getOrThrow(visibleRowHeights, row);\n if (rowHeight > 0) {\n const y = gridY + rowY + rowHeight + 0.5;\n\n context.moveTo(0, y);\n context.lineTo(rowHeaderWidth, y);\n\n isPreviousRowHidden = false;\n } else if (!isPreviousRowHidden) {\n isPreviousRowHidden = true;\n hiddenRows.push(row);\n }\n }\n\n // border right, interior to the headerWidth\n context.moveTo(rowHeaderWidth - 0.5, 0);\n context.lineTo(rowHeaderWidth - 0.5, height);\n\n context.stroke();\n\n // Draw the hidden column separators\n context.beginPath();\n context.fillStyle = headerSeparatorColor;\n for (let i = 0; i < hiddenRows.length; i += 1) {\n const row = hiddenRows[i];\n const rowY = getOrThrow(visibleRowYs, row);\n const rowHeight = getOrThrow(visibleRowHeights, row);\n const minY =\n gridY + rowY + rowHeight + 0.5 - headerHiddenSeparatorSize * 0.5;\n context.rect(\n hiddenX,\n minY,\n hiddenSeparatorWidth,\n headerHiddenSeparatorSize\n );\n }\n\n context.fill();\n }\n\n if (headerSeparatorHoverColor) {\n let { index: highlightedSeparator = null } = draggingRowSeparator ?? {};\n if (highlightedSeparator == null && mouseX != null && mouseY != null) {\n highlightedSeparator = GridUtils.getRowSeparatorIndex(\n mouseX,\n mouseY,\n metrics,\n theme\n );\n }\n\n if (highlightedSeparator != null) {\n context.strokeStyle = headerSeparatorHoverColor;\n\n const rowY = getOrThrow(visibleRowYs, highlightedSeparator);\n const rowHeight = getOrThrow(visibleRowHeights, highlightedSeparator);\n const y = gridY + rowY + rowHeight + 0.5;\n\n const visibleRowIndex = visibleRows.indexOf(highlightedSeparator);\n const nextRow =\n visibleRowIndex < visibleRows.length - 1\n ? visibleRows[visibleRowIndex + 1]\n : null;\n const nextRowHeight =\n nextRow != null ? visibleRowHeights.get(nextRow) : null;\n const isRowHidden = rowHeight === 0;\n const isNextRowHidden = nextRowHeight != null && nextRowHeight === 0;\n if (isRowHidden) {\n context.strokeStyle = headerHiddenSeparatorHoverColor;\n context.fillStyle = headerHiddenSeparatorHoverColor;\n context.fillRect(\n hiddenX,\n y,\n hiddenSeparatorWidth,\n headerHiddenSeparatorSize * 0.5\n );\n } else if (isNextRowHidden) {\n context.fillStyle = headerSeparatorHoverColor;\n context.fillRect(\n hiddenX,\n y - headerHiddenSeparatorSize * 0.5,\n hiddenSeparatorWidth,\n headerHiddenSeparatorSize * 0.5\n );\n }\n\n context.beginPath();\n context.moveTo(0.5, y);\n context.lineTo(rowHeaderWidth + 0.5, y);\n context.stroke();\n }\n }\n\n // Fill in the text\n context.beginPath();\n context.rect(0, gridY, rowHeaderWidth, height);\n context.clip();\n\n context.fillStyle = headerColor;\n context.textAlign = 'right';\n\n for (let i = 0; i < visibleRows.length; i += 1) {\n const row = visibleRows[i];\n const rowHeight = getOrThrow(visibleRowHeights, row);\n const y = getOrThrow(visibleRowYs, row) + gridY;\n this.drawRowHeader(context, state, row, y, rowHeight);\n }\n\n context.restore();\n }\n\n drawRowHeader(\n context: CanvasRenderingContext2D,\n state: GridRenderState,\n row: VisibleIndex,\n rowY: Coordinate,\n rowHeight: number\n ): void {\n if (rowHeight <= 0) {\n return;\n }\n const { metrics, model, theme } = state;\n const { modelRows, rowHeaderWidth } = metrics;\n const modelRow = getOrThrow(modelRows, row);\n const x = rowHeaderWidth - theme.cellHorizontalPadding;\n const y = rowY + rowHeight * 0.5;\n context.fillText(model.textForRowHeader(modelRow), x, y);\n }\n\n drawRowFooters(\n context: CanvasRenderingContext2D,\n state: GridRenderState\n ): void {\n const {\n mouseX,\n mouseY,\n metrics,\n model,\n theme,\n draggingRowSeparator,\n } = state;\n const {\n gridY,\n gridX,\n maxX,\n modelRows,\n rowFooterWidth,\n height,\n verticalBarWidth,\n visibleRows,\n visibleRowHeights,\n visibleRowYs,\n width,\n } = metrics;\n if (rowFooterWidth <= 0) {\n return;\n }\n\n const {\n cellHorizontalPadding,\n headerBackgroundColor,\n headerColor,\n headerHiddenSeparatorSize,\n headerHiddenSeparatorHoverColor,\n headerSeparatorColor,\n headerSeparatorHoverColor,\n } = theme;\n const hiddenSeparatorWidth = rowFooterWidth * 0.5;\n const hiddenX = rowFooterWidth * 0.5 - hiddenSeparatorWidth * 0.5;\n const x = Math.min(gridX + maxX, width - rowFooterWidth - verticalBarWidth);\n\n context.save();\n\n context.beginPath();\n\n // Fill in the background\n context.fillStyle = headerBackgroundColor;\n context.fillRect(x, gridY, rowFooterWidth, height);\n\n // Draw the separators\n if (headerSeparatorColor) {\n context.strokeStyle = headerSeparatorColor;\n context.beginPath();\n context.moveTo(x, gridY + 0.5);\n context.lineTo(rowFooterWidth, gridY + 0.5);\n\n const hiddenRows = [];\n let isPreviousRowHidden = false;\n for (let i = 0; i < visibleRows.length; i += 1) {\n const row = visibleRows[i];\n const rowY = getOrThrow(visibleRowYs, row);\n const rowHeight = getOrThrow(visibleRowHeights, row);\n if (rowHeight > 0) {\n const y = gridY + rowY + rowHeight + 0.5;\n\n context.moveTo(x + 0.5, y);\n context.lineTo(x + rowFooterWidth - 0.5, y);\n\n isPreviousRowHidden = false;\n } else if (!isPreviousRowHidden) {\n isPreviousRowHidden = true;\n hiddenRows.push(row);\n }\n }\n\n // border left, interior to the headerWidth\n context.moveTo(x + 0.5, gridY);\n context.lineTo(x + 0.5, height);\n\n context.stroke();\n\n // Draw the hidden column separators\n context.beginPath();\n context.fillStyle = headerSeparatorColor;\n for (let i = 0; i < hiddenRows.length; i += 1) {\n const row = hiddenRows[i];\n const rowY = getOrThrow(visibleRowYs, row);\n const rowHeight = getOrThrow(visibleRowHeights, row);\n const minY =\n gridY + rowY + rowHeight + 0.5 - headerHiddenSeparatorSize * 0.5;\n context.rect(\n x + hiddenX,\n minY,\n hiddenSeparatorWidth,\n headerHiddenSeparatorSize\n );\n }\n\n context.fill();\n }\n\n if (headerSeparatorHoverColor) {\n let { index: highlightedSeparator = null } = draggingRowSeparator ?? {};\n if (highlightedSeparator == null && mouseX != null && mouseY != null) {\n highlightedSeparator = GridUtils.getRowSeparatorIndex(\n mouseX,\n mouseY,\n metrics,\n theme\n );\n }\n\n if (highlightedSeparator != null) {\n context.strokeStyle = headerSeparatorHoverColor;\n\n const rowY = getOrThrow(visibleRowYs, highlightedSeparator);\n const rowHeight = getOrThrow(visibleRowHeights, highlightedSeparator);\n const y = gridY + rowY + rowHeight + 0.5;\n\n const visibleRowIndex = visibleRows.indexOf(highlightedSeparator);\n const nextRow =\n visibleRowIndex < visibleRows.length - 1\n ? visibleRows[visibleRowIndex + 1]\n : null;\n const nextRowHeight =\n nextRow != null ? visibleRowHeights.get(nextRow) : null;\n const isRowHidden = rowHeight === 0;\n const isNextRowHidden = nextRowHeight != null && nextRowHeight === 0;\n if (isRowHidden) {\n context.strokeStyle = headerHiddenSeparatorHoverColor;\n context.fillStyle = headerHiddenSeparatorHoverColor;\n context.fillRect(\n hiddenX,\n y,\n hiddenSeparatorWidth,\n headerHiddenSeparatorSize * 0.5\n );\n } else if (isNextRowHidden) {\n context.fillStyle = headerSeparatorHoverColor;\n context.fillRect(\n hiddenX,\n y - headerHiddenSeparatorSize * 0.5,\n hiddenSeparatorWidth,\n headerHiddenSeparatorSize * 0.5\n );\n }\n\n context.beginPath();\n context.moveTo(x + 0.5, y);\n context.lineTo(x + rowFooterWidth + 0.5, y);\n context.stroke();\n }\n }\n\n // Fill in the text\n context.beginPath();\n context.rect(x, gridY, rowFooterWidth, height);\n context.clip();\n\n context.fillStyle = headerColor;\n context.textAlign = 'left';\n\n const textX = x + cellHorizontalPadding;\n for (let i = 0; i < visibleRows.length; i += 1) {\n const row = visibleRows[i];\n const rowHeight = getOrThrow(visibleRowHeights, row);\n if (rowHeight > 0) {\n const rowY = getOrThrow(visibleRowYs, row) + gridY;\n const modelRow = getOrThrow(modelRows, row);\n const textY = rowY + rowHeight * 0.5;\n context.fillText(model.textForRowFooter(modelRow), textX, textY);\n }\n }\n\n context.restore();\n }\n\n drawSelectedRanges(\n context: CanvasRenderingContext2D,\n state: GridRenderState,\n viewport: {\n left?: VisibleIndex;\n top?: VisibleIndex;\n right?: VisibleIndex;\n bottom?: VisibleIndex;\n minX?: Coordinate;\n minY?: Coordinate;\n maxX?: Coordinate;\n maxY?: Coordinate;\n } = {}\n ): void {\n const {\n cursorColumn: column,\n cursorRow: row,\n draggingRow,\n draggingColumn,\n editingCell,\n metrics,\n model,\n selectedRanges,\n theme,\n } = state;\n const {\n visibleColumnWidths,\n visibleColumnXs,\n visibleRowHeights,\n visibleRowYs,\n width,\n height,\n } = metrics;\n const {\n left = metrics.left,\n top = metrics.top,\n right = metrics.right,\n bottom = metrics.bottom,\n minY = -10,\n maxY = height + 10,\n minX = -10,\n maxX = width + 10,\n } = viewport;\n if (selectedRanges.length === 0) {\n return;\n }\n\n const isCursorVisible =\n isEditableGridModel(model) &&\n model.isEditable &&\n editingCell == null &&\n draggingRow == null &&\n draggingColumn == null &&\n column != null &&\n row != null &&\n visibleColumnXs.has(column) &&\n visibleRowYs.has(row);\n if (isCursorVisible) {\n // Punch a hole out where the active cell is, it gets styled differently.\n const x = getOrThrow(visibleColumnXs, column);\n const y = getOrThrow(visibleRowYs, row);\n const w = getOrThrow(visibleColumnWidths, column);\n const h = getOrThrow(visibleRowHeights, row);\n\n context.save();\n\n context.beginPath();\n\n context.rect(0, 0, width, height);\n context.rect(x, y, w, h);\n\n context.clip('evenodd');\n }\n\n // Draw selection ranges\n context.beginPath();\n for (let i = 0; i < selectedRanges.length; i += 1) {\n const selectedRange = selectedRanges[i];\n const startColumn =\n selectedRange.startColumn !== null ? selectedRange.startColumn : left;\n const startRow =\n selectedRange.startRow !== null ? selectedRange.startRow : top;\n const endColumn =\n selectedRange.endColumn !== null ? selectedRange.endColumn : right;\n const endRow =\n selectedRange.endRow !== null ? selectedRange.endRow : bottom;\n if (\n endRow >= top &&\n bottom >= startRow &&\n endColumn >= left &&\n right >= startColumn\n ) {\n // Need to offset the x/y coordinates so that the line draws nice and crisp\n const x =\n startColumn >= left && visibleColumnXs.has(startColumn)\n ? Math.round(getOrThrow(visibleColumnXs, startColumn)) + 0.5\n : minX;\n const y =\n startRow >= top && visibleRowYs.has(startRow)\n ? Math.max(\n Math.round(getOrThrow(visibleRowYs, startRow)) + 0.5,\n 0.5\n )\n : minY;\n\n const endX =\n endColumn <= right && visibleColumnXs.has(endColumn)\n ? Math.round(\n getOrThrow(visibleColumnXs, endColumn) +\n getOrThrow(visibleColumnWidths, endColumn)\n ) - 0.5\n : maxX;\n const endY =\n endRow <= bottom && visibleRowYs.has(endRow)\n ? Math.round(\n getOrThrow(visibleRowYs, endRow) +\n getOrThrow(visibleRowHeights, endRow)\n ) - 0.5\n : maxY;\n\n context.rect(x, y, endX - x, endY - y);\n }\n\n // draw the inner transparent fill\n context.fillStyle = theme.selectionColor;\n context.fill();\n\n /**\n * draw an \"inner stroke\" that's clipped to just inside of the rects\n * to act as a casing to the outer stroke. 3px width because 1px is outside\n * the rect (but clipped), 1px is \"on\" the rect (technically this pixel is\n * a half pixel clip as well due to rects offset, but we are immediately painting\n * over it), and then the 1px inside (which is the desired pixel).\n */\n context.save();\n context.clip();\n context.strokeStyle = theme.selectionOutlineCasingColor;\n context.lineWidth = 3;\n context.stroke();\n context.restore();\n\n // draw the outerstroke border on top of the inner stroke\n context.strokeStyle = theme.selectionOutlineColor;\n context.lineWidth = 1;\n context.stroke();\n }\n\n if (isCursorVisible && column != null && row != null) {\n context.restore();\n\n this.drawActiveCell(context, state, column, row);\n }\n }\n\n drawActiveCell(\n context: CanvasRenderingContext2D,\n state: GridRenderState,\n column: VisibleIndex,\n row: VisibleIndex,\n borderWidth = GridRenderer.ACTIVE_CELL_BORDER_WIDTH\n ): void {\n const { metrics, theme } = state;\n const {\n visibleColumnWidths,\n visibleColumnXs,\n visibleRowHeights,\n visibleRowYs,\n } = metrics;\n const cellX = getOrThrow(visibleColumnXs, column);\n const cellY = getOrThrow(visibleRowYs, row);\n const cellW = getOrThrow(visibleColumnWidths, column);\n const cellH = getOrThrow(visibleRowHeights, row);\n\n // Now get the outline for the active cell\n let x = cellX - borderWidth * 0.5;\n let y = cellY - borderWidth * 0.5;\n let w = cellW + borderWidth;\n let h = cellH + borderWidth;\n\n // Make sure the outline is interior on the edge\n if (x <= 0) {\n w += x - 1;\n x = 1;\n }\n if (y <= 0) {\n h += y - 1;\n y = 1;\n }\n\n const { lineWidth } = context;\n context.beginPath();\n context.lineWidth = borderWidth;\n context.strokeStyle = theme.selectionOutlineColor;\n this.drawRoundedRect(context, x, y, w, h);\n context.stroke();\n context.lineWidth = lineWidth;\n }\n\n /**\n * Draws a rounded rectangle using the current state of the canvas.\n *\n * @param context The canvas context\n * @param x coordinate of the left side\n * @param y coordinate of the top side\n * @param w width of the rectangle\n * @param h height of the rectangle\n * @param r corner radius of the rectangle\n */\n drawRoundedRect(\n context: CanvasRenderingContext2D,\n x: Coordinate,\n y: Coordinate,\n w: number,\n h: number,\n r = GridRenderer.DEFAULT_EDGE_RADIUS\n ): void {\n context.beginPath();\n context.moveTo(x + r, y);\n context.lineTo(x + w - r, y);\n context.quadraticCurveTo(x + w, y, x + w, y + r);\n context.lineTo(x + w, y + h - r);\n context.quadraticCurveTo(x + w, y + h, x + w - r, y + h);\n context.lineTo(x + r, y + h);\n context.quadraticCurveTo(x, y + h, x, y + h - r);\n context.lineTo(x, y + r);\n context.quadraticCurveTo(x, y, x + r, y);\n context.closePath();\n }\n\n drawDraggingColumn(\n context: CanvasRenderingContext2D,\n state: GridRenderState\n ): void {\n const { draggingColumn, metrics, mouseX, theme, model } = state;\n if (draggingColumn == null || mouseX == null) {\n return;\n }\n\n const {\n range: draggingColumnVisibleRange,\n depth: draggingColumnDepth,\n } = draggingColumn;\n\n const {\n gridX,\n gridY,\n visibleColumnXs,\n visibleColumnWidths,\n height,\n width,\n columnHeaderMaxDepth,\n columnHeaderHeight,\n movedColumns,\n modelColumns,\n floatingLeftWidth,\n } = metrics;\n\n const draggingModelIndex =\n modelColumns.get(draggingColumnVisibleRange[0]) ??\n GridUtils.getModelIndex(draggingColumnVisibleRange[0], movedColumns);\n\n const draggingGroup = model.getColumnHeaderGroup(\n draggingModelIndex,\n draggingColumnDepth\n );\n\n if (draggingColumnDepth > 0 && !draggingGroup) {\n return;\n }\n\n const [startIndex, endIndex] = draggingColumnVisibleRange;\n\n const originalLeft = getOrThrow(visibleColumnXs, startIndex);\n const originalRight =\n getOrThrow(visibleColumnXs, endIndex) +\n getOrThrow(visibleColumnWidths, endIndex);\n const originalWidth = originalRight - originalLeft;\n\n const draggingLeft = draggingColumn.left;\n\n const {\n backgroundColor,\n font,\n headerFont,\n reorderOffset,\n shadowBlur,\n shadowColor,\n } = theme;\n\n const columnHeaderOffset =\n (columnHeaderMaxDepth - draggingColumnDepth - 1) * columnHeaderHeight;\n\n context.save();\n\n context.translate(gridX, 0);\n\n context.save();\n context.beginPath();\n\n // Don't draw over frozen columns\n context.rect(floatingLeftWidth, 0, width, height);\n context.clip();\n\n // First, we need to draw over where the column is coming from\n context.fillStyle = backgroundColor;\n context.fillRect(originalLeft, columnHeaderOffset, originalWidth, height);\n context.restore();\n\n // Then draw the shadow of the moving column\n context.translate(0, reorderOffset);\n\n context.save();\n context.shadowColor = shadowColor;\n context.shadowBlur = shadowBlur;\n\n context.fillStyle = backgroundColor;\n context.fillRect(\n draggingColumn.left,\n columnHeaderOffset + reorderOffset,\n draggingColumn.width,\n height\n );\n context.restore(); // Reset style\n\n // Now set the clipping region and pretty much just redraw this column and all it's contents\n context.beginPath();\n context.rect(\n draggingColumn.left,\n columnHeaderOffset,\n draggingColumn.width + 1,\n height\n );\n context.clip();\n\n context.translate(draggingLeft - originalLeft, 0);\n context.font = headerFont;\n\n const visibleColumns: VisibleIndex[] = [];\n for (\n let i = draggingColumn.range[0];\n i <= draggingColumn.range[1];\n i += 1\n ) {\n visibleColumns.push(i);\n }\n\n /**\n * This will not draw the header text properly, but extensions of Grid\n * may draw extra things in the header like sorts and filters\n */\n this.drawColumnHeaders(context, state);\n\n // Ensure the column header gets drawn\n this.drawColumnHeadersForRange(\n context,\n state,\n [visibleColumns[0], visibleColumns[visibleColumns.length - 1]],\n {\n minX: originalLeft,\n maxX: width,\n }\n );\n\n context.translate(0, gridY);\n context.font = font;\n\n this.drawGridBackground(context, state);\n\n for (let i = startIndex; i <= endIndex; i += 1) {\n this.drawColumnCellContents(context, state, i);\n }\n\n context.restore();\n }\n\n drawDraggingRow(\n context: CanvasRenderingContext2D,\n state: GridRenderState\n ): void {\n const { draggingRow, draggingRowOffset, metrics, mouseY, theme } = state;\n if (draggingRow == null || mouseY == null) {\n return;\n }\n\n const { gridX, gridY, visibleRowYs, visibleRowHeights, width } = metrics;\n const y = getOrThrow(visibleRowYs, draggingRow);\n const rowHeight = getOrThrow(visibleRowHeights, draggingRow) + 1;\n const {\n backgroundColor,\n font,\n headerFont,\n reorderOffset,\n shadowBlur,\n shadowColor,\n } = theme;\n\n context.save();\n\n context.translate(0, gridY);\n\n // First, we need to draw over the row stripes where the row is coming from\n context.fillStyle = backgroundColor;\n context.fillRect(0, y, width, rowHeight);\n\n context.translate(\n gridX + reorderOffset,\n mouseY - y - gridY - (draggingRowOffset ?? 0)\n );\n\n // Then draw the shadow of the moving row\n context.save();\n\n context.shadowColor = shadowColor;\n context.shadowBlur = shadowBlur;\n\n context.fillStyle = backgroundColor;\n context.fillRect(-gridX, y, width, rowHeight);\n\n context.restore();\n\n // Now set the clipping region and pretty much just redraw this row and all it's contents\n context.beginPath();\n context.rect(-gridX, y, width, rowHeight);\n context.clip();\n\n context.font = font;\n\n this.drawGridBackground(context, state);\n\n this.drawCellContents(context, state);\n\n // Now translate it back up and draw the header\n context.translate(-gridX, -gridY);\n\n context.font = headerFont;\n\n this.drawRowHeaders(context, state);\n\n context.restore();\n }\n\n drawScrollBars(\n context: CanvasRenderingContext2D,\n state: GridRenderState\n ): void {\n const {\n isDraggingHorizontalScrollBar,\n isDraggingVerticalScrollBar,\n isDragging,\n metrics,\n mouseX,\n mouseY,\n theme,\n } = state;\n if (theme.scrollBarSize <= 0) {\n return;\n }\n\n const {\n rowHeaderWidth,\n columnHeaderHeight,\n width,\n height,\n handleHeight,\n handleWidth,\n scrollX,\n scrollY,\n hasHorizontalBar,\n hasVerticalBar,\n barWidth,\n barHeight,\n } = metrics;\n const {\n scrollBarBackgroundColor,\n scrollBarHoverBackgroundColor,\n scrollBarCasingColor,\n scrollBarCornerColor,\n scrollBarColor,\n scrollBarHoverColor,\n scrollBarActiveColor,\n scrollBarSize,\n scrollBarHoverSize,\n scrollBarCasingWidth,\n scrollBarSelectionTick,\n scrollBarSelectionTickColor,\n scrollBarActiveSelectionTickColor,\n autoSelectRow,\n autoSelectColumn,\n } = theme;\n\n const isInbounds =\n mouseX != null && mouseY != null && mouseX <= width && mouseY <= height;\n\n const isVerticalBarHover =\n isDraggingVerticalScrollBar ||\n (hasVerticalBar &&\n !isDraggingHorizontalScrollBar &&\n !isDragging &&\n mouseX != null &&\n mouseY != null &&\n mouseX >= width - scrollBarHoverSize &&\n mouseY <= barHeight + columnHeaderHeight &&\n isInbounds);\n\n const isHorizontalBarHover =\n isDraggingHorizontalScrollBar ||\n (hasHorizontalBar &&\n !isDraggingVerticalScrollBar &&\n !isDragging &&\n !isVerticalBarHover && // vert bar gets priorty in overlapped corner hover area\n mouseX != null &&\n mouseY != null &&\n mouseY >= height - scrollBarHoverSize &&\n mouseX <= barWidth - rowHeaderWidth &&\n isInbounds);\n\n const hScrollBarSize = isHorizontalBarHover\n ? scrollBarHoverSize\n : scrollBarSize;\n const vScrollBarSize = isVerticalBarHover\n ? scrollBarHoverSize\n : scrollBarSize;\n\n context.translate(rowHeaderWidth, columnHeaderHeight);\n\n if (hasHorizontalBar && hasVerticalBar) {\n // That little corner in the bottom right\n context.fillStyle = scrollBarCasingColor;\n context.fillRect(\n width - rowHeaderWidth - scrollBarSize,\n height - columnHeaderHeight - scrollBarSize,\n scrollBarSize,\n scrollBarSize\n );\n context.fillStyle = scrollBarCornerColor;\n context.fillRect(\n width - rowHeaderWidth - scrollBarSize + scrollBarCasingWidth,\n height - columnHeaderHeight - scrollBarSize + scrollBarCasingWidth,\n scrollBarSize - scrollBarCasingWidth,\n scrollBarSize - scrollBarCasingWidth\n );\n }\n\n if (hasHorizontalBar) {\n const x = scrollX;\n const y = height - columnHeaderHeight - hScrollBarSize;\n\n // scrollbar casing\n context.fillStyle = scrollBarCasingColor;\n context.fillRect(0, y, barWidth, hScrollBarSize - scrollBarCasingWidth);\n\n // scrollbar track\n context.fillStyle = isHorizontalBarHover\n ? scrollBarHoverBackgroundColor\n : scrollBarBackgroundColor;\n context.fillRect(\n 0,\n y + scrollBarCasingWidth,\n barWidth,\n hScrollBarSize - scrollBarCasingWidth\n );\n\n // scrollbar thumb\n if (isDraggingHorizontalScrollBar) {\n context.fillStyle = scrollBarActiveColor;\n } else if (isHorizontalBarHover) {\n context.fillStyle = scrollBarHoverColor;\n } else {\n context.fillStyle = scrollBarColor;\n }\n\n context.fillRect(\n x,\n y + scrollBarCasingWidth,\n handleWidth,\n hScrollBarSize - scrollBarCasingWidth\n );\n\n if (\n !autoSelectRow &&\n scrollBarSelectionTick &&\n scrollBarSelectionTickColor != null &&\n scrollBarActiveSelectionTickColor != null\n ) {\n context.fillStyle = scrollBarSelectionTickColor;\n // Scrollbar Selection Tick\n const { selectedRanges, cursorColumn } = state;\n const { lastLeft, columnCount } = metrics;\n\n const filteredRanges = [...selectedRanges].filter(\n value => value.startColumn != null && value.endColumn != null\n ) as NoneNullColumnRange[];\n\n const sortedRanges = filteredRanges\n .map(\n (value): BoundedAxisRange => [value.startColumn, value.endColumn]\n )\n .sort(GridUtils.compareRanges);\n\n const mergedRanges = GridUtils.mergeSortedRanges(sortedRanges);\n\n const getTickX = (index: number): number => {\n if (index <= lastLeft) {\n return (index / lastLeft) * (barWidth - handleWidth);\n }\n return (\n barWidth -\n handleWidth +\n ((index - lastLeft) / (columnCount - lastLeft)) * handleWidth\n );\n };\n for (let i = 0; i < mergedRanges.length; i += 1) {\n const range = mergedRanges[i];\n const startColumn = range[0];\n const endColumn = range[1];\n\n if (\n startColumn != null &&\n endColumn != null &&\n (startColumn !== cursorColumn || endColumn !== cursorColumn)\n ) {\n const tickX = getTickX(startColumn);\n const tickWidth = Math.max(\n 1,\n Math.round(getTickX(endColumn + 1) - tickX)\n );\n const trackHeight = hScrollBarSize - scrollBarCasingWidth;\n context.fillRect(\n tickX,\n y + scrollBarCasingWidth + Math.round(trackHeight / 3),\n tickWidth,\n Math.round(trackHeight / 3)\n );\n }\n }\n\n // Current Active Tick\n if (cursorColumn != null) {\n const tickX = getTickX(cursorColumn);\n const tickWidth = 2;\n const trackHeight = hScrollBarSize - scrollBarCasingWidth;\n context.fillStyle = scrollBarActiveSelectionTickColor;\n context.fillRect(\n tickX,\n y + scrollBarCasingWidth,\n tickWidth,\n trackHeight\n );\n }\n }\n }\n\n if (hasVerticalBar) {\n const x = width - rowHeaderWidth - vScrollBarSize;\n const y = scrollY;\n\n // scrollbar casing\n context.fillStyle = scrollBarCasingColor;\n context.fillRect(x, 0, vScrollBarSize - scrollBarCasingWidth, barHeight);\n\n // scrollbar track\n context.fillStyle = isVerticalBarHover\n ? scrollBarHoverBackgroundColor\n : scrollBarBackgroundColor;\n context.fillRect(\n x + scrollBarCasingWidth,\n 0,\n vScrollBarSize - scrollBarCasingWidth,\n barHeight\n );\n\n // scrollbar thumb\n if (isDraggingVerticalScrollBar) {\n context.fillStyle = scrollBarActiveColor;\n } else if (isVerticalBarHover) {\n context.fillStyle = scrollBarHoverColor;\n } else {\n context.fillStyle = scrollBarColor;\n }\n\n context.fillRect(\n x + scrollBarCasingWidth,\n y,\n vScrollBarSize - scrollBarCasingWidth,\n handleHeight\n );\n\n if (\n !autoSelectColumn &&\n scrollBarSelectionTick &&\n scrollBarSelectionTickColor != null &&\n scrollBarActiveSelectionTickColor != null\n ) {\n // Scrollbar Selection Tick\n const { selectedRanges, cursorRow } = state;\n const { lastTop, rowCount } = metrics;\n\n const getTickY = (index: number): number => {\n if (index <= lastTop) {\n return (index / lastTop) * (barHeight - handleHeight);\n }\n return (\n barHeight -\n handleHeight +\n ((index - lastTop) / (rowCount - lastTop)) * handleHeight\n );\n };\n\n context.fillStyle = scrollBarSelectionTickColor;\n\n const filteredRanges = [...selectedRanges].filter(\n value => value.startRow != null && value.endRow != null\n ) as NoneNullRowRange[];\n\n const sortedRanges = filteredRanges\n .map((value): BoundedAxisRange => [value.startRow, value.endRow])\n .sort(GridUtils.compareRanges);\n\n const mergedRanges = GridUtils.mergeSortedRanges(sortedRanges);\n\n for (let i = 0; i < mergedRanges.length; i += 1) {\n const range = mergedRanges[i];\n const startRow = range[0];\n const endRow = range[1];\n if (\n startRow != null &&\n endRow != null &&\n (startRow !== cursorRow || endRow !== cursorRow)\n ) {\n const tickY = getTickY(startRow);\n const trackWidth = vScrollBarSize - scrollBarCasingWidth;\n const tickHeight = Math.max(\n 1,\n Math.round(getTickY(endRow + 1) - tickY)\n );\n context.fillRect(\n x + scrollBarCasingWidth + Math.round(trackWidth / 3),\n tickY,\n Math.round(trackWidth / 3),\n tickHeight\n );\n }\n }\n\n // Current Active Tick\n if (cursorRow != null) {\n const tickY = Math.round(getTickY(cursorRow));\n\n const trackWidth = vScrollBarSize - scrollBarCasingWidth;\n const tickHeight = 2;\n\n context.fillStyle = scrollBarActiveSelectionTickColor;\n context.fillRect(\n x + scrollBarCasingWidth,\n tickY,\n trackWidth,\n tickHeight\n );\n }\n }\n }\n\n context.translate(-rowHeaderWidth, -columnHeaderHeight);\n }\n}\n\nexport default GridRenderer;\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@deephaven/grid",
3
- "version": "0.15.5-vite.12+52a2dd9",
3
+ "version": "0.15.6-vite.21+822fd63",
4
4
  "description": "Deephaven React grid component",
5
5
  "author": "Deephaven Data Labs LLC",
6
6
  "license": "Apache-2.0",
@@ -33,7 +33,7 @@
33
33
  "react": "^17.0.0"
34
34
  },
35
35
  "devDependencies": {
36
- "@deephaven/tsconfig": "^0.15.5-vite.12+52a2dd9"
36
+ "@deephaven/tsconfig": "^0.15.6-vite.21+822fd63"
37
37
  },
38
38
  "files": [
39
39
  "dist"
@@ -50,5 +50,5 @@
50
50
  "publishConfig": {
51
51
  "access": "public"
52
52
  },
53
- "gitHead": "52a2dd9b2d7e16dec8c678e270e78d6d2db6a7e5"
53
+ "gitHead": "822fd633ddb5c62b896547cf90b1cad01799a346"
54
54
  }