@deephaven/grid 0.13.13 → 0.13.14-input-table-paste-jackson.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/Grid.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Grid.d.ts","sourceRoot":"","sources":["../src/Grid.tsx"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"Grid.d.ts","sourceRoot":"","sources":["../src/Grid.tsx"],"names":[],"mappings":"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"}
|
package/dist/Grid.js
CHANGED
|
@@ -1210,6 +1210,7 @@ class Grid extends PureComponent {
|
|
|
1210
1210
|
rowCount
|
|
1211
1211
|
} = model;
|
|
1212
1212
|
var _ranges = selectedRanges; // If each cell is a single selection, we need to update the selection to map to the newly pasted data
|
|
1213
|
+
// Check for
|
|
1213
1214
|
|
|
1214
1215
|
if (_ranges.every(range => {
|
|
1215
1216
|
var _range$startColumn, _range$startRow;
|
|
@@ -1226,10 +1227,6 @@ class Grid extends PureComponent {
|
|
|
1226
1227
|
_this.setSelectedRanges(_ranges);
|
|
1227
1228
|
}
|
|
1228
1229
|
|
|
1229
|
-
if (!_ranges.every(range => GridRange.rowCount([range]) === tableHeight && GridRange.columnCount([range]) === tableWidth)) {
|
|
1230
|
-
throw new PasteError('Copy and paste area are not same size.');
|
|
1231
|
-
}
|
|
1232
|
-
|
|
1233
1230
|
var edits = [];
|
|
1234
1231
|
|
|
1235
1232
|
_ranges.forEach(range => {
|
package/dist/Grid.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/Grid.tsx"],"names":["React","PureComponent","classNames","memoize","clamp","GridMetricCalculator","GridTheme","GridRange","SELECTION_DIRECTION","GridRenderer","GridUtils","GridSelectionMouseHandler","GridColumnMoveMouseHandler","GridColumnSeparatorMouseHandler","GridHorizontalScrollBarMouseHandler","GridRowMoveMouseHandler","GridRowSeparatorMouseHandler","GridRowTreeMouseHandler","GridScrollBarCornerMouseHandler","GridVerticalScrollBarMouseHandler","EditMouseHandler","EditKeyHandler","PasteKeyHandler","SelectionKeyHandler","TreeKeyHandler","CellInputField","PasteError","isExpandableGridModel","assertIsEditableGridModel","isEditableGridModel","assertIsDefined","ThemeContext","Grid","getScale","context","devicePixelRatio","window","legacyContext","backingStorePixelRatio","webkitBackingStorePixelRatio","mozBackingStorePixelRatio","msBackingStorePixelRatio","oBackingStorePixelRatio","getCursorClassName","cursor","constructor","props","keyHandlers","sort","a","b","order","mouseHandlers","handleClick","bind","handleContextMenu","handleEditCellCancel","handleEditCellChange","handleEditCellCommit","handleDoubleClick","handleKeyDown","handleMouseDown","handleMouseDrag","handleMouseMove","handleMouseLeave","handleMouseUp","handleResize","handleWheel","isStuckToBottom","isStuckToRight","metricCalculator","movedColumns","movedRows","renderer","canvas","canvasContext","animationFrame","prevMetrics","metrics","documentCursor","dragTimer","state","top","left","topOffset","leftOffset","draggingColumn","draggingRow","draggingColumnOffset","draggingRowOffset","draggingColumnSeparator","draggingRowSeparator","isDraggingHorizontalScrollBar","isDraggingVerticalScrollBar","isDragging","mouseX","mouseY","cursorRow","cursorColumn","selectionStartRow","selectionStartColumn","selectionEndRow","selectionEndColumn","selectedRanges","lastSelectedRanges","editingCell","componentDidMount","initContext","addEventListener","passive","updateCanvasScale","updateCanvas","componentDidUpdate","prevProps","prevState","isStickyBottom","isStickyRight","onMovedColumnsChanged","onMoveColumnComplete","onMovedRowsChanged","onMoveRowComplete","prevIsStickyBottom","prevIsStickyRight","prevPropMovedColumns","prevPropMovedRows","prevStateMovedColumns","prevStateMovedRows","currentStateMovedColumns","currentStateMovedRows","setState","updateMetrics","requestUpdateCanvas","bottomVisible","rightVisible","rowCount","columnCount","height","width","prevRowCount","prevColumnCount","prevHeight","prevWidth","metricState","getMetricState","lastTop","getLastTop","lastLeft","getLastLeft","validateSelection","checkSelectionChange","componentWillUnmount","cancelAnimationFrame","removeEventListener","stopDragTimer","getTheme","theme","getGridPointFromEvent","event","rect","getBoundingClientRect","x","clientX","y","clientY","getGridPointFromXY","Error","model","stateOverride","clientWidth","clientHeight","getKeyHandlers","getCachedKeyHandlers","getMouseHandlers","getCachedMouseHandlers","getModelColumn","columnIndex","modelIndex","modelColumns","get","undefined","getModelRow","rowIndex","modelRows","toggleRowExpanded","row","modelRow","isRowExpandable","setRowExpanded","isRowExpanded","clearSelectedRanges","commitSelection","moveCursorToPosition","setSelectedRanges","gridRanges","length","range","boundedRange","newCursorRow","newCursorColumn","containsCell","column","startCell","startColumn","startRow","endColumn","endRow","canvasOptions","getContext","requestAnimationFrame","onViewChanged","drawCanvas","parentElement","scale","Math","floor","style","getMetrics","oldSelectedRanges","onSelectionChanged","i","trimSelectedRanges","slice","beginSelection","moveSelection","extendSelection","maximizePreviousRange","autoSelectRow","autoSelectColumn","lastSelectedRange","right","bottom","min","max","selectedRange","makeNormalized","equals","newRanges","selectedColumn","selectedRow","push","cellCount","rangeArraysEqual","newSelectedRanges","lastRange","contains","remainder","subtract","pop","splice","concat","consolidate","nextCursor","nextCell","boundedRanges","selectAll","moveCursor","deltaColumn","deltaRow","moveCursorInDirection","direction","DOWN","ranges","makeCell","gridRange","moveViewToCell","keepCursorInView","topVisible","leftVisible","isFloatingRow","getTopForTopVisible","getTopForBottomVisible","isFloatingColumn","getLeftForLeftVisible","getLeftForRightVisible","setViewState","viewState","forceUpdate","startEditing","isQuickEdit","selectionRange","value","modelColumn","cell","editValueForCell","isValidForCell","pasteValue","isEditable","every","isEditableRange","edits","modelRanges","getModelRanges","forEachCell","text","setValues","tableHeight","tableWidth","map","forEach","e","onError","setValueForCell","setValueForRanges","isSelected","rowSelected","columnSelected","addDocumentCursor","document","documentElement","classList","remove","add","removeDocumentCursor","startDragTimer","mouseEvent","MouseEvent","nativeEvent","setTimeout","dragTimeout","clearTimeout","renderState","save","restore","focus","isFocused","activeElement","gridPoint","mouseHandler","onClick","stopPropagation","preventDefault","onContextMenu","keyHandler","result","onDown","options","notifyMouseHandlers","functionName","updateCoordinates","addCursorToDocument","button","defaultPrevented","scrollableContentWidth","scrollableViewportWidth","scrollableContentHeight","scrollableViewportHeight","hasHorizontalBar","hasVerticalBar","deltaX","deltaY","getScrollDelta","barWidth","barHeight","rowHeight","maxLeftOffset","columnWidth","visibleColumnWidths","getVisibleColumnWidth","scrollSnapToColumn","abs","maxTopOffset","visibleRowHeights","getVisibleRowHeight","scrollSnapToRow","fillRange","renderInputField","gridX","gridY","visibleColumnXs","visibleRowYs","w","h","wrapperStyle","position","opacity","inputStyle","textAlign","textAlignForCell","isValid","error","render","alpha","contextTheme","userTheme"],"mappings":"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","sourcesContent":["/* eslint react/no-did-update-set-state: \"off\" */\nimport React, { CSSProperties, PureComponent, ReactNode } from 'react';\nimport classNames from 'classnames';\nimport memoize from 'memoize-one';\nimport clamp from 'lodash.clamp';\nimport GridMetricCalculator, { GridMetricState } from './GridMetricCalculator';\nimport GridModel from './GridModel';\nimport GridMouseHandler, {\n GridMouseEvent,\n GridMouseHandlerFunctionName,\n} from './GridMouseHandler';\nimport GridTheme, { GridTheme as GridThemeType } from './GridTheme';\nimport GridRange, { GridRangeIndex, SELECTION_DIRECTION } from './GridRange';\nimport GridRenderer, {\n EditingCell,\n EditingCellTextSelectionRange,\n} from './GridRenderer';\nimport GridUtils, { GridPoint } from './GridUtils';\nimport {\n GridSelectionMouseHandler,\n GridColumnMoveMouseHandler,\n GridColumnSeparatorMouseHandler,\n GridHorizontalScrollBarMouseHandler,\n GridRowMoveMouseHandler,\n GridRowSeparatorMouseHandler,\n GridRowTreeMouseHandler,\n GridScrollBarCornerMouseHandler,\n GridVerticalScrollBarMouseHandler,\n EditMouseHandler,\n} from './mouse-handlers';\nimport './Grid.scss';\nimport KeyHandler, { GridKeyboardEvent } from './KeyHandler';\nimport {\n EditKeyHandler,\n PasteKeyHandler,\n SelectionKeyHandler,\n TreeKeyHandler,\n} from './key-handlers';\nimport CellInputField from './CellInputField';\nimport PasteError from './errors/PasteError';\nimport GridMetrics, {\n Coordinate,\n ModelIndex,\n MoveOperation,\n VisibleIndex,\n} from './GridMetrics';\nimport { isExpandableGridModel } from './ExpandableGridModel';\nimport {\n assertIsEditableGridModel,\n EditOperation,\n isEditableGridModel,\n} from './EditableGridModel';\nimport { EventHandlerResultOptions } from './EventHandlerResult';\nimport { assertIsDefined } from './errors';\nimport ThemeContext from './ThemeContext';\n\ntype LegacyCanvasRenderingContext2D = CanvasRenderingContext2D & {\n webkitBackingStorePixelRatio?: number;\n mozBackingStorePixelRatio?: number;\n msBackingStorePixelRatio?: number;\n oBackingStorePixelRatio?: number;\n backingStorePixelRatio?: number;\n};\n\nexport type GridProps = typeof Grid.defaultProps & {\n // Options to set on the canvas\n canvasOptions?: CanvasRenderingContext2DSettings;\n\n // Whether the grid should stick to the bottom or the right once scrolled to the end\n // Only matters with ticking grids\n isStickyBottom?: boolean;\n isStickyRight?: boolean;\n\n // Whether the grid is currently stuck to the bottom or the right\n isStuckToBottom?: boolean;\n isStuckToRight?: boolean;\n\n // Calculate all the metrics required for drawing the grid\n metricCalculator?: GridMetricCalculator;\n\n // The model to pull data from\n model: GridModel;\n\n // Optional key and mouse handlers\n keyHandlers?: KeyHandler[];\n mouseHandlers?: GridMouseHandler[];\n\n // Initial state of moved columns or rows\n movedColumns?: MoveOperation[];\n movedRows?: MoveOperation[];\n\n // Callback for if an error occurs\n onError?: (e: Error) => void;\n\n // Callback when the selection within the grid changes\n onSelectionChanged?: (ranges: GridRange[]) => void;\n\n // Callback when the moved columns or rows have changed\n onMovedColumnsChanged?: (movedColumns: MoveOperation[]) => void;\n onMovedRowsChanged?: (movedRows: MoveOperation[]) => void;\n\n // Callback when a move operation is completed\n onMoveColumnComplete?: (movedColumns: MoveOperation[]) => void;\n onMoveRowComplete?: (movedRows: MoveOperation[]) => void;\n\n // Callback when the viewport has scrolled or changed\n onViewChanged?: (metrics: GridMetrics) => void;\n\n // Renderer for the grid canvas\n renderer?: GridRenderer;\n\n // Optional state override to pass in to the metric and render state\n // Can be used to add custom properties as well\n stateOverride?: Record<string, unknown>;\n\n theme?: Partial<GridThemeType>;\n};\n\nexport type GridState = {\n // Top/left visible cell in the grid. Note that it's visible row/column index, not the model index (ie. if columns are re-ordered)\n top: VisibleIndex;\n left: VisibleIndex;\n\n // The scroll offset of the top/left cell. 0,0 means the cell is at the top left\n topOffset: number; // Should be less than the height of the row\n leftOffset: number; // Should be less than the width of the column\n\n // current column/row that user is dragging\n draggingColumn: VisibleIndex | null;\n draggingRow: VisibleIndex | null;\n\n // Offset when dragging a column/row\n draggingColumnOffset: number | null;\n draggingRowOffset: number | null;\n\n // When drawing header separators for resizing\n draggingColumnSeparator: VisibleIndex | null;\n draggingRowSeparator: VisibleIndex | null;\n\n // Dragging a scroll bar status\n isDraggingHorizontalScrollBar: boolean;\n isDraggingVerticalScrollBar: boolean;\n\n // Anything is performing a drag, for blocking hover rendering\n isDragging: boolean;\n\n // The coordinates of the mouse. May be outside of the canvas\n mouseX: number | null;\n mouseY: number | null;\n\n // Move operations the user has performed on this grids columns/rows\n movedColumns: MoveOperation[];\n movedRows: MoveOperation[];\n\n // Cursor (highlighted cell) location and active selected range\n cursorRow: VisibleIndex | null;\n cursorColumn: VisibleIndex | null;\n selectionStartRow: VisibleIndex | null;\n selectionStartColumn: VisibleIndex | null;\n selectionEndRow: VisibleIndex | null;\n selectionEndColumn: VisibleIndex | null;\n\n // Currently selected ranges and previously selected ranges\n // Store the previously selected ranges to determine if the new selection should\n // deselect again (if it's the same range)\n selectedRanges: GridRange[];\n lastSelectedRanges: GridRange[];\n\n // The mouse cursor style to use when hovering over the grid element\n cursor: string | null;\n\n // { column: number, row: number, selectionRange: [number, number], value: string | null, isQuickEdit?: boolean }\n // The cell that is currently being edited\n editingCell: EditingCell | null;\n\n // Whether we're stuck to the bottom or the right\n isStuckToBottom: boolean;\n isStuckToRight: boolean;\n};\n\n/**\n * High performance, extendible, themeable grid component.\n * Architectured to be fast and handle billions of rows/columns by default.\n * The base model does not provide support for sorting, filtering, etc.\n * To get that functionality, extend GridModel/GridRenderer, and add onClick/onContextMenu handlers to implement your own sort.\n *\n * Extend GridModel with your own data model to provide the data for the grid.\n * Extend GridTheme to change the appearance if the grid. See GridTheme for all the settable values.\n * Extend GridMetricCalculator to provide different metrics for the grid, such as column sizing, header sizing, etc.\n * Extend GridRenderer to have complete control over the rendering process. Can override just one method such as drawColumnHeader, or override the whole drawCanvas process.\n *\n * Add an onViewChanged callback to page in/out data as user moves around the grid\n * Can also add onClick and onContextMenu handlers to add custom functionality and menus.\n */\nclass Grid extends PureComponent<GridProps, GridState> {\n static contextType = ThemeContext;\n\n static defaultProps = {\n canvasOptions: { alpha: false } as CanvasRenderingContext2DSettings,\n isStickyBottom: false,\n isStickyRight: false,\n isStuckToBottom: false,\n isStuckToRight: false,\n keyHandlers: [] as KeyHandler[],\n mouseHandlers: [] as GridMouseHandler[],\n movedColumns: [] as MoveOperation[],\n movedRows: [] as MoveOperation[],\n onError: (): void => undefined,\n onSelectionChanged: (): void => undefined,\n onMovedColumnsChanged: (): void => undefined,\n onMoveColumnComplete: (): void => undefined,\n onMovedRowsChanged: (): void => undefined,\n onMoveRowComplete: (): void => undefined,\n onViewChanged: (): void => undefined,\n stateOverride: {} as Record<string, unknown>,\n theme: {\n autoSelectColumn: false,\n autoSelectRow: false,\n } as Partial<GridThemeType>,\n };\n\n // use same constant as chrome source for windows\n // https://github.com/chromium/chromium/blob/973af9d461b6b5dc60208c8d3d66adc27e53da78/ui/events/blink/web_input_event_builders_win.cc#L285\n static pixelsPerLine = 100 / 3;\n\n static dragTimeout = 1000;\n\n static getTheme = memoize((contextTheme, userTheme) => ({\n ...GridTheme,\n ...contextTheme,\n ...userTheme,\n }));\n\n /**\n * On some devices there may be different scaling required for high DPI. Get the scale required for the canvas.\n * @param context The canvas context\n * @returns The scale to use\n */\n static getScale(context: CanvasRenderingContext2D): number {\n const devicePixelRatio = window.devicePixelRatio || 1;\n\n // backingStorePixelRatio is deprecated, but check it just in case\n const legacyContext = context as LegacyCanvasRenderingContext2D;\n const backingStorePixelRatio =\n legacyContext.webkitBackingStorePixelRatio ||\n legacyContext.mozBackingStorePixelRatio ||\n legacyContext.msBackingStorePixelRatio ||\n legacyContext.oBackingStorePixelRatio ||\n legacyContext.backingStorePixelRatio ||\n 1;\n return devicePixelRatio / backingStorePixelRatio;\n }\n\n /**\n * Get the class name from the cursor provided\n * @param cursor The grid cursor to use\n * @returns Class name with the grid-cursor prefix or null if no cursor provided\n */\n static getCursorClassName(cursor: string | null): string | null {\n return cursor ? `grid-cursor-${cursor}` : null;\n }\n\n // Need to disable react/sort-comp so I can put the fields here\n /* eslint-disable react/sort-comp */\n renderer: GridRenderer;\n\n metricCalculator: GridMetricCalculator;\n\n canvas: HTMLCanvasElement | null;\n\n canvasContext: CanvasRenderingContext2D | null;\n\n // We draw the canvas on the next animation frame, keep track of the next one\n animationFrame: number | null;\n\n // Keep track of previous metrics and new metrics for comparison\n prevMetrics: GridMetrics | null;\n\n metrics: GridMetrics | null;\n\n // Track the cursor that is currently added to the document\n // Add to document so that when dragging the cursor stays, even if mouse leaves the canvas\n // Note: on document, not body so that cursor styling can be combined with\n // blocked pointer events that would otherwise prevent cursor styling from showing\n documentCursor: string | null;\n\n dragTimer: ReturnType<typeof setTimeout> | null;\n\n keyHandlers: KeyHandler[];\n\n mouseHandlers: GridMouseHandler[];\n\n /* eslint-enable react/sort-comp */\n\n constructor(props: GridProps) {\n super(props);\n\n this.handleClick = this.handleClick.bind(this);\n this.handleContextMenu = this.handleContextMenu.bind(this);\n this.handleEditCellCancel = this.handleEditCellCancel.bind(this);\n this.handleEditCellChange = this.handleEditCellChange.bind(this);\n this.handleEditCellCommit = this.handleEditCellCommit.bind(this);\n this.handleDoubleClick = this.handleDoubleClick.bind(this);\n this.handleKeyDown = this.handleKeyDown.bind(this);\n this.handleMouseDown = this.handleMouseDown.bind(this);\n this.handleMouseDrag = this.handleMouseDrag.bind(this);\n this.handleMouseMove = this.handleMouseMove.bind(this);\n this.handleMouseLeave = this.handleMouseLeave.bind(this);\n this.handleMouseUp = this.handleMouseUp.bind(this);\n this.handleResize = this.handleResize.bind(this);\n this.handleWheel = this.handleWheel.bind(this);\n\n const {\n isStuckToBottom,\n isStuckToRight,\n metricCalculator,\n movedColumns,\n movedRows,\n renderer,\n } = props;\n\n this.renderer = renderer || new GridRenderer();\n this.metricCalculator = metricCalculator || new GridMetricCalculator();\n\n this.canvas = null;\n this.canvasContext = null;\n this.animationFrame = null;\n\n this.prevMetrics = null;\n this.metrics = null;\n\n // Track the cursor that is currently added to the document\n // Add to document so that when dragging the cursor stays, even if mouse leaves the canvas\n // Note: on document, not body so that cursor styling can be combined with\n // blocked pointer events that would otherwise prevent cursor styling from showing\n this.documentCursor = null;\n\n this.dragTimer = null;\n\n // specify handler ordering, such that any extensions can insert handlers in between\n this.keyHandlers = [\n new EditKeyHandler(400),\n new PasteKeyHandler(450),\n new SelectionKeyHandler(500),\n new TreeKeyHandler(900),\n ];\n this.mouseHandlers = [\n new GridRowSeparatorMouseHandler(100),\n new GridColumnSeparatorMouseHandler(200),\n new GridRowMoveMouseHandler(300),\n new GridColumnMoveMouseHandler(400),\n new EditMouseHandler(450),\n new GridVerticalScrollBarMouseHandler(500),\n new GridHorizontalScrollBarMouseHandler(600),\n new GridScrollBarCornerMouseHandler(700),\n new GridRowTreeMouseHandler(800),\n new GridSelectionMouseHandler(900),\n ];\n\n this.state = {\n // Top/left visible cell in the grid. Note that it's visible row/column index, not the model index (ie. if columns are re-ordered)\n top: 0,\n left: 0,\n\n // The scroll offset of the top/left cell. 0,0 means the cell is at the top left\n // Should be less than the width of the column\n topOffset: 0,\n leftOffset: 0,\n\n // current column/row that user is dragging\n draggingColumn: null,\n draggingRow: null,\n\n // Offset when dragging a column/row\n draggingColumnOffset: null,\n draggingRowOffset: null,\n\n // When drawing header separators for resizing\n draggingColumnSeparator: null,\n draggingRowSeparator: null,\n\n isDraggingHorizontalScrollBar: false,\n isDraggingVerticalScrollBar: false,\n\n // Anything is performing a drag, for blocking hover rendering\n isDragging: false,\n\n // The coordinates of the mouse. May be outside of the canvas\n mouseX: null,\n mouseY: null,\n\n // Move operations the user has performed on this grids columns/rows\n movedColumns,\n movedRows,\n\n // Cursor (highlighted cell) location and active selected range\n cursorRow: null,\n cursorColumn: null,\n selectionStartRow: null,\n selectionStartColumn: null,\n selectionEndRow: null,\n selectionEndColumn: null,\n\n // Currently selected ranges and previously selected ranges\n // Store the previously selected ranges to determine if the new selection should\n // deselect again (if it's the same range)\n selectedRanges: [],\n lastSelectedRanges: [],\n\n // The mouse cursor style to use when hovering over the grid element\n cursor: null,\n\n // { column: number, row: number, selectionRange: [number, number], value: string | null, isQuickEdit?: boolean }\n // The cell that is currently being edited\n editingCell: null,\n\n isStuckToBottom,\n isStuckToRight,\n };\n }\n\n componentDidMount(): void {\n this.initContext();\n\n // Need to explicitly add wheel event to canvas so we can preventDefault/avoid passive listener issue\n // Otherwise React attaches listener at doc level and you can't prevent default\n // https://github.com/facebook/react/issues/14856\n this.canvas?.addEventListener('wheel', this.handleWheel, {\n passive: false,\n });\n window.addEventListener('resize', this.handleResize);\n\n this.updateCanvasScale();\n this.updateCanvas();\n }\n\n componentDidUpdate(prevProps: GridProps, prevState: GridState): void {\n const {\n isStickyBottom,\n isStickyRight,\n movedColumns,\n movedRows,\n onMovedColumnsChanged,\n onMoveColumnComplete,\n onMovedRowsChanged,\n onMoveRowComplete,\n } = this.props;\n const {\n isStickyBottom: prevIsStickyBottom,\n isStickyRight: prevIsStickyRight,\n movedColumns: prevPropMovedColumns,\n movedRows: prevPropMovedRows,\n } = prevProps;\n const {\n movedColumns: prevStateMovedColumns,\n movedRows: prevStateMovedRows,\n } = prevState;\n const {\n draggingColumn,\n draggingRow,\n movedColumns: currentStateMovedColumns,\n movedRows: currentStateMovedRows,\n } = this.state;\n\n if (prevPropMovedColumns !== movedColumns) {\n this.setState({ movedColumns });\n }\n\n if (prevPropMovedRows !== movedRows) {\n this.setState({ movedRows });\n }\n\n if (prevStateMovedColumns !== currentStateMovedColumns) {\n onMovedColumnsChanged(currentStateMovedColumns);\n }\n\n if (prevState.draggingColumn != null && draggingColumn == null) {\n onMoveColumnComplete(currentStateMovedColumns);\n }\n\n if (prevStateMovedRows !== currentStateMovedRows) {\n onMovedRowsChanged(currentStateMovedRows);\n }\n\n if (prevState.draggingRow != null && draggingRow == null) {\n onMoveRowComplete(currentStateMovedRows);\n }\n\n if (isStickyBottom !== prevIsStickyBottom) {\n this.setState({ isStuckToBottom: false });\n }\n\n if (isStickyRight !== prevIsStickyRight) {\n this.setState({ isStuckToRight: false });\n }\n\n this.updateMetrics();\n\n this.requestUpdateCanvas();\n\n if (!this.metrics || !this.prevMetrics) {\n return;\n }\n\n const {\n bottomVisible,\n rightVisible,\n rowCount,\n columnCount,\n top,\n left,\n height,\n width,\n } = this.metrics;\n const {\n rowCount: prevRowCount,\n columnCount: prevColumnCount,\n height: prevHeight,\n width: prevWidth,\n } = this.prevMetrics;\n const metricState = this.getMetricState();\n\n if (prevRowCount !== rowCount || height !== prevHeight) {\n const lastTop = this.metricCalculator.getLastTop(metricState);\n const { isStuckToBottom } = this.state;\n if (\n (isStuckToBottom &&\n bottomVisible < rowCount - 1 &&\n bottomVisible > 0) ||\n top > lastTop\n ) {\n this.setState({ top: lastTop });\n }\n }\n\n if (prevColumnCount !== columnCount || width !== prevWidth) {\n const lastLeft = this.metricCalculator.getLastLeft(metricState);\n const { isStuckToRight } = this.state;\n if (\n (isStuckToRight &&\n rightVisible < columnCount - 1 &&\n rightVisible > 0) ||\n left > lastLeft\n ) {\n this.setState({ left: lastLeft });\n }\n }\n\n if (this.validateSelection()) {\n this.checkSelectionChange(prevState);\n }\n }\n\n componentWillUnmount(): void {\n if (this.animationFrame != null) {\n cancelAnimationFrame(this.animationFrame);\n }\n\n this.canvas?.removeEventListener('wheel', this.handleWheel);\n\n window.removeEventListener(\n 'mousemove',\n (this.handleMouseDrag as unknown) as EventListenerOrEventListenerObject,\n true\n );\n window.removeEventListener(\n 'mouseup',\n (this.handleMouseUp as unknown) as EventListenerOrEventListenerObject,\n true\n );\n window.removeEventListener('resize', this.handleResize);\n\n this.stopDragTimer();\n }\n\n getTheme(): GridThemeType {\n const { theme } = this.props;\n return Grid.getTheme(this.context, theme);\n }\n\n getGridPointFromEvent(event: GridMouseEvent): GridPoint {\n assertIsDefined(this.canvas);\n\n const rect = this.canvas.getBoundingClientRect();\n const x = event.clientX - rect.left;\n const y = event.clientY - rect.top;\n return this.getGridPointFromXY(x, y);\n }\n\n getGridPointFromXY(x: Coordinate, y: Coordinate): GridPoint {\n if (!this.metrics) throw new Error('metrics must be set');\n\n return GridUtils.getGridPointFromXY(x, y, this.metrics);\n }\n\n getMetricState(state = this.state): GridMetricState {\n const theme = this.getTheme();\n const { model, stateOverride } = this.props;\n if (!this.canvasContext || !this.canvas) {\n throw new Error('Canvas and context must be defined to get metrics');\n }\n const context = this.canvasContext;\n const width = this.canvas.clientWidth;\n const height = this.canvas.clientHeight;\n const {\n left,\n top,\n leftOffset,\n topOffset,\n movedColumns,\n movedRows,\n isDraggingHorizontalScrollBar,\n isDraggingVerticalScrollBar,\n } = state;\n\n return {\n left,\n top,\n leftOffset,\n topOffset,\n width,\n height,\n context,\n theme,\n model,\n movedColumns,\n movedRows,\n isDraggingHorizontalScrollBar,\n isDraggingVerticalScrollBar,\n ...stateOverride,\n };\n }\n\n getCachedKeyHandlers = memoize((keyHandlers: KeyHandler[]) =>\n [...keyHandlers, ...this.keyHandlers].sort((a, b) => a.order - b.order)\n );\n\n getKeyHandlers(): KeyHandler[] {\n const { keyHandlers } = this.props;\n return this.getCachedKeyHandlers(keyHandlers);\n }\n\n getCachedMouseHandlers = memoize((mouseHandlers: GridMouseHandler[]) =>\n [...mouseHandlers, ...this.mouseHandlers].sort((a, b) => a.order - b.order)\n );\n\n getMouseHandlers(): GridMouseHandler[] {\n const { mouseHandlers } = this.props;\n return this.getCachedMouseHandlers(mouseHandlers);\n }\n\n /**\n * Translate from the provided visible index to the model index\n * @param columnIndex The column index to get the model for\n * @returns The model index\n */\n getModelColumn(columnIndex: VisibleIndex): ModelIndex {\n const modelIndex = this.metrics?.modelColumns?.get(columnIndex);\n if (modelIndex === undefined) {\n throw new Error(`Unable to get ModelIndex for column ${columnIndex}`);\n }\n return modelIndex;\n }\n\n /**\n * Translate from the provided visible index to the model index\n * @param rowIndex The row index to get the model for\n * @returns The model index\n */\n getModelRow(rowIndex: VisibleIndex): ModelIndex {\n const modelIndex = this.metrics?.modelRows?.get(rowIndex);\n if (modelIndex === undefined) {\n throw new Error(`Unable to get ModelIndex for row ${rowIndex}`);\n }\n return modelIndex;\n }\n\n /**\n * Toggle a row between expanded and collapsed states\n * @param row The row to toggle expansion for\n */\n toggleRowExpanded(row: VisibleIndex): void {\n const modelRow = this.getModelRow(row);\n const { model } = this.props;\n // We only want to set expansion if the row is expandable\n // If it's not, still move the cursor to that position, as it may be outside of the current viewport and we don't know if it's expandable yet\n if (isExpandableGridModel(model) && model.isRowExpandable(modelRow)) {\n model.setRowExpanded(modelRow, !model.isRowExpanded(modelRow));\n }\n this.clearSelectedRanges();\n this.commitSelection(); // Need to commit before moving in case we're selecting same row again\n this.moveCursorToPosition(0, row);\n this.commitSelection();\n\n this.setState({ isStuckToBottom: false });\n }\n\n /**\n * Allows the selected ranges to be set programatically\n * Will update the cursor and selection start/end based on the new ranges\n * @param gridRanges The new selected ranges to set\n */\n setSelectedRanges(gridRanges: GridRange[]): void {\n const { model } = this.props;\n const { columnCount, rowCount } = model;\n const { cursorRow, cursorColumn, selectedRanges } = this.state;\n this.setState({\n selectedRanges: gridRanges,\n lastSelectedRanges: selectedRanges,\n });\n if (gridRanges.length > 0) {\n const range = GridRange.boundedRange(\n gridRanges[0],\n columnCount,\n rowCount\n );\n let newCursorRow = cursorRow;\n let newCursorColumn = cursorColumn;\n if (!range.containsCell(cursorColumn, cursorRow)) {\n ({ row: newCursorRow, column: newCursorColumn } = range.startCell());\n }\n\n this.setState({\n selectionStartColumn: range.startColumn,\n selectionStartRow: range.startRow,\n selectionEndColumn: range.endColumn,\n selectionEndRow: range.endRow,\n cursorColumn: newCursorColumn,\n cursorRow: newCursorRow,\n });\n }\n }\n\n initContext(): void {\n const { canvas } = this;\n const { canvasOptions } = this.props;\n\n if (!canvas) throw new Error('Canvas not set');\n\n this.canvasContext = canvas.getContext('2d', canvasOptions);\n }\n\n requestUpdateCanvas(): void {\n if (this.animationFrame != null) {\n return;\n }\n\n this.animationFrame = requestAnimationFrame(() => {\n this.animationFrame = null;\n\n if (!this.metrics) throw new Error('Metrics not set');\n\n this.updateCanvas(this.metrics);\n });\n }\n\n updateCanvas(metrics = this.updateMetrics()): void {\n this.updateCanvasScale();\n\n const { onViewChanged } = this.props;\n onViewChanged(metrics);\n\n this.drawCanvas(metrics);\n }\n\n updateCanvasScale(): void {\n const { canvas, canvasContext } = this;\n if (!canvas) throw new Error('canvas not set');\n if (!canvasContext) throw new Error('canvasContext not set');\n if (!canvas.parentElement) throw new Error('Canvas has no parent element');\n\n const scale = Grid.getScale(canvasContext);\n // the parent wrapper has 100% width/height, and is used for determining size\n // we don't want to stretch the canvas to 100%, to avoid fractional pixels.\n // A wrapper element must be used for sizing, and canvas size must be\n // set manually to a floored value in css and a scaled value in width/height\n const rect = canvas.parentElement.getBoundingClientRect();\n const width = Math.floor(rect.width);\n const height = Math.floor(rect.height);\n canvas.style.width = `${width}px`;\n canvas.style.height = `${height}px`;\n canvas.width = width * scale;\n canvas.height = height * scale;\n canvasContext.scale(scale, scale);\n }\n\n updateMetrics(state = this.state): GridMetrics {\n this.prevMetrics = this.metrics;\n\n const { metricCalculator } = this;\n const metricState = this.getMetricState(state);\n this.metrics = metricCalculator.getMetrics(metricState);\n\n return this.metrics;\n }\n\n /**\n * Check if the selection state has changed, and call the onSelectionChanged callback if they have\n * @param prevState The previous grid state\n */\n checkSelectionChange(prevState: GridState): void {\n const { selectedRanges: oldSelectedRanges } = prevState;\n const { selectedRanges } = this.state;\n\n if (selectedRanges !== oldSelectedRanges) {\n const { onSelectionChanged } = this.props;\n onSelectionChanged(selectedRanges);\n }\n }\n\n /**\n * Validate the current selection, and reset if it is invalid\n * @returns True if the selection is valid, false if the selection was invalid and has been reset\n */\n validateSelection(): boolean {\n const { model } = this.props;\n const { selectedRanges } = this.state;\n const { columnCount, rowCount } = model;\n\n for (let i = 0; i < selectedRanges.length; i += 1) {\n const range = selectedRanges[i];\n if (\n (range.endColumn != null && range.endColumn >= columnCount) ||\n (range.endRow != null && range.endRow >= rowCount)\n ) {\n // Just clear the selection rather than trying to trim it.\n this.setState({ selectedRanges: [], lastSelectedRanges: [] });\n return false;\n }\n }\n return true;\n }\n\n /**\n * Clears all selected ranges\n */\n clearSelectedRanges(): void {\n const { selectedRanges } = this.state;\n this.setState({ selectedRanges: [], lastSelectedRanges: selectedRanges });\n }\n\n /** Clears all but the last selected range */\n trimSelectedRanges(): void {\n const { selectedRanges } = this.state;\n if (selectedRanges.length > 0) {\n this.setState({\n selectedRanges: selectedRanges.slice(selectedRanges.length - 1),\n });\n }\n }\n\n /**\n * Begin a selection operation at the provided location\n * @param column Column where the selection is beginning\n * @param row Row where the selection is beginning\n */\n beginSelection(column: GridRangeIndex, row: GridRangeIndex): void {\n this.setState({\n selectionStartColumn: column,\n selectionStartRow: row,\n selectionEndColumn: column,\n selectionEndRow: row,\n cursorColumn: column,\n cursorRow: row,\n });\n }\n\n /**\n * Moves the selection to the cell specified\n * @param column The column index to move the cursor to\n * @param row The row index to move the cursor to\n * @param extendSelection Whether to extend the current selection (eg. holding Shift)\n * @param maximizePreviousRange When true, maximize/add to the previous range only, ignoring where the selection was started.\n */\n moveSelection(\n column: GridRangeIndex,\n row: GridRangeIndex,\n extendSelection = false,\n maximizePreviousRange = false\n ): void {\n this.setState(state => {\n const { selectedRanges, selectionStartRow, selectionStartColumn } = state;\n const { theme } = this.props;\n const { autoSelectRow, autoSelectColumn } = theme;\n\n if (extendSelection && selectedRanges.length > 0) {\n const lastSelectedRange = selectedRanges[selectedRanges.length - 1];\n let left = null;\n let top = null;\n let right = null;\n let bottom = null;\n if (maximizePreviousRange) {\n left = autoSelectRow\n ? null\n : Math.min(column ?? 0, lastSelectedRange.startColumn ?? 0);\n top = autoSelectColumn\n ? null\n : Math.min(row ?? 0, lastSelectedRange.startRow ?? 0);\n right = autoSelectRow\n ? null\n : Math.max(column ?? 0, lastSelectedRange.endColumn ?? 0);\n bottom = autoSelectColumn\n ? null\n : Math.max(row ?? 0, lastSelectedRange.endRow ?? 0);\n } else {\n left = lastSelectedRange.startColumn;\n top = lastSelectedRange.startRow;\n\n if (selectionStartColumn != null || selectionStartRow != null) {\n if (!autoSelectRow) {\n left = selectionStartColumn;\n }\n if (!autoSelectColumn) {\n top = selectionStartRow;\n }\n }\n right = autoSelectRow ? null : column;\n bottom = autoSelectColumn ? null : row;\n }\n const selectedRange = GridRange.makeNormalized(\n left,\n top,\n right,\n bottom\n );\n\n if (lastSelectedRange.equals(selectedRange)) {\n return null;\n }\n\n const newRanges = [...selectedRanges];\n newRanges[newRanges.length - 1] = selectedRange;\n return {\n selectedRanges: newRanges,\n selectionEndColumn: column,\n selectionEndRow: row,\n };\n }\n const newRanges = [...selectedRanges];\n const selectedColumn = autoSelectRow ? null : column;\n const selectedRow = autoSelectColumn ? null : row;\n newRanges.push(\n GridRange.makeNormalized(\n selectedColumn,\n selectedRow,\n selectedColumn,\n selectedRow\n )\n );\n return {\n selectedRanges: newRanges,\n selectionEndColumn: column,\n selectionEndRow: row,\n };\n });\n }\n\n /**\n * Commits the last selected range to the selected ranges.\n * First checks if the last range is completely contained within another range, and if it\n * is then it blows those ranges apart.\n * Then it consolidates all the selected ranges, reducing them.\n */\n commitSelection(): void {\n this.setState((state: GridState) => {\n const { theme } = this.props;\n const { autoSelectRow } = theme;\n const {\n selectedRanges,\n lastSelectedRanges,\n cursorRow,\n cursorColumn,\n } = state;\n\n if (\n selectedRanges.length === 1 &&\n (autoSelectRow\n ? GridRange.rowCount(selectedRanges) === 1\n : GridRange.cellCount(selectedRanges) === 1) &&\n GridRange.rangeArraysEqual(selectedRanges, lastSelectedRanges)\n ) {\n // If it's the exact same single selection, then deselect.\n // For if we click on one cell multiple times.\n return {\n selectedRanges: [],\n lastSelectedRanges: [],\n cursorColumn,\n cursorRow,\n };\n }\n\n let newSelectedRanges = selectedRanges.slice();\n if (newSelectedRanges.length > 1) {\n // Check if the latest selection is entirely within a previously selected range\n // If that's the case, then deselect that section instead\n const lastRange = newSelectedRanges[newSelectedRanges.length - 1];\n for (let i = 0; i < newSelectedRanges.length - 1; i += 1) {\n const selectedRange = newSelectedRanges[i];\n if (selectedRange.contains(lastRange)) {\n // We found a match, now remove the two matching ranges, and add back\n // the remainder of the two\n const remainder = selectedRange.subtract(lastRange);\n newSelectedRanges.pop();\n newSelectedRanges.splice(i, 1);\n newSelectedRanges = newSelectedRanges.concat(remainder);\n break;\n }\n }\n\n newSelectedRanges = GridRange.consolidate(newSelectedRanges);\n }\n\n let newCursorColumn = cursorColumn;\n let newCursorRow = cursorRow;\n if (!GridRange.containsCell(newSelectedRanges, cursorColumn, cursorRow)) {\n const { model } = this.props;\n const { columnCount, rowCount } = model;\n const nextCursor = GridRange.nextCell(\n GridRange.boundedRanges(selectedRanges, columnCount, rowCount)\n );\n if (nextCursor != null) {\n ({ column: newCursorColumn, row: newCursorRow } = nextCursor);\n } else {\n newCursorColumn = null;\n newCursorRow = null;\n }\n }\n return {\n cursorRow: newCursorRow,\n cursorColumn: newCursorColumn,\n selectedRanges: newSelectedRanges,\n lastSelectedRanges: selectedRanges,\n };\n });\n }\n\n /**\n * Set the selection to the entire grid\n */\n selectAll(): void {\n const { model, theme } = this.props;\n const { autoSelectRow, autoSelectColumn } = theme;\n\n const top = autoSelectColumn ? null : 0;\n const bottom = autoSelectColumn ? null : model.rowCount - 1;\n const left = autoSelectRow ? null : 0;\n const right = autoSelectRow ? null : model.columnCount - 1;\n this.setSelectedRanges([new GridRange(left, top, right, bottom)]);\n }\n\n /**\n * Move the cursor in relation to the current cursor position\n * @param deltaColumn Number of columns to move the cursor\n * @param deltaRow Number of rows to move the cursor\n * @param extendSelection True if the current selection should be extended, false to start a new selection\n */\n moveCursor(\n deltaColumn: number,\n deltaRow: number,\n extendSelection: boolean\n ): void {\n const {\n cursorRow,\n cursorColumn,\n selectionEndColumn,\n selectionEndRow,\n } = this.state;\n const column = extendSelection ? selectionEndColumn : cursorColumn;\n const row = extendSelection ? selectionEndRow : cursorRow;\n if (row === null || column === null) {\n const { left, top } = this.state;\n this.moveCursorToPosition(left, top, extendSelection);\n } else {\n const { model } = this.props;\n const { columnCount, rowCount } = model;\n\n const left = clamp(column + deltaColumn, 0, columnCount - 1);\n const top = clamp(row + deltaRow, 0, rowCount - 1);\n this.moveCursorToPosition(left, top, extendSelection);\n }\n }\n\n /**\n * Move the cursor in the provided selection direction\n * @param direction The direction to move the cursor in\n */\n moveCursorInDirection(direction = GridRange.SELECTION_DIRECTION.DOWN): void {\n const { model } = this.props;\n const { columnCount, rowCount } = model;\n const { cursorRow, cursorColumn, selectedRanges } = this.state;\n const ranges =\n selectedRanges.length > 0\n ? selectedRanges\n : [GridRange.makeCell(cursorColumn, cursorRow)];\n let nextCursor = null;\n if (ranges.length === 1 && GridRange.cellCount(ranges) === 1) {\n // If we only have one cell selected, we want to update the cursor and we want to update the selected cells\n const gridRange = new GridRange(0, 0, columnCount - 1, rowCount - 1);\n nextCursor =\n gridRange.nextCell(cursorColumn, cursorRow, direction) ??\n gridRange.startCell(direction);\n } else {\n nextCursor = GridRange.nextCell(\n GridRange.boundedRanges(ranges, columnCount, rowCount),\n cursorColumn,\n cursorRow,\n direction\n );\n }\n\n if (nextCursor != null) {\n const { column, row } = nextCursor;\n this.setState({\n cursorColumn: column,\n cursorRow: row,\n });\n\n if (!GridRange.containsCell(selectedRanges, column, row)) {\n this.setState({\n selectedRanges: [GridRange.makeCell(column, row)],\n selectionStartColumn: column,\n selectionStartRow: row,\n selectionEndColumn: column,\n selectionEndRow: row,\n });\n }\n\n this.moveViewToCell(nextCursor.column, nextCursor.row);\n }\n }\n\n /**\n * Move a cursor to the specified position in the grid.\n * @param column The column index to move the cursor to\n * @param row The row index to move the cursor to\n * @param extendSelection Whether to extend the current selection (eg. holding Shift)\n * @param keepCursorInView Whether to move the viewport so that the cursor is in view\n * @param maximizePreviousRange With this and `extendSelection` true, it will maximize/add to the previous range only, ignoring where the selection was started\n */\n moveCursorToPosition(\n column: GridRangeIndex,\n row: GridRangeIndex,\n extendSelection = false,\n keepCursorInView = true,\n maximizePreviousRange = false\n ): void {\n if (!extendSelection) {\n this.beginSelection(column, row);\n }\n\n this.moveSelection(column, row, extendSelection, maximizePreviousRange);\n\n if (keepCursorInView) {\n this.moveViewToCell(column, row);\n }\n }\n\n /**\n * Moves the view to make the specified cell visible\n *\n * @param column The column index to bring into view\n * @param row The row index to bring into view\n */\n moveViewToCell(column: GridRangeIndex, row: GridRangeIndex): void {\n if (!this.metrics) throw new Error('metrics not set');\n\n const { metricCalculator } = this;\n const {\n bottomVisible,\n rightVisible,\n topVisible,\n leftVisible,\n } = this.metrics;\n const metricState = this.getMetricState(this.state);\n let { top, left, topOffset, leftOffset } = this.state;\n\n if (row != null && !GridUtils.isFloatingRow(row, this.metrics)) {\n if (row < topVisible) {\n top = metricCalculator.getTopForTopVisible(metricState, row);\n topOffset = 0;\n } else if (row > bottomVisible) {\n top = metricCalculator.getTopForBottomVisible(metricState, row);\n topOffset = 0;\n }\n }\n\n if (column != null && !GridUtils.isFloatingColumn(column, this.metrics)) {\n if (column < leftVisible) {\n left = metricCalculator.getLeftForLeftVisible(metricState, column);\n leftOffset = 0;\n } else if (column > rightVisible) {\n left = metricCalculator.getLeftForRightVisible(metricState, column);\n leftOffset = 0;\n }\n }\n\n this.setViewState({ top, left, topOffset, leftOffset });\n }\n\n /**\n * Checks the `top` and `left` properties that are set and updates the isStuckToBottom/Right properties\n * Should be called when user interaction occurs\n * @param viewState New state properties to set.\n * @param forceUpdate Whether to force an update.\n */\n setViewState(viewState: Partial<GridState>, forceUpdate = false): void {\n if (!this.metrics) throw new Error('metrics not set');\n\n const { isStickyBottom, isStickyRight } = this.props;\n const { top, left } = viewState;\n const { lastTop, lastLeft } = this.metrics;\n if (top != null) {\n this.setState({ isStuckToBottom: isStickyBottom && top >= lastTop });\n }\n if (left != null) {\n this.setState({ isStuckToRight: isStickyRight && left >= lastLeft });\n }\n\n this.setState(viewState as GridState);\n if (forceUpdate) {\n this.forceUpdate();\n }\n }\n\n /**\n * Start editing the data at the given index\n *\n * @param column The visible column index to start editing\n * @param row The visible row index to start editing\n * @param isQuickEdit If this is a quick edit (the arrow keys can commit)\n * @param selectionRange The tuple [start,end] text selection range of the value to select when editing\n * @param value The value to start with in the edit field. Leave undefined to use the current value.\n */\n startEditing(\n column: VisibleIndex,\n row: VisibleIndex,\n isQuickEdit = false,\n selectionRange?: EditingCellTextSelectionRange,\n value?: string\n ): void {\n const { model } = this.props;\n if (!isEditableGridModel(model)) throw new Error('model is not editable');\n\n const modelColumn = this.getModelColumn(column);\n const modelRow = this.getModelRow(row);\n const cell = {\n column,\n row,\n selectionRange,\n value:\n value !== undefined\n ? value\n : model.editValueForCell(modelColumn, modelRow),\n isQuickEdit,\n };\n\n this.setState({ editingCell: cell, cursorColumn: column, cursorRow: row });\n this.moveViewToCell(column, row);\n }\n\n /**\n * Check if a value is valid for a specific cell\n * @param column Column index of the cell to check\n * @param row Row index of the cell to check\n * @param value Value to check\n * @returns True if the value is valid for the provided cell, false otherwise\n */\n isValidForCell(\n column: VisibleIndex,\n row: VisibleIndex,\n value: string\n ): boolean {\n const { model } = this.props;\n\n const modelColumn = this.getModelColumn(column);\n const modelRow = this.getModelRow(row);\n return (\n isEditableGridModel(model) &&\n model.isValidForCell(modelColumn, modelRow, value)\n );\n }\n\n /**\n * Paste a value with the current selection\n * It first needs to validate that the pasted table is valid for the given selection.\n * Also may update selection if single cells are selected and a table is pasted.\n * @param value Table or a string that is being pasted\n */\n async pasteValue(value: string[][] | string): Promise<void> {\n const { model } = this.props;\n const { movedColumns, movedRows, selectedRanges } = this.state;\n\n try {\n assertIsEditableGridModel(model);\n\n if (\n !model.isEditable ||\n !selectedRanges.every(range => model.isEditableRange(range))\n ) {\n throw new PasteError(\"Can't paste in to read-only area.\");\n }\n\n if (selectedRanges.length <= 0) {\n throw new PasteError('Select an area to paste to.');\n }\n\n if (typeof value === 'string') {\n // Just paste the value into all the selected cells\n const edits: EditOperation[] = [];\n\n const modelRanges = GridUtils.getModelRanges(\n selectedRanges,\n movedColumns,\n movedRows\n );\n GridRange.forEachCell(modelRanges, (column, row) => {\n edits.push({ column, row, text: value });\n });\n await model.setValues(edits);\n return;\n }\n\n // Otherwise it's a table of data\n const tableHeight = value.length;\n const tableWidth = value[0].length;\n const { columnCount, rowCount } = model;\n let ranges = selectedRanges;\n // If each cell is a single selection, we need to update the selection to map to the newly pasted data\n if (\n ranges.every(\n range =>\n GridRange.cellCount([range]) === 1 &&\n (range.startColumn ?? 0) + tableWidth <= columnCount &&\n (range.startRow ?? 0) + tableHeight <= rowCount\n )\n ) {\n // Remap the selected ranges\n ranges = ranges.map(\n range =>\n new GridRange(\n range.startColumn,\n range.startRow,\n (range.startColumn ?? 0) + tableWidth - 1,\n (range.startRow ?? 0) + tableHeight - 1\n )\n );\n this.setSelectedRanges(ranges);\n }\n\n if (\n !ranges.every(\n range =>\n GridRange.rowCount([range]) === tableHeight &&\n GridRange.columnCount([range]) === tableWidth\n )\n ) {\n throw new PasteError('Copy and paste area are not same size.');\n }\n\n const edits: EditOperation[] = [];\n ranges.forEach(range => {\n for (let x = 0; x < tableWidth; x += 1) {\n for (let y = 0; y < tableHeight; y += 1) {\n edits.push({\n column: (range.startColumn ?? 0) + x,\n row: (range.startRow ?? 0) + y,\n text: value[y][x],\n });\n }\n }\n });\n await model.setValues(edits);\n } catch (e) {\n const { onError } = this.props;\n onError(e instanceof Error ? e : new Error(`${e}`));\n }\n }\n\n /**\n * Set a value to a specific cell. If the value is not valid for that cell, do not set it\n * @param column Column index to set the value for\n * @param row Row index to set the value for\n * @param value Value to set at that cell\n * @returns true If the value was valid and attempted to be set, false is it was not valid\n */\n setValueForCell(\n column: VisibleIndex,\n row: VisibleIndex,\n value: string\n ): boolean {\n const { model } = this.props;\n assertIsEditableGridModel(model);\n\n const modelColumn = this.getModelColumn(column);\n const modelRow = this.getModelRow(row);\n if (model.isValidForCell(modelColumn, modelRow, value)) {\n model.setValueForCell(modelColumn, modelRow, value);\n return true;\n }\n return false;\n }\n\n /**\n * Set a value on all the ranges provided\n * @param ranges Ranges to set\n * @param value The value to set on all the ranges\n */\n setValueForRanges(ranges: GridRange[], value: string): void {\n const { model } = this.props;\n const { movedColumns, movedRows } = this.state;\n\n const modelRanges = GridUtils.getModelRanges(\n ranges,\n movedColumns,\n movedRows\n );\n if (isEditableGridModel(model)) {\n model.setValueForRanges(modelRanges, value);\n }\n }\n\n /**\n * Check if a given cell is within the current selection\n * @param row Row to check\n * @param column Column to check\n * @returns True if the cell is in the current selection, false otherwise\n */\n isSelected(row: VisibleIndex, column: VisibleIndex): boolean {\n const { selectedRanges } = this.state;\n\n for (let i = 0; i < selectedRanges.length; i += 1) {\n const selectedRange = selectedRanges[i];\n const rowSelected =\n selectedRange.startRow === null ||\n (selectedRange.startRow <= row && row <= (selectedRange.endRow ?? 0));\n const columnSelected =\n selectedRange.startColumn === null ||\n (selectedRange.startColumn <= column &&\n column <= (selectedRange.endColumn ?? 0));\n if (rowSelected && columnSelected) {\n return true;\n }\n }\n\n return false;\n }\n\n addDocumentCursor(cursor: string | null = null): void {\n if (this.documentCursor === Grid.getCursorClassName(cursor)) return;\n if (this.documentCursor) {\n document.documentElement.classList.remove(this.documentCursor);\n }\n this.documentCursor = Grid.getCursorClassName(cursor);\n if (this.documentCursor) {\n document.documentElement.classList.add(this.documentCursor);\n }\n document.documentElement.classList.add('grid-block-events');\n }\n\n removeDocumentCursor(): void {\n if (this.documentCursor) {\n document.documentElement.classList.remove(this.documentCursor);\n document.documentElement.classList.remove('grid-block-events');\n this.documentCursor = null;\n }\n }\n\n startDragTimer(event: React.MouseEvent): void {\n this.stopDragTimer();\n\n const mouseEvent = new MouseEvent('custom', event.nativeEvent);\n\n this.dragTimer = setTimeout(() => {\n this.handleMouseDrag(mouseEvent);\n }, Grid.dragTimeout);\n }\n\n stopDragTimer(): void {\n if (this.dragTimer) {\n clearTimeout(this.dragTimer);\n this.dragTimer = null;\n }\n }\n\n /**\n * Draw the grid with the metrics provided\n * When scrolling you've have to re-draw the whole canvas. As a consequence, all these drawing methods\n * must be very quick.\n * @param metrics Metrics to use for rendering the grid\n */\n drawCanvas(metrics = this.updateMetrics()): void {\n if (!this.canvas) throw new Error('canvas is not set');\n if (!this.canvasContext) throw new Error('context not set');\n\n const {\n left,\n top,\n cursorColumn,\n cursorRow,\n draggingColumn,\n draggingColumnOffset,\n draggingColumnSeparator,\n draggingRow,\n draggingRowOffset,\n draggingRowSeparator,\n editingCell,\n isDraggingHorizontalScrollBar,\n isDraggingVerticalScrollBar,\n isDragging,\n mouseX,\n mouseY,\n selectedRanges,\n } = this.state;\n const { model, stateOverride } = this.props;\n const { renderer } = this;\n const context = this.canvasContext;\n const theme = this.getTheme();\n const width = this.canvas.clientWidth;\n const height = this.canvas.clientHeight;\n const renderState = {\n left,\n top,\n width,\n height,\n context,\n theme,\n model,\n metrics,\n mouseX,\n mouseY,\n selectedRanges,\n draggingColumn,\n draggingColumnOffset,\n draggingColumnSeparator,\n draggingRow,\n draggingRowOffset,\n draggingRowSeparator,\n editingCell,\n isDraggingHorizontalScrollBar,\n isDraggingVerticalScrollBar,\n isDragging,\n cursorColumn,\n cursorRow,\n ...stateOverride,\n };\n\n context.save();\n\n renderer.drawCanvas(renderState);\n\n context.restore();\n }\n\n /**\n * Set focus to this grid element\n */\n focus(): void {\n this.canvas?.focus();\n }\n\n /**\n * Check if this grid is currently focused\n * @returns True if the active element is this grid\n */\n isFocused(): boolean {\n return document.activeElement === this.canvas;\n }\n\n /**\n * Handle a mouse click event. Pass the event to the registered mouse handlers until one handles it.\n * Focuses the grid after the click.\n * @param event The mouse event\n */\n handleClick(event: React.MouseEvent): void {\n const gridPoint = this.getGridPointFromEvent(event);\n\n const mouseHandlers = this.getMouseHandlers();\n for (let i = 0; i < mouseHandlers.length; i += 1) {\n const mouseHandler = mouseHandlers[i];\n if (mouseHandler.onClick(gridPoint, this, event)) {\n event.stopPropagation();\n event.preventDefault();\n break;\n }\n }\n\n this.canvas?.focus();\n }\n\n /**\n * Handle a mouse context menu event. Pass the event to the registered mouse handlers until one handles it.\n * @param event The mouse event triggering the context menu\n */\n handleContextMenu(event: React.MouseEvent): void {\n const gridPoint = this.getGridPointFromEvent(event);\n\n const mouseHandlers = this.getMouseHandlers();\n for (let i = 0; i < mouseHandlers.length; i += 1) {\n const mouseHandler = mouseHandlers[i];\n if (mouseHandler.onContextMenu(gridPoint, this, event)) {\n event.stopPropagation();\n event.preventDefault();\n break;\n }\n }\n }\n\n /**\n * Handle a key down event from the keyboard. Pass the event to the registered keyboard handlers until one handles it.\n * @param event Keyboard event\n */\n handleKeyDown(event: GridKeyboardEvent): void {\n const keyHandlers = this.getKeyHandlers();\n for (let i = 0; i < keyHandlers.length; i += 1) {\n const keyHandler = keyHandlers[i];\n const result = keyHandler.onDown(event, this);\n if (result) {\n const options = result as EventHandlerResultOptions;\n if (options?.stopPropagation ?? true) event.stopPropagation();\n if (options?.preventDefault ?? true) event.preventDefault();\n break;\n }\n }\n }\n\n /**\n * Notify all of the mouse handlers for this grid of a mouse event.\n * @param functionName The name of the function in the mouse handler to call\n * @param event The mouse event to notify\n * @param updateCoordinates Whether to update the mouse coordinates\n * @param addCursorToDocument Whether to add a cursor overlay or not (for dragging)\n */\n notifyMouseHandlers(\n functionName: GridMouseHandlerFunctionName,\n event: GridMouseEvent,\n updateCoordinates = true,\n addCursorToDocument = false\n ): void {\n const gridPoint = this.getGridPointFromEvent(event);\n const mouseHandlers = this.getMouseHandlers();\n let cursor = null;\n for (let i = 0; i < mouseHandlers.length; i += 1) {\n const mouseHandler = mouseHandlers[i];\n const result =\n mouseHandler[functionName] &&\n mouseHandler[functionName](gridPoint, this, event);\n if (result) {\n if (mouseHandler.cursor != null) {\n ({ cursor } = mouseHandler);\n if (addCursorToDocument) {\n this.addDocumentCursor(cursor);\n }\n }\n\n // result is bool or object, events are stopped by default\n const options = result as EventHandlerResultOptions;\n if (options?.stopPropagation ?? true) event.stopPropagation();\n if (options?.preventDefault ?? true) event.preventDefault();\n break;\n }\n }\n\n this.setState({ cursor });\n\n if (updateCoordinates) {\n const { x, y } = gridPoint;\n this.setState({ mouseX: x, mouseY: y });\n }\n }\n\n handleMouseDown(event: React.MouseEvent): void {\n window.addEventListener('mousemove', this.handleMouseDrag, true);\n window.addEventListener('mouseup', this.handleMouseUp, true);\n\n if (event.button != null && event.button !== 0) {\n return;\n }\n\n this.notifyMouseHandlers('onDown', event);\n\n this.startDragTimer(event);\n }\n\n handleDoubleClick(event: React.MouseEvent): void {\n this.notifyMouseHandlers('onDoubleClick', event);\n }\n\n handleMouseMove(event: React.MouseEvent): void {\n this.notifyMouseHandlers('onMove', event);\n }\n\n handleMouseLeave(event: React.MouseEvent): void {\n this.notifyMouseHandlers('onLeave', event, false);\n this.setState({ mouseX: null, mouseY: null });\n }\n\n handleMouseDrag(event: MouseEvent): void {\n this.setState({ isDragging: true });\n this.notifyMouseHandlers('onDrag', event, true, true);\n\n this.stopDragTimer();\n }\n\n handleMouseUp(event: MouseEvent): void {\n window.removeEventListener('mousemove', this.handleMouseDrag, true);\n window.removeEventListener('mouseup', this.handleMouseUp, true);\n\n if (event.button != null && event.button !== 0) {\n return;\n }\n\n this.notifyMouseHandlers('onUp', event, false);\n\n this.stopDragTimer();\n\n this.removeDocumentCursor();\n }\n\n handleResize(): void {\n /**\n * We need to always redraw the canvas in the same frame as the updateCanvasScale\n * because it clears the canvas by nature of direct dom manipulation. However,\n * We also need to verify the state/metrics, which we currently have no way\n * of doing outside of a full componentDidUpdate() call, so we force the update.\n * Ideally, we could verify state/metrics without the forced update.\n */\n this.updateCanvasScale();\n this.updateCanvas();\n this.forceUpdate();\n }\n\n handleWheel(event: WheelEvent): void {\n this.notifyMouseHandlers('onWheel', event);\n\n if (event.defaultPrevented) {\n return;\n }\n\n const { metricCalculator, metrics } = this;\n const metricState = this.getMetricState();\n\n if (!metrics) throw new Error('metrics not set');\n\n const {\n lastTop,\n lastLeft,\n columnCount,\n rowCount,\n scrollableContentWidth,\n scrollableViewportWidth,\n scrollableContentHeight,\n scrollableViewportHeight,\n hasHorizontalBar,\n hasVerticalBar,\n } = metrics;\n let { top, left, topOffset, leftOffset } = metrics;\n\n const theme = this.getTheme();\n\n let { deltaX, deltaY } = GridUtils.getScrollDelta(\n event,\n metrics.barWidth,\n metrics.barHeight,\n metrics.rowHeight,\n metrics.rowHeight\n );\n\n // iterate through each column to determine column width and figure out how far to scroll\n // get column width of next column to scroll to, and subract it from the remaining distance to travel\n while (hasHorizontalBar && deltaX !== 0) {\n leftOffset += deltaX;\n deltaX = 0;\n\n if (columnCount > 1) {\n // no scrolling needed, at directional edge\n if (\n (leftOffset > 0 && left >= lastLeft) ||\n (leftOffset < 0 && left <= 0)\n ) {\n leftOffset = 0;\n break;\n }\n } else {\n // single column at edge\n if (leftOffset <= 0) {\n leftOffset = 0;\n break;\n }\n\n const maxLeftOffset = scrollableContentWidth - scrollableViewportWidth;\n if (leftOffset >= maxLeftOffset) {\n leftOffset = maxLeftOffset;\n break;\n }\n }\n\n if (leftOffset > 0) {\n // scroll right\n\n // get width of next column\n const columnWidth =\n metrics.visibleColumnWidths.get(left) ??\n metricCalculator.getVisibleColumnWidth(left, metricState);\n\n if (leftOffset >= columnWidth) {\n // remove width from balance and advance by 1 column\n deltaX = leftOffset - columnWidth;\n leftOffset = 0;\n left += 1;\n } else if (theme.scrollSnapToColumn && columnCount > 1) {\n // if there's still a balance to travel but its less then a column and snapping is on\n leftOffset = 0;\n left += 1;\n }\n } else if (leftOffset < 0) {\n // scroll left\n\n // get width of next column\n const columnWidth =\n metrics.visibleColumnWidths.get(left - 1) ??\n metricCalculator.getVisibleColumnWidth(left - 1, metricState);\n\n if (\n Math.abs(leftOffset) <= columnWidth &&\n theme.scrollSnapToColumn &&\n columnCount > 1\n ) {\n // if there's still a balance to travel but its less then a column and snapping is on\n leftOffset = 0;\n left -= 1;\n } else {\n // remove width from balance and advance by 1 column\n deltaX = leftOffset + columnWidth;\n leftOffset = 0;\n left -= 1;\n }\n }\n }\n\n // iterate through each row to determine row height and figure out how far to scroll\n // get row height of next row to scroll to, and subract it from the remaining distance to travel\n while (hasVerticalBar && deltaY !== 0) {\n topOffset += deltaY;\n deltaY = 0;\n\n if (rowCount > 1) {\n // no scrolling needed, at directional edge\n if ((topOffset > 0 && top >= lastTop) || (topOffset < 0 && top <= 0)) {\n topOffset = 0;\n break;\n }\n } else {\n // single row at edge\n if (topOffset <= 0) {\n topOffset = 0;\n break;\n }\n\n const maxTopOffset = scrollableContentHeight - scrollableViewportHeight;\n if (topOffset >= maxTopOffset) {\n topOffset = maxTopOffset;\n break;\n }\n }\n\n if (topOffset > 0) {\n // scroll direction down\n\n // get height of next row\n const rowHeight =\n metrics.visibleRowHeights.get(top) ??\n metricCalculator.getVisibleRowHeight(top, metricState);\n\n if (topOffset >= rowHeight) {\n // remove height from balance and advance by 1 row\n deltaY = topOffset - rowHeight;\n topOffset = 0;\n top += 1;\n } else if (theme.scrollSnapToRow && rowCount > 1) {\n // if there's still a balance to travel but its less then a row and snapping is on\n topOffset = 0;\n top += 1;\n }\n } else if (topOffset < 0) {\n // scroll direction up\n\n // get height of next row\n const rowHeight =\n metrics.visibleRowHeights.get(top - 1) ??\n metricCalculator.getVisibleRowHeight(top - 1, metricState);\n\n if (\n Math.abs(topOffset) <= rowHeight &&\n theme.scrollSnapToRow &&\n rowCount > 1\n ) {\n // if there's still a balance to travel but its less then a row and snapping is on\n topOffset = 0;\n top -= 1;\n } else {\n // remove height from balance and advance by 1 row\n deltaY = topOffset + rowHeight;\n topOffset = 0;\n top -= 1;\n }\n }\n }\n\n this.setViewState({ top, left, leftOffset, topOffset });\n\n event.stopPropagation();\n event.preventDefault();\n }\n\n /**\n * Handle cancelling the cell edit action\n */\n handleEditCellCancel(): void {\n this.setState({ editingCell: null });\n this.focus();\n }\n\n /**\n * Handle a change in the value in an editing cell\n * @param value New value set\n */\n handleEditCellChange(value: string): void {\n this.setState(({ editingCell }) => {\n try {\n assertIsDefined(editingCell);\n\n return {\n editingCell: { ...editingCell, value } as EditingCell,\n };\n } catch (e) {\n // This case should _never_ happen, since the editingCell shouldn't be null if this method is called\n const { onError } = this.props;\n onError(e instanceof Error ? e : new Error(`${e}`));\n return null;\n }\n });\n }\n\n /**\n * Commit an edit for the currently editing cell\n * @param value Value that was committed\n * @param options Options for committing\n */\n handleEditCellCommit(\n value: string,\n {\n direction = SELECTION_DIRECTION.DOWN,\n fillRange = false,\n }: { direction?: SELECTION_DIRECTION | null; fillRange?: boolean } = {}\n ): void {\n const { editingCell, selectedRanges } = this.state;\n if (!editingCell) throw new Error('editingCell not set');\n\n const { column, row } = editingCell;\n if (!this.isValidForCell(column, row, value)) {\n // Don't allow an invalid value to be commited, the editing cell should show an error\n if (direction === null) {\n // If they clicked off of the editing cell, just remove focus\n this.setState({ editingCell: null });\n }\n return;\n }\n\n if (fillRange) {\n this.setValueForRanges(selectedRanges, value);\n } else {\n this.setValueForCell(column, row, value);\n }\n\n if (direction !== null) {\n this.moveCursorInDirection(direction);\n }\n\n this.setState({ editingCell: null });\n\n this.focus();\n }\n\n renderInputField(): ReactNode {\n const { model } = this.props;\n const { editingCell } = this.state;\n const { metrics } = this;\n if (editingCell == null || metrics == null || !isEditableGridModel(model)) {\n return null;\n }\n const { selectionRange, value, isQuickEdit } = editingCell;\n const { column, row } = editingCell;\n const {\n gridX,\n gridY,\n visibleColumnXs,\n visibleRowYs,\n visibleColumnWidths,\n visibleRowHeights,\n } = metrics;\n\n const x = visibleColumnXs.get(column);\n const y = visibleRowYs.get(row);\n const w = visibleColumnWidths.get(column);\n const h = visibleRowHeights.get(row);\n\n // If the cell isn't visible, we still need to display an invisible cell for focus purposes\n const wrapperStyle: CSSProperties =\n x != null && y != null && w != null && h != null\n ? {\n position: 'absolute',\n left: gridX + x,\n top: gridY + y,\n width: w,\n height: h,\n }\n : { opacity: 0 };\n\n const modelColumn = this.getModelColumn(column);\n const modelRow = this.getModelRow(row);\n const inputStyle: CSSProperties | undefined =\n modelColumn != null && modelRow != null\n ? {\n textAlign: model.textAlignForCell(modelColumn, modelRow),\n }\n : undefined;\n const isValid = model.isValidForCell(modelColumn, modelRow, value);\n\n return (\n <div style={wrapperStyle}>\n <CellInputField\n key={`${column},${row}`}\n selectionRange={selectionRange}\n className={classNames({ error: !isValid })}\n onCancel={this.handleEditCellCancel}\n onChange={this.handleEditCellChange}\n onDone={this.handleEditCellCommit}\n isQuickEdit={isQuickEdit}\n style={inputStyle}\n value={value}\n />\n </div>\n );\n }\n\n render(): ReactNode {\n const { cursor } = this.state;\n\n return (\n <>\n <canvas\n className={classNames('grid-canvas', Grid.getCursorClassName(cursor))}\n ref={canvas => {\n this.canvas = canvas;\n }}\n onClick={this.handleClick}\n onContextMenu={this.handleContextMenu}\n onDoubleClick={this.handleDoubleClick}\n onKeyDown={this.handleKeyDown}\n onMouseDown={this.handleMouseDown}\n onMouseMove={this.handleMouseMove}\n onMouseLeave={this.handleMouseLeave}\n tabIndex={0}\n >\n Your browser does not support HTML canvas. Update your browser?\n </canvas>\n {this.renderInputField()}\n </>\n );\n }\n}\n\nexport default Grid;\n"],"file":"Grid.js"}
|
|
1
|
+
{"version":3,"sources":["../src/Grid.tsx"],"names":["React","PureComponent","classNames","memoize","clamp","GridMetricCalculator","GridTheme","GridRange","SELECTION_DIRECTION","GridRenderer","GridUtils","GridSelectionMouseHandler","GridColumnMoveMouseHandler","GridColumnSeparatorMouseHandler","GridHorizontalScrollBarMouseHandler","GridRowMoveMouseHandler","GridRowSeparatorMouseHandler","GridRowTreeMouseHandler","GridScrollBarCornerMouseHandler","GridVerticalScrollBarMouseHandler","EditMouseHandler","EditKeyHandler","PasteKeyHandler","SelectionKeyHandler","TreeKeyHandler","CellInputField","PasteError","isExpandableGridModel","assertIsEditableGridModel","isEditableGridModel","assertIsDefined","ThemeContext","Grid","getScale","context","devicePixelRatio","window","legacyContext","backingStorePixelRatio","webkitBackingStorePixelRatio","mozBackingStorePixelRatio","msBackingStorePixelRatio","oBackingStorePixelRatio","getCursorClassName","cursor","constructor","props","keyHandlers","sort","a","b","order","mouseHandlers","handleClick","bind","handleContextMenu","handleEditCellCancel","handleEditCellChange","handleEditCellCommit","handleDoubleClick","handleKeyDown","handleMouseDown","handleMouseDrag","handleMouseMove","handleMouseLeave","handleMouseUp","handleResize","handleWheel","isStuckToBottom","isStuckToRight","metricCalculator","movedColumns","movedRows","renderer","canvas","canvasContext","animationFrame","prevMetrics","metrics","documentCursor","dragTimer","state","top","left","topOffset","leftOffset","draggingColumn","draggingRow","draggingColumnOffset","draggingRowOffset","draggingColumnSeparator","draggingRowSeparator","isDraggingHorizontalScrollBar","isDraggingVerticalScrollBar","isDragging","mouseX","mouseY","cursorRow","cursorColumn","selectionStartRow","selectionStartColumn","selectionEndRow","selectionEndColumn","selectedRanges","lastSelectedRanges","editingCell","componentDidMount","initContext","addEventListener","passive","updateCanvasScale","updateCanvas","componentDidUpdate","prevProps","prevState","isStickyBottom","isStickyRight","onMovedColumnsChanged","onMoveColumnComplete","onMovedRowsChanged","onMoveRowComplete","prevIsStickyBottom","prevIsStickyRight","prevPropMovedColumns","prevPropMovedRows","prevStateMovedColumns","prevStateMovedRows","currentStateMovedColumns","currentStateMovedRows","setState","updateMetrics","requestUpdateCanvas","bottomVisible","rightVisible","rowCount","columnCount","height","width","prevRowCount","prevColumnCount","prevHeight","prevWidth","metricState","getMetricState","lastTop","getLastTop","lastLeft","getLastLeft","validateSelection","checkSelectionChange","componentWillUnmount","cancelAnimationFrame","removeEventListener","stopDragTimer","getTheme","theme","getGridPointFromEvent","event","rect","getBoundingClientRect","x","clientX","y","clientY","getGridPointFromXY","Error","model","stateOverride","clientWidth","clientHeight","getKeyHandlers","getCachedKeyHandlers","getMouseHandlers","getCachedMouseHandlers","getModelColumn","columnIndex","modelIndex","modelColumns","get","undefined","getModelRow","rowIndex","modelRows","toggleRowExpanded","row","modelRow","isRowExpandable","setRowExpanded","isRowExpanded","clearSelectedRanges","commitSelection","moveCursorToPosition","setSelectedRanges","gridRanges","length","range","boundedRange","newCursorRow","newCursorColumn","containsCell","column","startCell","startColumn","startRow","endColumn","endRow","canvasOptions","getContext","requestAnimationFrame","onViewChanged","drawCanvas","parentElement","scale","Math","floor","style","getMetrics","oldSelectedRanges","onSelectionChanged","i","trimSelectedRanges","slice","beginSelection","moveSelection","extendSelection","maximizePreviousRange","autoSelectRow","autoSelectColumn","lastSelectedRange","right","bottom","min","max","selectedRange","makeNormalized","equals","newRanges","selectedColumn","selectedRow","push","cellCount","rangeArraysEqual","newSelectedRanges","lastRange","contains","remainder","subtract","pop","splice","concat","consolidate","nextCursor","nextCell","boundedRanges","selectAll","moveCursor","deltaColumn","deltaRow","moveCursorInDirection","direction","DOWN","ranges","makeCell","gridRange","moveViewToCell","keepCursorInView","topVisible","leftVisible","isFloatingRow","getTopForTopVisible","getTopForBottomVisible","isFloatingColumn","getLeftForLeftVisible","getLeftForRightVisible","setViewState","viewState","forceUpdate","startEditing","isQuickEdit","selectionRange","value","modelColumn","cell","editValueForCell","isValidForCell","pasteValue","isEditable","every","isEditableRange","edits","modelRanges","getModelRanges","forEachCell","text","setValues","tableHeight","tableWidth","map","forEach","e","onError","setValueForCell","setValueForRanges","isSelected","rowSelected","columnSelected","addDocumentCursor","document","documentElement","classList","remove","add","removeDocumentCursor","startDragTimer","mouseEvent","MouseEvent","nativeEvent","setTimeout","dragTimeout","clearTimeout","renderState","save","restore","focus","isFocused","activeElement","gridPoint","mouseHandler","onClick","stopPropagation","preventDefault","onContextMenu","keyHandler","result","onDown","options","notifyMouseHandlers","functionName","updateCoordinates","addCursorToDocument","button","defaultPrevented","scrollableContentWidth","scrollableViewportWidth","scrollableContentHeight","scrollableViewportHeight","hasHorizontalBar","hasVerticalBar","deltaX","deltaY","getScrollDelta","barWidth","barHeight","rowHeight","maxLeftOffset","columnWidth","visibleColumnWidths","getVisibleColumnWidth","scrollSnapToColumn","abs","maxTopOffset","visibleRowHeights","getVisibleRowHeight","scrollSnapToRow","fillRange","renderInputField","gridX","gridY","visibleColumnXs","visibleRowYs","w","h","wrapperStyle","position","opacity","inputStyle","textAlign","textAlignForCell","isValid","error","render","alpha","contextTheme","userTheme"],"mappings":"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","sourcesContent":["/* eslint react/no-did-update-set-state: \"off\" */\nimport React, { CSSProperties, PureComponent, ReactNode } from 'react';\nimport classNames from 'classnames';\nimport memoize from 'memoize-one';\nimport clamp from 'lodash.clamp';\nimport GridMetricCalculator, { GridMetricState } from './GridMetricCalculator';\nimport GridModel from './GridModel';\nimport GridMouseHandler, {\n GridMouseEvent,\n GridMouseHandlerFunctionName,\n} from './GridMouseHandler';\nimport GridTheme, { GridTheme as GridThemeType } from './GridTheme';\nimport GridRange, { GridRangeIndex, SELECTION_DIRECTION } from './GridRange';\nimport GridRenderer, {\n EditingCell,\n EditingCellTextSelectionRange,\n} from './GridRenderer';\nimport GridUtils, { GridPoint } from './GridUtils';\nimport {\n GridSelectionMouseHandler,\n GridColumnMoveMouseHandler,\n GridColumnSeparatorMouseHandler,\n GridHorizontalScrollBarMouseHandler,\n GridRowMoveMouseHandler,\n GridRowSeparatorMouseHandler,\n GridRowTreeMouseHandler,\n GridScrollBarCornerMouseHandler,\n GridVerticalScrollBarMouseHandler,\n EditMouseHandler,\n} from './mouse-handlers';\nimport './Grid.scss';\nimport KeyHandler, { GridKeyboardEvent } from './KeyHandler';\nimport {\n EditKeyHandler,\n PasteKeyHandler,\n SelectionKeyHandler,\n TreeKeyHandler,\n} from './key-handlers';\nimport CellInputField from './CellInputField';\nimport PasteError from './errors/PasteError';\nimport GridMetrics, {\n Coordinate,\n ModelIndex,\n MoveOperation,\n VisibleIndex,\n} from './GridMetrics';\nimport { isExpandableGridModel } from './ExpandableGridModel';\nimport {\n assertIsEditableGridModel,\n EditOperation,\n isEditableGridModel,\n} from './EditableGridModel';\nimport { EventHandlerResultOptions } from './EventHandlerResult';\nimport { assertIsDefined } from './errors';\nimport ThemeContext from './ThemeContext';\n\ntype LegacyCanvasRenderingContext2D = CanvasRenderingContext2D & {\n webkitBackingStorePixelRatio?: number;\n mozBackingStorePixelRatio?: number;\n msBackingStorePixelRatio?: number;\n oBackingStorePixelRatio?: number;\n backingStorePixelRatio?: number;\n};\n\nexport type GridProps = typeof Grid.defaultProps & {\n // Options to set on the canvas\n canvasOptions?: CanvasRenderingContext2DSettings;\n\n // Whether the grid should stick to the bottom or the right once scrolled to the end\n // Only matters with ticking grids\n isStickyBottom?: boolean;\n isStickyRight?: boolean;\n\n // Whether the grid is currently stuck to the bottom or the right\n isStuckToBottom?: boolean;\n isStuckToRight?: boolean;\n\n // Calculate all the metrics required for drawing the grid\n metricCalculator?: GridMetricCalculator;\n\n // The model to pull data from\n model: GridModel;\n\n // Optional key and mouse handlers\n keyHandlers?: KeyHandler[];\n mouseHandlers?: GridMouseHandler[];\n\n // Initial state of moved columns or rows\n movedColumns?: MoveOperation[];\n movedRows?: MoveOperation[];\n\n // Callback for if an error occurs\n onError?: (e: Error) => void;\n\n // Callback when the selection within the grid changes\n onSelectionChanged?: (ranges: GridRange[]) => void;\n\n // Callback when the moved columns or rows have changed\n onMovedColumnsChanged?: (movedColumns: MoveOperation[]) => void;\n onMovedRowsChanged?: (movedRows: MoveOperation[]) => void;\n\n // Callback when a move operation is completed\n onMoveColumnComplete?: (movedColumns: MoveOperation[]) => void;\n onMoveRowComplete?: (movedRows: MoveOperation[]) => void;\n\n // Callback when the viewport has scrolled or changed\n onViewChanged?: (metrics: GridMetrics) => void;\n\n // Renderer for the grid canvas\n renderer?: GridRenderer;\n\n // Optional state override to pass in to the metric and render state\n // Can be used to add custom properties as well\n stateOverride?: Record<string, unknown>;\n\n theme?: Partial<GridThemeType>;\n};\n\nexport type GridState = {\n // Top/left visible cell in the grid. Note that it's visible row/column index, not the model index (ie. if columns are re-ordered)\n top: VisibleIndex;\n left: VisibleIndex;\n\n // The scroll offset of the top/left cell. 0,0 means the cell is at the top left\n topOffset: number; // Should be less than the height of the row\n leftOffset: number; // Should be less than the width of the column\n\n // current column/row that user is dragging\n draggingColumn: VisibleIndex | null;\n draggingRow: VisibleIndex | null;\n\n // Offset when dragging a column/row\n draggingColumnOffset: number | null;\n draggingRowOffset: number | null;\n\n // When drawing header separators for resizing\n draggingColumnSeparator: VisibleIndex | null;\n draggingRowSeparator: VisibleIndex | null;\n\n // Dragging a scroll bar status\n isDraggingHorizontalScrollBar: boolean;\n isDraggingVerticalScrollBar: boolean;\n\n // Anything is performing a drag, for blocking hover rendering\n isDragging: boolean;\n\n // The coordinates of the mouse. May be outside of the canvas\n mouseX: number | null;\n mouseY: number | null;\n\n // Move operations the user has performed on this grids columns/rows\n movedColumns: MoveOperation[];\n movedRows: MoveOperation[];\n\n // Cursor (highlighted cell) location and active selected range\n cursorRow: VisibleIndex | null;\n cursorColumn: VisibleIndex | null;\n selectionStartRow: VisibleIndex | null;\n selectionStartColumn: VisibleIndex | null;\n selectionEndRow: VisibleIndex | null;\n selectionEndColumn: VisibleIndex | null;\n\n // Currently selected ranges and previously selected ranges\n // Store the previously selected ranges to determine if the new selection should\n // deselect again (if it's the same range)\n selectedRanges: GridRange[];\n lastSelectedRanges: GridRange[];\n\n // The mouse cursor style to use when hovering over the grid element\n cursor: string | null;\n\n // { column: number, row: number, selectionRange: [number, number], value: string | null, isQuickEdit?: boolean }\n // The cell that is currently being edited\n editingCell: EditingCell | null;\n\n // Whether we're stuck to the bottom or the right\n isStuckToBottom: boolean;\n isStuckToRight: boolean;\n};\n\n/**\n * High performance, extendible, themeable grid component.\n * Architectured to be fast and handle billions of rows/columns by default.\n * The base model does not provide support for sorting, filtering, etc.\n * To get that functionality, extend GridModel/GridRenderer, and add onClick/onContextMenu handlers to implement your own sort.\n *\n * Extend GridModel with your own data model to provide the data for the grid.\n * Extend GridTheme to change the appearance if the grid. See GridTheme for all the settable values.\n * Extend GridMetricCalculator to provide different metrics for the grid, such as column sizing, header sizing, etc.\n * Extend GridRenderer to have complete control over the rendering process. Can override just one method such as drawColumnHeader, or override the whole drawCanvas process.\n *\n * Add an onViewChanged callback to page in/out data as user moves around the grid\n * Can also add onClick and onContextMenu handlers to add custom functionality and menus.\n */\nclass Grid extends PureComponent<GridProps, GridState> {\n static contextType = ThemeContext;\n\n static defaultProps = {\n canvasOptions: { alpha: false } as CanvasRenderingContext2DSettings,\n isStickyBottom: false,\n isStickyRight: false,\n isStuckToBottom: false,\n isStuckToRight: false,\n keyHandlers: [] as KeyHandler[],\n mouseHandlers: [] as GridMouseHandler[],\n movedColumns: [] as MoveOperation[],\n movedRows: [] as MoveOperation[],\n onError: (): void => undefined,\n onSelectionChanged: (): void => undefined,\n onMovedColumnsChanged: (): void => undefined,\n onMoveColumnComplete: (): void => undefined,\n onMovedRowsChanged: (): void => undefined,\n onMoveRowComplete: (): void => undefined,\n onViewChanged: (): void => undefined,\n stateOverride: {} as Record<string, unknown>,\n theme: {\n autoSelectColumn: false,\n autoSelectRow: false,\n } as Partial<GridThemeType>,\n };\n\n // use same constant as chrome source for windows\n // https://github.com/chromium/chromium/blob/973af9d461b6b5dc60208c8d3d66adc27e53da78/ui/events/blink/web_input_event_builders_win.cc#L285\n static pixelsPerLine = 100 / 3;\n\n static dragTimeout = 1000;\n\n static getTheme = memoize((contextTheme, userTheme) => ({\n ...GridTheme,\n ...contextTheme,\n ...userTheme,\n }));\n\n /**\n * On some devices there may be different scaling required for high DPI. Get the scale required for the canvas.\n * @param context The canvas context\n * @returns The scale to use\n */\n static getScale(context: CanvasRenderingContext2D): number {\n const devicePixelRatio = window.devicePixelRatio || 1;\n\n // backingStorePixelRatio is deprecated, but check it just in case\n const legacyContext = context as LegacyCanvasRenderingContext2D;\n const backingStorePixelRatio =\n legacyContext.webkitBackingStorePixelRatio ||\n legacyContext.mozBackingStorePixelRatio ||\n legacyContext.msBackingStorePixelRatio ||\n legacyContext.oBackingStorePixelRatio ||\n legacyContext.backingStorePixelRatio ||\n 1;\n return devicePixelRatio / backingStorePixelRatio;\n }\n\n /**\n * Get the class name from the cursor provided\n * @param cursor The grid cursor to use\n * @returns Class name with the grid-cursor prefix or null if no cursor provided\n */\n static getCursorClassName(cursor: string | null): string | null {\n return cursor ? `grid-cursor-${cursor}` : null;\n }\n\n // Need to disable react/sort-comp so I can put the fields here\n /* eslint-disable react/sort-comp */\n renderer: GridRenderer;\n\n metricCalculator: GridMetricCalculator;\n\n canvas: HTMLCanvasElement | null;\n\n canvasContext: CanvasRenderingContext2D | null;\n\n // We draw the canvas on the next animation frame, keep track of the next one\n animationFrame: number | null;\n\n // Keep track of previous metrics and new metrics for comparison\n prevMetrics: GridMetrics | null;\n\n metrics: GridMetrics | null;\n\n // Track the cursor that is currently added to the document\n // Add to document so that when dragging the cursor stays, even if mouse leaves the canvas\n // Note: on document, not body so that cursor styling can be combined with\n // blocked pointer events that would otherwise prevent cursor styling from showing\n documentCursor: string | null;\n\n dragTimer: ReturnType<typeof setTimeout> | null;\n\n keyHandlers: KeyHandler[];\n\n mouseHandlers: GridMouseHandler[];\n\n /* eslint-enable react/sort-comp */\n\n constructor(props: GridProps) {\n super(props);\n\n this.handleClick = this.handleClick.bind(this);\n this.handleContextMenu = this.handleContextMenu.bind(this);\n this.handleEditCellCancel = this.handleEditCellCancel.bind(this);\n this.handleEditCellChange = this.handleEditCellChange.bind(this);\n this.handleEditCellCommit = this.handleEditCellCommit.bind(this);\n this.handleDoubleClick = this.handleDoubleClick.bind(this);\n this.handleKeyDown = this.handleKeyDown.bind(this);\n this.handleMouseDown = this.handleMouseDown.bind(this);\n this.handleMouseDrag = this.handleMouseDrag.bind(this);\n this.handleMouseMove = this.handleMouseMove.bind(this);\n this.handleMouseLeave = this.handleMouseLeave.bind(this);\n this.handleMouseUp = this.handleMouseUp.bind(this);\n this.handleResize = this.handleResize.bind(this);\n this.handleWheel = this.handleWheel.bind(this);\n\n const {\n isStuckToBottom,\n isStuckToRight,\n metricCalculator,\n movedColumns,\n movedRows,\n renderer,\n } = props;\n\n this.renderer = renderer || new GridRenderer();\n this.metricCalculator = metricCalculator || new GridMetricCalculator();\n\n this.canvas = null;\n this.canvasContext = null;\n this.animationFrame = null;\n\n this.prevMetrics = null;\n this.metrics = null;\n\n // Track the cursor that is currently added to the document\n // Add to document so that when dragging the cursor stays, even if mouse leaves the canvas\n // Note: on document, not body so that cursor styling can be combined with\n // blocked pointer events that would otherwise prevent cursor styling from showing\n this.documentCursor = null;\n\n this.dragTimer = null;\n\n // specify handler ordering, such that any extensions can insert handlers in between\n this.keyHandlers = [\n new EditKeyHandler(400),\n new PasteKeyHandler(450),\n new SelectionKeyHandler(500),\n new TreeKeyHandler(900),\n ];\n this.mouseHandlers = [\n new GridRowSeparatorMouseHandler(100),\n new GridColumnSeparatorMouseHandler(200),\n new GridRowMoveMouseHandler(300),\n new GridColumnMoveMouseHandler(400),\n new EditMouseHandler(450),\n new GridVerticalScrollBarMouseHandler(500),\n new GridHorizontalScrollBarMouseHandler(600),\n new GridScrollBarCornerMouseHandler(700),\n new GridRowTreeMouseHandler(800),\n new GridSelectionMouseHandler(900),\n ];\n\n this.state = {\n // Top/left visible cell in the grid. Note that it's visible row/column index, not the model index (ie. if columns are re-ordered)\n top: 0,\n left: 0,\n\n // The scroll offset of the top/left cell. 0,0 means the cell is at the top left\n // Should be less than the width of the column\n topOffset: 0,\n leftOffset: 0,\n\n // current column/row that user is dragging\n draggingColumn: null,\n draggingRow: null,\n\n // Offset when dragging a column/row\n draggingColumnOffset: null,\n draggingRowOffset: null,\n\n // When drawing header separators for resizing\n draggingColumnSeparator: null,\n draggingRowSeparator: null,\n\n isDraggingHorizontalScrollBar: false,\n isDraggingVerticalScrollBar: false,\n\n // Anything is performing a drag, for blocking hover rendering\n isDragging: false,\n\n // The coordinates of the mouse. May be outside of the canvas\n mouseX: null,\n mouseY: null,\n\n // Move operations the user has performed on this grids columns/rows\n movedColumns,\n movedRows,\n\n // Cursor (highlighted cell) location and active selected range\n cursorRow: null,\n cursorColumn: null,\n selectionStartRow: null,\n selectionStartColumn: null,\n selectionEndRow: null,\n selectionEndColumn: null,\n\n // Currently selected ranges and previously selected ranges\n // Store the previously selected ranges to determine if the new selection should\n // deselect again (if it's the same range)\n selectedRanges: [],\n lastSelectedRanges: [],\n\n // The mouse cursor style to use when hovering over the grid element\n cursor: null,\n\n // { column: number, row: number, selectionRange: [number, number], value: string | null, isQuickEdit?: boolean }\n // The cell that is currently being edited\n editingCell: null,\n\n isStuckToBottom,\n isStuckToRight,\n };\n }\n\n componentDidMount(): void {\n this.initContext();\n\n // Need to explicitly add wheel event to canvas so we can preventDefault/avoid passive listener issue\n // Otherwise React attaches listener at doc level and you can't prevent default\n // https://github.com/facebook/react/issues/14856\n this.canvas?.addEventListener('wheel', this.handleWheel, {\n passive: false,\n });\n window.addEventListener('resize', this.handleResize);\n\n this.updateCanvasScale();\n this.updateCanvas();\n }\n\n componentDidUpdate(prevProps: GridProps, prevState: GridState): void {\n const {\n isStickyBottom,\n isStickyRight,\n movedColumns,\n movedRows,\n onMovedColumnsChanged,\n onMoveColumnComplete,\n onMovedRowsChanged,\n onMoveRowComplete,\n } = this.props;\n const {\n isStickyBottom: prevIsStickyBottom,\n isStickyRight: prevIsStickyRight,\n movedColumns: prevPropMovedColumns,\n movedRows: prevPropMovedRows,\n } = prevProps;\n const {\n movedColumns: prevStateMovedColumns,\n movedRows: prevStateMovedRows,\n } = prevState;\n const {\n draggingColumn,\n draggingRow,\n movedColumns: currentStateMovedColumns,\n movedRows: currentStateMovedRows,\n } = this.state;\n\n if (prevPropMovedColumns !== movedColumns) {\n this.setState({ movedColumns });\n }\n\n if (prevPropMovedRows !== movedRows) {\n this.setState({ movedRows });\n }\n\n if (prevStateMovedColumns !== currentStateMovedColumns) {\n onMovedColumnsChanged(currentStateMovedColumns);\n }\n\n if (prevState.draggingColumn != null && draggingColumn == null) {\n onMoveColumnComplete(currentStateMovedColumns);\n }\n\n if (prevStateMovedRows !== currentStateMovedRows) {\n onMovedRowsChanged(currentStateMovedRows);\n }\n\n if (prevState.draggingRow != null && draggingRow == null) {\n onMoveRowComplete(currentStateMovedRows);\n }\n\n if (isStickyBottom !== prevIsStickyBottom) {\n this.setState({ isStuckToBottom: false });\n }\n\n if (isStickyRight !== prevIsStickyRight) {\n this.setState({ isStuckToRight: false });\n }\n\n this.updateMetrics();\n\n this.requestUpdateCanvas();\n\n if (!this.metrics || !this.prevMetrics) {\n return;\n }\n\n const {\n bottomVisible,\n rightVisible,\n rowCount,\n columnCount,\n top,\n left,\n height,\n width,\n } = this.metrics;\n const {\n rowCount: prevRowCount,\n columnCount: prevColumnCount,\n height: prevHeight,\n width: prevWidth,\n } = this.prevMetrics;\n const metricState = this.getMetricState();\n\n if (prevRowCount !== rowCount || height !== prevHeight) {\n const lastTop = this.metricCalculator.getLastTop(metricState);\n const { isStuckToBottom } = this.state;\n if (\n (isStuckToBottom &&\n bottomVisible < rowCount - 1 &&\n bottomVisible > 0) ||\n top > lastTop\n ) {\n this.setState({ top: lastTop });\n }\n }\n\n if (prevColumnCount !== columnCount || width !== prevWidth) {\n const lastLeft = this.metricCalculator.getLastLeft(metricState);\n const { isStuckToRight } = this.state;\n if (\n (isStuckToRight &&\n rightVisible < columnCount - 1 &&\n rightVisible > 0) ||\n left > lastLeft\n ) {\n this.setState({ left: lastLeft });\n }\n }\n\n if (this.validateSelection()) {\n this.checkSelectionChange(prevState);\n }\n }\n\n componentWillUnmount(): void {\n if (this.animationFrame != null) {\n cancelAnimationFrame(this.animationFrame);\n }\n\n this.canvas?.removeEventListener('wheel', this.handleWheel);\n\n window.removeEventListener(\n 'mousemove',\n (this.handleMouseDrag as unknown) as EventListenerOrEventListenerObject,\n true\n );\n window.removeEventListener(\n 'mouseup',\n (this.handleMouseUp as unknown) as EventListenerOrEventListenerObject,\n true\n );\n window.removeEventListener('resize', this.handleResize);\n\n this.stopDragTimer();\n }\n\n getTheme(): GridThemeType {\n const { theme } = this.props;\n return Grid.getTheme(this.context, theme);\n }\n\n getGridPointFromEvent(event: GridMouseEvent): GridPoint {\n assertIsDefined(this.canvas);\n\n const rect = this.canvas.getBoundingClientRect();\n const x = event.clientX - rect.left;\n const y = event.clientY - rect.top;\n return this.getGridPointFromXY(x, y);\n }\n\n getGridPointFromXY(x: Coordinate, y: Coordinate): GridPoint {\n if (!this.metrics) throw new Error('metrics must be set');\n\n return GridUtils.getGridPointFromXY(x, y, this.metrics);\n }\n\n getMetricState(state = this.state): GridMetricState {\n const theme = this.getTheme();\n const { model, stateOverride } = this.props;\n if (!this.canvasContext || !this.canvas) {\n throw new Error('Canvas and context must be defined to get metrics');\n }\n const context = this.canvasContext;\n const width = this.canvas.clientWidth;\n const height = this.canvas.clientHeight;\n const {\n left,\n top,\n leftOffset,\n topOffset,\n movedColumns,\n movedRows,\n isDraggingHorizontalScrollBar,\n isDraggingVerticalScrollBar,\n } = state;\n\n return {\n left,\n top,\n leftOffset,\n topOffset,\n width,\n height,\n context,\n theme,\n model,\n movedColumns,\n movedRows,\n isDraggingHorizontalScrollBar,\n isDraggingVerticalScrollBar,\n ...stateOverride,\n };\n }\n\n getCachedKeyHandlers = memoize((keyHandlers: KeyHandler[]) =>\n [...keyHandlers, ...this.keyHandlers].sort((a, b) => a.order - b.order)\n );\n\n getKeyHandlers(): KeyHandler[] {\n const { keyHandlers } = this.props;\n return this.getCachedKeyHandlers(keyHandlers);\n }\n\n getCachedMouseHandlers = memoize((mouseHandlers: GridMouseHandler[]) =>\n [...mouseHandlers, ...this.mouseHandlers].sort((a, b) => a.order - b.order)\n );\n\n getMouseHandlers(): GridMouseHandler[] {\n const { mouseHandlers } = this.props;\n return this.getCachedMouseHandlers(mouseHandlers);\n }\n\n /**\n * Translate from the provided visible index to the model index\n * @param columnIndex The column index to get the model for\n * @returns The model index\n */\n getModelColumn(columnIndex: VisibleIndex): ModelIndex {\n const modelIndex = this.metrics?.modelColumns?.get(columnIndex);\n if (modelIndex === undefined) {\n throw new Error(`Unable to get ModelIndex for column ${columnIndex}`);\n }\n return modelIndex;\n }\n\n /**\n * Translate from the provided visible index to the model index\n * @param rowIndex The row index to get the model for\n * @returns The model index\n */\n getModelRow(rowIndex: VisibleIndex): ModelIndex {\n const modelIndex = this.metrics?.modelRows?.get(rowIndex);\n if (modelIndex === undefined) {\n throw new Error(`Unable to get ModelIndex for row ${rowIndex}`);\n }\n return modelIndex;\n }\n\n /**\n * Toggle a row between expanded and collapsed states\n * @param row The row to toggle expansion for\n */\n toggleRowExpanded(row: VisibleIndex): void {\n const modelRow = this.getModelRow(row);\n const { model } = this.props;\n // We only want to set expansion if the row is expandable\n // If it's not, still move the cursor to that position, as it may be outside of the current viewport and we don't know if it's expandable yet\n if (isExpandableGridModel(model) && model.isRowExpandable(modelRow)) {\n model.setRowExpanded(modelRow, !model.isRowExpanded(modelRow));\n }\n this.clearSelectedRanges();\n this.commitSelection(); // Need to commit before moving in case we're selecting same row again\n this.moveCursorToPosition(0, row);\n this.commitSelection();\n\n this.setState({ isStuckToBottom: false });\n }\n\n /**\n * Allows the selected ranges to be set programatically\n * Will update the cursor and selection start/end based on the new ranges\n * @param gridRanges The new selected ranges to set\n */\n setSelectedRanges(gridRanges: GridRange[]): void {\n const { model } = this.props;\n const { columnCount, rowCount } = model;\n const { cursorRow, cursorColumn, selectedRanges } = this.state;\n this.setState({\n selectedRanges: gridRanges,\n lastSelectedRanges: selectedRanges,\n });\n if (gridRanges.length > 0) {\n const range = GridRange.boundedRange(\n gridRanges[0],\n columnCount,\n rowCount\n );\n let newCursorRow = cursorRow;\n let newCursorColumn = cursorColumn;\n if (!range.containsCell(cursorColumn, cursorRow)) {\n ({ row: newCursorRow, column: newCursorColumn } = range.startCell());\n }\n\n this.setState({\n selectionStartColumn: range.startColumn,\n selectionStartRow: range.startRow,\n selectionEndColumn: range.endColumn,\n selectionEndRow: range.endRow,\n cursorColumn: newCursorColumn,\n cursorRow: newCursorRow,\n });\n }\n }\n\n initContext(): void {\n const { canvas } = this;\n const { canvasOptions } = this.props;\n\n if (!canvas) throw new Error('Canvas not set');\n\n this.canvasContext = canvas.getContext('2d', canvasOptions);\n }\n\n requestUpdateCanvas(): void {\n if (this.animationFrame != null) {\n return;\n }\n\n this.animationFrame = requestAnimationFrame(() => {\n this.animationFrame = null;\n\n if (!this.metrics) throw new Error('Metrics not set');\n\n this.updateCanvas(this.metrics);\n });\n }\n\n updateCanvas(metrics = this.updateMetrics()): void {\n this.updateCanvasScale();\n\n const { onViewChanged } = this.props;\n onViewChanged(metrics);\n\n this.drawCanvas(metrics);\n }\n\n updateCanvasScale(): void {\n const { canvas, canvasContext } = this;\n if (!canvas) throw new Error('canvas not set');\n if (!canvasContext) throw new Error('canvasContext not set');\n if (!canvas.parentElement) throw new Error('Canvas has no parent element');\n\n const scale = Grid.getScale(canvasContext);\n // the parent wrapper has 100% width/height, and is used for determining size\n // we don't want to stretch the canvas to 100%, to avoid fractional pixels.\n // A wrapper element must be used for sizing, and canvas size must be\n // set manually to a floored value in css and a scaled value in width/height\n const rect = canvas.parentElement.getBoundingClientRect();\n const width = Math.floor(rect.width);\n const height = Math.floor(rect.height);\n canvas.style.width = `${width}px`;\n canvas.style.height = `${height}px`;\n canvas.width = width * scale;\n canvas.height = height * scale;\n canvasContext.scale(scale, scale);\n }\n\n updateMetrics(state = this.state): GridMetrics {\n this.prevMetrics = this.metrics;\n\n const { metricCalculator } = this;\n const metricState = this.getMetricState(state);\n this.metrics = metricCalculator.getMetrics(metricState);\n\n return this.metrics;\n }\n\n /**\n * Check if the selection state has changed, and call the onSelectionChanged callback if they have\n * @param prevState The previous grid state\n */\n checkSelectionChange(prevState: GridState): void {\n const { selectedRanges: oldSelectedRanges } = prevState;\n const { selectedRanges } = this.state;\n\n if (selectedRanges !== oldSelectedRanges) {\n const { onSelectionChanged } = this.props;\n onSelectionChanged(selectedRanges);\n }\n }\n\n /**\n * Validate the current selection, and reset if it is invalid\n * @returns True if the selection is valid, false if the selection was invalid and has been reset\n */\n validateSelection(): boolean {\n const { model } = this.props;\n const { selectedRanges } = this.state;\n const { columnCount, rowCount } = model;\n\n for (let i = 0; i < selectedRanges.length; i += 1) {\n const range = selectedRanges[i];\n if (\n (range.endColumn != null && range.endColumn >= columnCount) ||\n (range.endRow != null && range.endRow >= rowCount)\n ) {\n // Just clear the selection rather than trying to trim it.\n this.setState({ selectedRanges: [], lastSelectedRanges: [] });\n return false;\n }\n }\n return true;\n }\n\n /**\n * Clears all selected ranges\n */\n clearSelectedRanges(): void {\n const { selectedRanges } = this.state;\n this.setState({ selectedRanges: [], lastSelectedRanges: selectedRanges });\n }\n\n /** Clears all but the last selected range */\n trimSelectedRanges(): void {\n const { selectedRanges } = this.state;\n if (selectedRanges.length > 0) {\n this.setState({\n selectedRanges: selectedRanges.slice(selectedRanges.length - 1),\n });\n }\n }\n\n /**\n * Begin a selection operation at the provided location\n * @param column Column where the selection is beginning\n * @param row Row where the selection is beginning\n */\n beginSelection(column: GridRangeIndex, row: GridRangeIndex): void {\n this.setState({\n selectionStartColumn: column,\n selectionStartRow: row,\n selectionEndColumn: column,\n selectionEndRow: row,\n cursorColumn: column,\n cursorRow: row,\n });\n }\n\n /**\n * Moves the selection to the cell specified\n * @param column The column index to move the cursor to\n * @param row The row index to move the cursor to\n * @param extendSelection Whether to extend the current selection (eg. holding Shift)\n * @param maximizePreviousRange When true, maximize/add to the previous range only, ignoring where the selection was started.\n */\n moveSelection(\n column: GridRangeIndex,\n row: GridRangeIndex,\n extendSelection = false,\n maximizePreviousRange = false\n ): void {\n this.setState(state => {\n const { selectedRanges, selectionStartRow, selectionStartColumn } = state;\n const { theme } = this.props;\n const { autoSelectRow, autoSelectColumn } = theme;\n\n if (extendSelection && selectedRanges.length > 0) {\n const lastSelectedRange = selectedRanges[selectedRanges.length - 1];\n let left = null;\n let top = null;\n let right = null;\n let bottom = null;\n if (maximizePreviousRange) {\n left = autoSelectRow\n ? null\n : Math.min(column ?? 0, lastSelectedRange.startColumn ?? 0);\n top = autoSelectColumn\n ? null\n : Math.min(row ?? 0, lastSelectedRange.startRow ?? 0);\n right = autoSelectRow\n ? null\n : Math.max(column ?? 0, lastSelectedRange.endColumn ?? 0);\n bottom = autoSelectColumn\n ? null\n : Math.max(row ?? 0, lastSelectedRange.endRow ?? 0);\n } else {\n left = lastSelectedRange.startColumn;\n top = lastSelectedRange.startRow;\n\n if (selectionStartColumn != null || selectionStartRow != null) {\n if (!autoSelectRow) {\n left = selectionStartColumn;\n }\n if (!autoSelectColumn) {\n top = selectionStartRow;\n }\n }\n right = autoSelectRow ? null : column;\n bottom = autoSelectColumn ? null : row;\n }\n const selectedRange = GridRange.makeNormalized(\n left,\n top,\n right,\n bottom\n );\n\n if (lastSelectedRange.equals(selectedRange)) {\n return null;\n }\n\n const newRanges = [...selectedRanges];\n newRanges[newRanges.length - 1] = selectedRange;\n return {\n selectedRanges: newRanges,\n selectionEndColumn: column,\n selectionEndRow: row,\n };\n }\n const newRanges = [...selectedRanges];\n const selectedColumn = autoSelectRow ? null : column;\n const selectedRow = autoSelectColumn ? null : row;\n newRanges.push(\n GridRange.makeNormalized(\n selectedColumn,\n selectedRow,\n selectedColumn,\n selectedRow\n )\n );\n return {\n selectedRanges: newRanges,\n selectionEndColumn: column,\n selectionEndRow: row,\n };\n });\n }\n\n /**\n * Commits the last selected range to the selected ranges.\n * First checks if the last range is completely contained within another range, and if it\n * is then it blows those ranges apart.\n * Then it consolidates all the selected ranges, reducing them.\n */\n commitSelection(): void {\n this.setState((state: GridState) => {\n const { theme } = this.props;\n const { autoSelectRow } = theme;\n const {\n selectedRanges,\n lastSelectedRanges,\n cursorRow,\n cursorColumn,\n } = state;\n\n if (\n selectedRanges.length === 1 &&\n (autoSelectRow\n ? GridRange.rowCount(selectedRanges) === 1\n : GridRange.cellCount(selectedRanges) === 1) &&\n GridRange.rangeArraysEqual(selectedRanges, lastSelectedRanges)\n ) {\n // If it's the exact same single selection, then deselect.\n // For if we click on one cell multiple times.\n return {\n selectedRanges: [],\n lastSelectedRanges: [],\n cursorColumn,\n cursorRow,\n };\n }\n\n let newSelectedRanges = selectedRanges.slice();\n if (newSelectedRanges.length > 1) {\n // Check if the latest selection is entirely within a previously selected range\n // If that's the case, then deselect that section instead\n const lastRange = newSelectedRanges[newSelectedRanges.length - 1];\n for (let i = 0; i < newSelectedRanges.length - 1; i += 1) {\n const selectedRange = newSelectedRanges[i];\n if (selectedRange.contains(lastRange)) {\n // We found a match, now remove the two matching ranges, and add back\n // the remainder of the two\n const remainder = selectedRange.subtract(lastRange);\n newSelectedRanges.pop();\n newSelectedRanges.splice(i, 1);\n newSelectedRanges = newSelectedRanges.concat(remainder);\n break;\n }\n }\n\n newSelectedRanges = GridRange.consolidate(newSelectedRanges);\n }\n\n let newCursorColumn = cursorColumn;\n let newCursorRow = cursorRow;\n if (!GridRange.containsCell(newSelectedRanges, cursorColumn, cursorRow)) {\n const { model } = this.props;\n const { columnCount, rowCount } = model;\n const nextCursor = GridRange.nextCell(\n GridRange.boundedRanges(selectedRanges, columnCount, rowCount)\n );\n if (nextCursor != null) {\n ({ column: newCursorColumn, row: newCursorRow } = nextCursor);\n } else {\n newCursorColumn = null;\n newCursorRow = null;\n }\n }\n return {\n cursorRow: newCursorRow,\n cursorColumn: newCursorColumn,\n selectedRanges: newSelectedRanges,\n lastSelectedRanges: selectedRanges,\n };\n });\n }\n\n /**\n * Set the selection to the entire grid\n */\n selectAll(): void {\n const { model, theme } = this.props;\n const { autoSelectRow, autoSelectColumn } = theme;\n\n const top = autoSelectColumn ? null : 0;\n const bottom = autoSelectColumn ? null : model.rowCount - 1;\n const left = autoSelectRow ? null : 0;\n const right = autoSelectRow ? null : model.columnCount - 1;\n this.setSelectedRanges([new GridRange(left, top, right, bottom)]);\n }\n\n /**\n * Move the cursor in relation to the current cursor position\n * @param deltaColumn Number of columns to move the cursor\n * @param deltaRow Number of rows to move the cursor\n * @param extendSelection True if the current selection should be extended, false to start a new selection\n */\n moveCursor(\n deltaColumn: number,\n deltaRow: number,\n extendSelection: boolean\n ): void {\n const {\n cursorRow,\n cursorColumn,\n selectionEndColumn,\n selectionEndRow,\n } = this.state;\n const column = extendSelection ? selectionEndColumn : cursorColumn;\n const row = extendSelection ? selectionEndRow : cursorRow;\n if (row === null || column === null) {\n const { left, top } = this.state;\n this.moveCursorToPosition(left, top, extendSelection);\n } else {\n const { model } = this.props;\n const { columnCount, rowCount } = model;\n\n const left = clamp(column + deltaColumn, 0, columnCount - 1);\n const top = clamp(row + deltaRow, 0, rowCount - 1);\n this.moveCursorToPosition(left, top, extendSelection);\n }\n }\n\n /**\n * Move the cursor in the provided selection direction\n * @param direction The direction to move the cursor in\n */\n moveCursorInDirection(direction = GridRange.SELECTION_DIRECTION.DOWN): void {\n const { model } = this.props;\n const { columnCount, rowCount } = model;\n const { cursorRow, cursorColumn, selectedRanges } = this.state;\n const ranges =\n selectedRanges.length > 0\n ? selectedRanges\n : [GridRange.makeCell(cursorColumn, cursorRow)];\n let nextCursor = null;\n if (ranges.length === 1 && GridRange.cellCount(ranges) === 1) {\n // If we only have one cell selected, we want to update the cursor and we want to update the selected cells\n const gridRange = new GridRange(0, 0, columnCount - 1, rowCount - 1);\n nextCursor =\n gridRange.nextCell(cursorColumn, cursorRow, direction) ??\n gridRange.startCell(direction);\n } else {\n nextCursor = GridRange.nextCell(\n GridRange.boundedRanges(ranges, columnCount, rowCount),\n cursorColumn,\n cursorRow,\n direction\n );\n }\n\n if (nextCursor != null) {\n const { column, row } = nextCursor;\n this.setState({\n cursorColumn: column,\n cursorRow: row,\n });\n\n if (!GridRange.containsCell(selectedRanges, column, row)) {\n this.setState({\n selectedRanges: [GridRange.makeCell(column, row)],\n selectionStartColumn: column,\n selectionStartRow: row,\n selectionEndColumn: column,\n selectionEndRow: row,\n });\n }\n\n this.moveViewToCell(nextCursor.column, nextCursor.row);\n }\n }\n\n /**\n * Move a cursor to the specified position in the grid.\n * @param column The column index to move the cursor to\n * @param row The row index to move the cursor to\n * @param extendSelection Whether to extend the current selection (eg. holding Shift)\n * @param keepCursorInView Whether to move the viewport so that the cursor is in view\n * @param maximizePreviousRange With this and `extendSelection` true, it will maximize/add to the previous range only, ignoring where the selection was started\n */\n moveCursorToPosition(\n column: GridRangeIndex,\n row: GridRangeIndex,\n extendSelection = false,\n keepCursorInView = true,\n maximizePreviousRange = false\n ): void {\n if (!extendSelection) {\n this.beginSelection(column, row);\n }\n\n this.moveSelection(column, row, extendSelection, maximizePreviousRange);\n\n if (keepCursorInView) {\n this.moveViewToCell(column, row);\n }\n }\n\n /**\n * Moves the view to make the specified cell visible\n *\n * @param column The column index to bring into view\n * @param row The row index to bring into view\n */\n moveViewToCell(column: GridRangeIndex, row: GridRangeIndex): void {\n if (!this.metrics) throw new Error('metrics not set');\n\n const { metricCalculator } = this;\n const {\n bottomVisible,\n rightVisible,\n topVisible,\n leftVisible,\n } = this.metrics;\n const metricState = this.getMetricState(this.state);\n let { top, left, topOffset, leftOffset } = this.state;\n\n if (row != null && !GridUtils.isFloatingRow(row, this.metrics)) {\n if (row < topVisible) {\n top = metricCalculator.getTopForTopVisible(metricState, row);\n topOffset = 0;\n } else if (row > bottomVisible) {\n top = metricCalculator.getTopForBottomVisible(metricState, row);\n topOffset = 0;\n }\n }\n\n if (column != null && !GridUtils.isFloatingColumn(column, this.metrics)) {\n if (column < leftVisible) {\n left = metricCalculator.getLeftForLeftVisible(metricState, column);\n leftOffset = 0;\n } else if (column > rightVisible) {\n left = metricCalculator.getLeftForRightVisible(metricState, column);\n leftOffset = 0;\n }\n }\n\n this.setViewState({ top, left, topOffset, leftOffset });\n }\n\n /**\n * Checks the `top` and `left` properties that are set and updates the isStuckToBottom/Right properties\n * Should be called when user interaction occurs\n * @param viewState New state properties to set.\n * @param forceUpdate Whether to force an update.\n */\n setViewState(viewState: Partial<GridState>, forceUpdate = false): void {\n if (!this.metrics) throw new Error('metrics not set');\n\n const { isStickyBottom, isStickyRight } = this.props;\n const { top, left } = viewState;\n const { lastTop, lastLeft } = this.metrics;\n if (top != null) {\n this.setState({ isStuckToBottom: isStickyBottom && top >= lastTop });\n }\n if (left != null) {\n this.setState({ isStuckToRight: isStickyRight && left >= lastLeft });\n }\n\n this.setState(viewState as GridState);\n if (forceUpdate) {\n this.forceUpdate();\n }\n }\n\n /**\n * Start editing the data at the given index\n *\n * @param column The visible column index to start editing\n * @param row The visible row index to start editing\n * @param isQuickEdit If this is a quick edit (the arrow keys can commit)\n * @param selectionRange The tuple [start,end] text selection range of the value to select when editing\n * @param value The value to start with in the edit field. Leave undefined to use the current value.\n */\n startEditing(\n column: VisibleIndex,\n row: VisibleIndex,\n isQuickEdit = false,\n selectionRange?: EditingCellTextSelectionRange,\n value?: string\n ): void {\n const { model } = this.props;\n if (!isEditableGridModel(model)) throw new Error('model is not editable');\n\n const modelColumn = this.getModelColumn(column);\n const modelRow = this.getModelRow(row);\n const cell = {\n column,\n row,\n selectionRange,\n value:\n value !== undefined\n ? value\n : model.editValueForCell(modelColumn, modelRow),\n isQuickEdit,\n };\n\n this.setState({ editingCell: cell, cursorColumn: column, cursorRow: row });\n this.moveViewToCell(column, row);\n }\n\n /**\n * Check if a value is valid for a specific cell\n * @param column Column index of the cell to check\n * @param row Row index of the cell to check\n * @param value Value to check\n * @returns True if the value is valid for the provided cell, false otherwise\n */\n isValidForCell(\n column: VisibleIndex,\n row: VisibleIndex,\n value: string\n ): boolean {\n const { model } = this.props;\n\n const modelColumn = this.getModelColumn(column);\n const modelRow = this.getModelRow(row);\n return (\n isEditableGridModel(model) &&\n model.isValidForCell(modelColumn, modelRow, value)\n );\n }\n\n /**\n * Paste a value with the current selection\n * It first needs to validate that the pasted table is valid for the given selection.\n * Also may update selection if single cells are selected and a table is pasted.\n * @param value Table or a string that is being pasted\n */\n async pasteValue(value: string[][] | string): Promise<void> {\n const { model } = this.props;\n const { movedColumns, movedRows, selectedRanges } = this.state;\n\n try {\n assertIsEditableGridModel(model);\n\n if (\n !model.isEditable ||\n !selectedRanges.every(range => model.isEditableRange(range))\n ) {\n throw new PasteError(\"Can't paste in to read-only area.\");\n }\n\n if (selectedRanges.length <= 0) {\n throw new PasteError('Select an area to paste to.');\n }\n\n if (typeof value === 'string') {\n // Just paste the value into all the selected cells\n const edits: EditOperation[] = [];\n\n const modelRanges = GridUtils.getModelRanges(\n selectedRanges,\n movedColumns,\n movedRows\n );\n GridRange.forEachCell(modelRanges, (column, row) => {\n edits.push({ column, row, text: value });\n });\n await model.setValues(edits);\n return;\n }\n\n // Otherwise it's a table of data\n const tableHeight = value.length;\n const tableWidth = value[0].length;\n const { columnCount, rowCount } = model;\n let ranges = selectedRanges;\n // If each cell is a single selection, we need to update the selection to map to the newly pasted data\n // Check for\n if (\n ranges.every(\n range =>\n GridRange.cellCount([range]) === 1 &&\n (range.startColumn ?? 0) + tableWidth <= columnCount &&\n (range.startRow ?? 0) + tableHeight <= rowCount\n )\n ) {\n // Remap the selected ranges\n ranges = ranges.map(\n range =>\n new GridRange(\n range.startColumn,\n range.startRow,\n (range.startColumn ?? 0) + tableWidth - 1,\n (range.startRow ?? 0) + tableHeight - 1\n )\n );\n this.setSelectedRanges(ranges);\n }\n\n const edits: EditOperation[] = [];\n ranges.forEach(range => {\n for (let x = 0; x < tableWidth; x += 1) {\n for (let y = 0; y < tableHeight; y += 1) {\n edits.push({\n column: (range.startColumn ?? 0) + x,\n row: (range.startRow ?? 0) + y,\n text: value[y][x],\n });\n }\n }\n });\n await model.setValues(edits);\n } catch (e) {\n const { onError } = this.props;\n onError(e instanceof Error ? e : new Error(`${e}`));\n }\n }\n\n /**\n * Set a value to a specific cell. If the value is not valid for that cell, do not set it\n * @param column Column index to set the value for\n * @param row Row index to set the value for\n * @param value Value to set at that cell\n * @returns true If the value was valid and attempted to be set, false is it was not valid\n */\n setValueForCell(\n column: VisibleIndex,\n row: VisibleIndex,\n value: string\n ): boolean {\n const { model } = this.props;\n assertIsEditableGridModel(model);\n\n const modelColumn = this.getModelColumn(column);\n const modelRow = this.getModelRow(row);\n if (model.isValidForCell(modelColumn, modelRow, value)) {\n model.setValueForCell(modelColumn, modelRow, value);\n return true;\n }\n return false;\n }\n\n /**\n * Set a value on all the ranges provided\n * @param ranges Ranges to set\n * @param value The value to set on all the ranges\n */\n setValueForRanges(ranges: GridRange[], value: string): void {\n const { model } = this.props;\n const { movedColumns, movedRows } = this.state;\n\n const modelRanges = GridUtils.getModelRanges(\n ranges,\n movedColumns,\n movedRows\n );\n if (isEditableGridModel(model)) {\n model.setValueForRanges(modelRanges, value);\n }\n }\n\n /**\n * Check if a given cell is within the current selection\n * @param row Row to check\n * @param column Column to check\n * @returns True if the cell is in the current selection, false otherwise\n */\n isSelected(row: VisibleIndex, column: VisibleIndex): boolean {\n const { selectedRanges } = this.state;\n\n for (let i = 0; i < selectedRanges.length; i += 1) {\n const selectedRange = selectedRanges[i];\n const rowSelected =\n selectedRange.startRow === null ||\n (selectedRange.startRow <= row && row <= (selectedRange.endRow ?? 0));\n const columnSelected =\n selectedRange.startColumn === null ||\n (selectedRange.startColumn <= column &&\n column <= (selectedRange.endColumn ?? 0));\n if (rowSelected && columnSelected) {\n return true;\n }\n }\n\n return false;\n }\n\n addDocumentCursor(cursor: string | null = null): void {\n if (this.documentCursor === Grid.getCursorClassName(cursor)) return;\n if (this.documentCursor) {\n document.documentElement.classList.remove(this.documentCursor);\n }\n this.documentCursor = Grid.getCursorClassName(cursor);\n if (this.documentCursor) {\n document.documentElement.classList.add(this.documentCursor);\n }\n document.documentElement.classList.add('grid-block-events');\n }\n\n removeDocumentCursor(): void {\n if (this.documentCursor) {\n document.documentElement.classList.remove(this.documentCursor);\n document.documentElement.classList.remove('grid-block-events');\n this.documentCursor = null;\n }\n }\n\n startDragTimer(event: React.MouseEvent): void {\n this.stopDragTimer();\n\n const mouseEvent = new MouseEvent('custom', event.nativeEvent);\n\n this.dragTimer = setTimeout(() => {\n this.handleMouseDrag(mouseEvent);\n }, Grid.dragTimeout);\n }\n\n stopDragTimer(): void {\n if (this.dragTimer) {\n clearTimeout(this.dragTimer);\n this.dragTimer = null;\n }\n }\n\n /**\n * Draw the grid with the metrics provided\n * When scrolling you've have to re-draw the whole canvas. As a consequence, all these drawing methods\n * must be very quick.\n * @param metrics Metrics to use for rendering the grid\n */\n drawCanvas(metrics = this.updateMetrics()): void {\n if (!this.canvas) throw new Error('canvas is not set');\n if (!this.canvasContext) throw new Error('context not set');\n\n const {\n left,\n top,\n cursorColumn,\n cursorRow,\n draggingColumn,\n draggingColumnOffset,\n draggingColumnSeparator,\n draggingRow,\n draggingRowOffset,\n draggingRowSeparator,\n editingCell,\n isDraggingHorizontalScrollBar,\n isDraggingVerticalScrollBar,\n isDragging,\n mouseX,\n mouseY,\n selectedRanges,\n } = this.state;\n const { model, stateOverride } = this.props;\n const { renderer } = this;\n const context = this.canvasContext;\n const theme = this.getTheme();\n const width = this.canvas.clientWidth;\n const height = this.canvas.clientHeight;\n const renderState = {\n left,\n top,\n width,\n height,\n context,\n theme,\n model,\n metrics,\n mouseX,\n mouseY,\n selectedRanges,\n draggingColumn,\n draggingColumnOffset,\n draggingColumnSeparator,\n draggingRow,\n draggingRowOffset,\n draggingRowSeparator,\n editingCell,\n isDraggingHorizontalScrollBar,\n isDraggingVerticalScrollBar,\n isDragging,\n cursorColumn,\n cursorRow,\n ...stateOverride,\n };\n\n context.save();\n\n renderer.drawCanvas(renderState);\n\n context.restore();\n }\n\n /**\n * Set focus to this grid element\n */\n focus(): void {\n this.canvas?.focus();\n }\n\n /**\n * Check if this grid is currently focused\n * @returns True if the active element is this grid\n */\n isFocused(): boolean {\n return document.activeElement === this.canvas;\n }\n\n /**\n * Handle a mouse click event. Pass the event to the registered mouse handlers until one handles it.\n * Focuses the grid after the click.\n * @param event The mouse event\n */\n handleClick(event: React.MouseEvent): void {\n const gridPoint = this.getGridPointFromEvent(event);\n\n const mouseHandlers = this.getMouseHandlers();\n for (let i = 0; i < mouseHandlers.length; i += 1) {\n const mouseHandler = mouseHandlers[i];\n if (mouseHandler.onClick(gridPoint, this, event)) {\n event.stopPropagation();\n event.preventDefault();\n break;\n }\n }\n\n this.canvas?.focus();\n }\n\n /**\n * Handle a mouse context menu event. Pass the event to the registered mouse handlers until one handles it.\n * @param event The mouse event triggering the context menu\n */\n handleContextMenu(event: React.MouseEvent): void {\n const gridPoint = this.getGridPointFromEvent(event);\n\n const mouseHandlers = this.getMouseHandlers();\n for (let i = 0; i < mouseHandlers.length; i += 1) {\n const mouseHandler = mouseHandlers[i];\n if (mouseHandler.onContextMenu(gridPoint, this, event)) {\n event.stopPropagation();\n event.preventDefault();\n break;\n }\n }\n }\n\n /**\n * Handle a key down event from the keyboard. Pass the event to the registered keyboard handlers until one handles it.\n * @param event Keyboard event\n */\n handleKeyDown(event: GridKeyboardEvent): void {\n const keyHandlers = this.getKeyHandlers();\n for (let i = 0; i < keyHandlers.length; i += 1) {\n const keyHandler = keyHandlers[i];\n const result = keyHandler.onDown(event, this);\n if (result) {\n const options = result as EventHandlerResultOptions;\n if (options?.stopPropagation ?? true) event.stopPropagation();\n if (options?.preventDefault ?? true) event.preventDefault();\n break;\n }\n }\n }\n\n /**\n * Notify all of the mouse handlers for this grid of a mouse event.\n * @param functionName The name of the function in the mouse handler to call\n * @param event The mouse event to notify\n * @param updateCoordinates Whether to update the mouse coordinates\n * @param addCursorToDocument Whether to add a cursor overlay or not (for dragging)\n */\n notifyMouseHandlers(\n functionName: GridMouseHandlerFunctionName,\n event: GridMouseEvent,\n updateCoordinates = true,\n addCursorToDocument = false\n ): void {\n const gridPoint = this.getGridPointFromEvent(event);\n const mouseHandlers = this.getMouseHandlers();\n let cursor = null;\n for (let i = 0; i < mouseHandlers.length; i += 1) {\n const mouseHandler = mouseHandlers[i];\n const result =\n mouseHandler[functionName] &&\n mouseHandler[functionName](gridPoint, this, event);\n if (result) {\n if (mouseHandler.cursor != null) {\n ({ cursor } = mouseHandler);\n if (addCursorToDocument) {\n this.addDocumentCursor(cursor);\n }\n }\n\n // result is bool or object, events are stopped by default\n const options = result as EventHandlerResultOptions;\n if (options?.stopPropagation ?? true) event.stopPropagation();\n if (options?.preventDefault ?? true) event.preventDefault();\n break;\n }\n }\n\n this.setState({ cursor });\n\n if (updateCoordinates) {\n const { x, y } = gridPoint;\n this.setState({ mouseX: x, mouseY: y });\n }\n }\n\n handleMouseDown(event: React.MouseEvent): void {\n window.addEventListener('mousemove', this.handleMouseDrag, true);\n window.addEventListener('mouseup', this.handleMouseUp, true);\n\n if (event.button != null && event.button !== 0) {\n return;\n }\n\n this.notifyMouseHandlers('onDown', event);\n\n this.startDragTimer(event);\n }\n\n handleDoubleClick(event: React.MouseEvent): void {\n this.notifyMouseHandlers('onDoubleClick', event);\n }\n\n handleMouseMove(event: React.MouseEvent): void {\n this.notifyMouseHandlers('onMove', event);\n }\n\n handleMouseLeave(event: React.MouseEvent): void {\n this.notifyMouseHandlers('onLeave', event, false);\n this.setState({ mouseX: null, mouseY: null });\n }\n\n handleMouseDrag(event: MouseEvent): void {\n this.setState({ isDragging: true });\n this.notifyMouseHandlers('onDrag', event, true, true);\n\n this.stopDragTimer();\n }\n\n handleMouseUp(event: MouseEvent): void {\n window.removeEventListener('mousemove', this.handleMouseDrag, true);\n window.removeEventListener('mouseup', this.handleMouseUp, true);\n\n if (event.button != null && event.button !== 0) {\n return;\n }\n\n this.notifyMouseHandlers('onUp', event, false);\n\n this.stopDragTimer();\n\n this.removeDocumentCursor();\n }\n\n handleResize(): void {\n /**\n * We need to always redraw the canvas in the same frame as the updateCanvasScale\n * because it clears the canvas by nature of direct dom manipulation. However,\n * We also need to verify the state/metrics, which we currently have no way\n * of doing outside of a full componentDidUpdate() call, so we force the update.\n * Ideally, we could verify state/metrics without the forced update.\n */\n this.updateCanvasScale();\n this.updateCanvas();\n this.forceUpdate();\n }\n\n handleWheel(event: WheelEvent): void {\n this.notifyMouseHandlers('onWheel', event);\n\n if (event.defaultPrevented) {\n return;\n }\n\n const { metricCalculator, metrics } = this;\n const metricState = this.getMetricState();\n\n if (!metrics) throw new Error('metrics not set');\n\n const {\n lastTop,\n lastLeft,\n columnCount,\n rowCount,\n scrollableContentWidth,\n scrollableViewportWidth,\n scrollableContentHeight,\n scrollableViewportHeight,\n hasHorizontalBar,\n hasVerticalBar,\n } = metrics;\n let { top, left, topOffset, leftOffset } = metrics;\n\n const theme = this.getTheme();\n\n let { deltaX, deltaY } = GridUtils.getScrollDelta(\n event,\n metrics.barWidth,\n metrics.barHeight,\n metrics.rowHeight,\n metrics.rowHeight\n );\n\n // iterate through each column to determine column width and figure out how far to scroll\n // get column width of next column to scroll to, and subract it from the remaining distance to travel\n while (hasHorizontalBar && deltaX !== 0) {\n leftOffset += deltaX;\n deltaX = 0;\n\n if (columnCount > 1) {\n // no scrolling needed, at directional edge\n if (\n (leftOffset > 0 && left >= lastLeft) ||\n (leftOffset < 0 && left <= 0)\n ) {\n leftOffset = 0;\n break;\n }\n } else {\n // single column at edge\n if (leftOffset <= 0) {\n leftOffset = 0;\n break;\n }\n\n const maxLeftOffset = scrollableContentWidth - scrollableViewportWidth;\n if (leftOffset >= maxLeftOffset) {\n leftOffset = maxLeftOffset;\n break;\n }\n }\n\n if (leftOffset > 0) {\n // scroll right\n\n // get width of next column\n const columnWidth =\n metrics.visibleColumnWidths.get(left) ??\n metricCalculator.getVisibleColumnWidth(left, metricState);\n\n if (leftOffset >= columnWidth) {\n // remove width from balance and advance by 1 column\n deltaX = leftOffset - columnWidth;\n leftOffset = 0;\n left += 1;\n } else if (theme.scrollSnapToColumn && columnCount > 1) {\n // if there's still a balance to travel but its less then a column and snapping is on\n leftOffset = 0;\n left += 1;\n }\n } else if (leftOffset < 0) {\n // scroll left\n\n // get width of next column\n const columnWidth =\n metrics.visibleColumnWidths.get(left - 1) ??\n metricCalculator.getVisibleColumnWidth(left - 1, metricState);\n\n if (\n Math.abs(leftOffset) <= columnWidth &&\n theme.scrollSnapToColumn &&\n columnCount > 1\n ) {\n // if there's still a balance to travel but its less then a column and snapping is on\n leftOffset = 0;\n left -= 1;\n } else {\n // remove width from balance and advance by 1 column\n deltaX = leftOffset + columnWidth;\n leftOffset = 0;\n left -= 1;\n }\n }\n }\n\n // iterate through each row to determine row height and figure out how far to scroll\n // get row height of next row to scroll to, and subract it from the remaining distance to travel\n while (hasVerticalBar && deltaY !== 0) {\n topOffset += deltaY;\n deltaY = 0;\n\n if (rowCount > 1) {\n // no scrolling needed, at directional edge\n if ((topOffset > 0 && top >= lastTop) || (topOffset < 0 && top <= 0)) {\n topOffset = 0;\n break;\n }\n } else {\n // single row at edge\n if (topOffset <= 0) {\n topOffset = 0;\n break;\n }\n\n const maxTopOffset = scrollableContentHeight - scrollableViewportHeight;\n if (topOffset >= maxTopOffset) {\n topOffset = maxTopOffset;\n break;\n }\n }\n\n if (topOffset > 0) {\n // scroll direction down\n\n // get height of next row\n const rowHeight =\n metrics.visibleRowHeights.get(top) ??\n metricCalculator.getVisibleRowHeight(top, metricState);\n\n if (topOffset >= rowHeight) {\n // remove height from balance and advance by 1 row\n deltaY = topOffset - rowHeight;\n topOffset = 0;\n top += 1;\n } else if (theme.scrollSnapToRow && rowCount > 1) {\n // if there's still a balance to travel but its less then a row and snapping is on\n topOffset = 0;\n top += 1;\n }\n } else if (topOffset < 0) {\n // scroll direction up\n\n // get height of next row\n const rowHeight =\n metrics.visibleRowHeights.get(top - 1) ??\n metricCalculator.getVisibleRowHeight(top - 1, metricState);\n\n if (\n Math.abs(topOffset) <= rowHeight &&\n theme.scrollSnapToRow &&\n rowCount > 1\n ) {\n // if there's still a balance to travel but its less then a row and snapping is on\n topOffset = 0;\n top -= 1;\n } else {\n // remove height from balance and advance by 1 row\n deltaY = topOffset + rowHeight;\n topOffset = 0;\n top -= 1;\n }\n }\n }\n\n this.setViewState({ top, left, leftOffset, topOffset });\n\n event.stopPropagation();\n event.preventDefault();\n }\n\n /**\n * Handle cancelling the cell edit action\n */\n handleEditCellCancel(): void {\n this.setState({ editingCell: null });\n this.focus();\n }\n\n /**\n * Handle a change in the value in an editing cell\n * @param value New value set\n */\n handleEditCellChange(value: string): void {\n this.setState(({ editingCell }) => {\n try {\n assertIsDefined(editingCell);\n\n return {\n editingCell: { ...editingCell, value } as EditingCell,\n };\n } catch (e) {\n // This case should _never_ happen, since the editingCell shouldn't be null if this method is called\n const { onError } = this.props;\n onError(e instanceof Error ? e : new Error(`${e}`));\n return null;\n }\n });\n }\n\n /**\n * Commit an edit for the currently editing cell\n * @param value Value that was committed\n * @param options Options for committing\n */\n handleEditCellCommit(\n value: string,\n {\n direction = SELECTION_DIRECTION.DOWN,\n fillRange = false,\n }: { direction?: SELECTION_DIRECTION | null; fillRange?: boolean } = {}\n ): void {\n const { editingCell, selectedRanges } = this.state;\n if (!editingCell) throw new Error('editingCell not set');\n\n const { column, row } = editingCell;\n if (!this.isValidForCell(column, row, value)) {\n // Don't allow an invalid value to be commited, the editing cell should show an error\n if (direction === null) {\n // If they clicked off of the editing cell, just remove focus\n this.setState({ editingCell: null });\n }\n return;\n }\n\n if (fillRange) {\n this.setValueForRanges(selectedRanges, value);\n } else {\n this.setValueForCell(column, row, value);\n }\n\n if (direction !== null) {\n this.moveCursorInDirection(direction);\n }\n\n this.setState({ editingCell: null });\n\n this.focus();\n }\n\n renderInputField(): ReactNode {\n const { model } = this.props;\n const { editingCell } = this.state;\n const { metrics } = this;\n if (editingCell == null || metrics == null || !isEditableGridModel(model)) {\n return null;\n }\n const { selectionRange, value, isQuickEdit } = editingCell;\n const { column, row } = editingCell;\n const {\n gridX,\n gridY,\n visibleColumnXs,\n visibleRowYs,\n visibleColumnWidths,\n visibleRowHeights,\n } = metrics;\n\n const x = visibleColumnXs.get(column);\n const y = visibleRowYs.get(row);\n const w = visibleColumnWidths.get(column);\n const h = visibleRowHeights.get(row);\n\n // If the cell isn't visible, we still need to display an invisible cell for focus purposes\n const wrapperStyle: CSSProperties =\n x != null && y != null && w != null && h != null\n ? {\n position: 'absolute',\n left: gridX + x,\n top: gridY + y,\n width: w,\n height: h,\n }\n : { opacity: 0 };\n\n const modelColumn = this.getModelColumn(column);\n const modelRow = this.getModelRow(row);\n const inputStyle: CSSProperties | undefined =\n modelColumn != null && modelRow != null\n ? {\n textAlign: model.textAlignForCell(modelColumn, modelRow),\n }\n : undefined;\n const isValid = model.isValidForCell(modelColumn, modelRow, value);\n\n return (\n <div style={wrapperStyle}>\n <CellInputField\n key={`${column},${row}`}\n selectionRange={selectionRange}\n className={classNames({ error: !isValid })}\n onCancel={this.handleEditCellCancel}\n onChange={this.handleEditCellChange}\n onDone={this.handleEditCellCommit}\n isQuickEdit={isQuickEdit}\n style={inputStyle}\n value={value}\n />\n </div>\n );\n }\n\n render(): ReactNode {\n const { cursor } = this.state;\n\n return (\n <>\n <canvas\n className={classNames('grid-canvas', Grid.getCursorClassName(cursor))}\n ref={canvas => {\n this.canvas = canvas;\n }}\n onClick={this.handleClick}\n onContextMenu={this.handleContextMenu}\n onDoubleClick={this.handleDoubleClick}\n onKeyDown={this.handleKeyDown}\n onMouseDown={this.handleMouseDown}\n onMouseMove={this.handleMouseMove}\n onMouseLeave={this.handleMouseLeave}\n tabIndex={0}\n >\n Your browser does not support HTML canvas. Update your browser?\n </canvas>\n {this.renderInputField()}\n </>\n );\n }\n}\n\nexport default Grid;\n"],"file":"Grid.js"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GridMetricCalculator.d.ts","sourceRoot":"","sources":["../src/GridMetricCalculator.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"GridMetricCalculator.d.ts","sourceRoot":"","sources":["../src/GridMetricCalculator.ts"],"names":[],"mappings":"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"}
|
|
@@ -521,9 +521,15 @@ export class GridMetricCalculator {
|
|
|
521
521
|
model
|
|
522
522
|
} = state;
|
|
523
523
|
var {
|
|
524
|
-
columnCount
|
|
524
|
+
columnCount,
|
|
525
|
+
floatingRightColumnCount
|
|
525
526
|
} = model;
|
|
526
|
-
|
|
527
|
+
|
|
528
|
+
if (columnCount === 0) {
|
|
529
|
+
return 0;
|
|
530
|
+
}
|
|
531
|
+
|
|
532
|
+
var lastLeft = Math.max(0, columnCount - floatingRightColumnCount - 1);
|
|
527
533
|
|
|
528
534
|
if (right != null) {
|
|
529
535
|
lastLeft = right;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/GridMetricCalculator.ts"],"names":["clamp","GridUtils","isExpandableGridModel","getOrThrow","map","key","defaultValue","undefined","value","get","Error","trimMap","cacheSize","GridMetricCalculator","CACHE_SIZE","targetSize","Math","floor","size","iter","keys","delete","next","getFloatingCoordinates","startCount","endCount","totalCount","max","sizeMap","coordinates","Map","x","i","set","constructor","userColumnWidths","userRowHeights","calculatedColumnWidths","calculatedRowHeights","fontWidths","modelRows","modelColumns","movedRows","movedColumns","getMetrics","state","left","top","leftOffset","topOffset","width","height","theme","model","rowHeight","rowHeaderWidth","rowFooterWidth","columnWidth","columnHeaderHeight","minScrollHandleSize","scrollBarSize","clear","columnCount","rowCount","floatingTopRowCount","floatingBottomRowCount","floatingLeftColumnCount","floatingRightColumnCount","firstRow","getFirstRow","firstColumn","getFirstColumn","gridX","getGridX","gridY","getGridY","treePaddingX","hasExpandableRows","calculateTreePaddingX","treePaddingY","visibleRowHeights","getVisibleRowHeights","visibleColumnWidths","getVisibleColumnWidths","visibleRows","Array","from","visibleColumns","getFloatingRowHeights","getFloatingColumnWidths","visibleColumnXs","getVisibleColumnXs","visibleRowYs","getVisibleRowYs","bottom","length","right","bottomViewport","getBottomViewport","rightViewport","getRightViewport","columnWidthValues","values","rowHeightValues","maxX","reduce","w","maxY","y","h","floatingBottomHeight","getFloatingBottomHeight","lastLeft","getLastLeft","lastTop","getLastTop","scrollableContentWidth","scrollableContentHeight","scrollableViewportWidth","scrollableViewportHeight","hasHorizontalBar","horizontalBarHeight","hasVerticalBar","verticalBarWidth","barWidth","barHeight","horizontalHandlePercent","verticalHandlePercent","handleWidth","handleHeight","leftColumnWidth","topRowHeight","leftOffsetPercent","topOffsetPercent","horizontalScrollPercent","verticalScrollPercent","scrollX","scrollY","floatingRows","getFloatingRowYs","floatingColumns","getFloatingColumnXs","allRows","concat","allColumns","getModelRows","getModelColumns","visibleRowTreeBoxes","getVisibleRowTreeBoxes","topVisible","getTopVisible","leftVisible","getLeftVisible","bottomVisible","getBottomVisible","rightVisible","getRightVisible","floatingTopHeight","getFloatingTopHeight","floatingLeftWidth","getFloatingLeftWidth","floatingRightWidth","getFloatingRightWidth","getVisibleHeight","getVisibleWidth","getFirstIndex","itemSizes","getModelIndex","modelIndex","getModelColumn","bind","getModelRow","visibleWidth","getVisibleColumnWidth","min","visibleHeight","getVisibleRowHeight","getTopForTopVisible","getTopForBottomVisible","availableHeight","getLeftForLeftVisible","getLeftForRightVisible","availableWidth","rowHeights","row","columnWidths","column","columnWidthMap","rowHeightMap","treeDepthIndent","treeHorizontalPadding","forEach","modelRow","isRowExpandable","depth","depthForRow","x1","x2","y1","y2","floatingWidth","floatingHeight","rowY","columnX","getLastIndexViewport","items","itemXs","maxSize","defaultItemSize","lastIndex","dataSize","ceil","getVisibleItemSize","userSizes","calculateSize","calculatedSize","calculateRowHeight","modelColumn","calculateColumnWidth","visibleRow","has","visibleColumn","autoSizeRows","cachedValue","autoSizeColumns","minColumnWidth","headerWidth","calculateColumnHeaderWidth","dataWidth","calculateColumnDataWidth","headerFont","headerHorizontalPadding","headerText","textForColumnHeader","headerFontWidth","getWidthForFont","font","cellHorizontalPadding","fontWidth","rowsPerPage","iterateAllItems","text","textForCell","cellPadding","MAX_COLUMN_WIDTH","treePadding","context","textMetrics","measureText","setColumnWidth","resetColumnWidth","setRowHeight","resetRowHeight"],"mappings":"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","sourcesContent":["import clamp from 'lodash.clamp';\nimport GridModel from './GridModel';\nimport type {\n GridMetrics,\n BoxCoordinates,\n Coordinate,\n CoordinateMap,\n VisibleIndex,\n IndexModelMap,\n ModelIndex,\n ModelSizeMap,\n MoveOperation,\n SizeMap,\n} from './GridMetrics';\nimport GridUtils from './GridUtils';\nimport { GridFont, GridTheme } from './GridTheme';\nimport { isExpandableGridModel } from './ExpandableGridModel';\n\n/* eslint class-methods-use-this: \"off\" */\n/* eslint react/destructuring-assignment: \"off\" */\n\nexport interface GridMetricState {\n // The top/left cell of the scrolled viewport\n left: VisibleIndex;\n top: VisibleIndex;\n\n // The scroll offset within the top/left of the viewport\n leftOffset: Coordinate;\n topOffset: Coordinate;\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 // Moved columns/rows in the grid\n movedColumns: MoveOperation[];\n movedRows: MoveOperation[];\n\n // Whether the scrollbars are currently being dragged\n isDraggingHorizontalScrollBar: boolean;\n isDraggingVerticalScrollBar: boolean;\n}\n\n/**\n * Retrieve a value from a map. If the value is not found and no default value is provided, throw.\n * Use when the value _must_ be present\n * @param map The map to get the value from\n * @param key The key to fetch the value for\n * @param defaultValue A default value to set if the key is not present\n * @returns The value set for that key\n */\nexport function getOrThrow<K, V>(\n map: Map<K, V>,\n key: K,\n defaultValue: V | undefined = undefined\n): V {\n const value = map.get(key) ?? defaultValue;\n if (value !== undefined) {\n return value;\n }\n\n throw new Error(`Missing value for key ${key}`);\n}\n\n/**\n * Trim the provided map in place. Trims oldest inserted items down to the target size if the cache size is exceeded.\n * Instead of trimming one item on every tick, we trim half the items so there isn't a cache clear on every new item.\n * @param map The map to trim\n * @param cacheSize The maximum number of elements to cache\n * @param targetSize The number of elements to reduce the cache down to if `cacheSize` is exceeded\n */\nexport function trimMap(\n map: Map<unknown, unknown>,\n cacheSize = GridMetricCalculator.CACHE_SIZE,\n targetSize = Math.floor(cacheSize / 2)\n): void {\n if (map.size > cacheSize) {\n const iter = map.keys();\n while (map.size > targetSize) {\n map.delete(iter.next().value);\n }\n }\n}\n\n/**\n * Get the coordinates of floating items in one dimension.\n * Can be used for getting the y coordinates of floating rows, or x coordinates of floating columns, calculated using the `sizeMap` passed in.\n * @param startCount The number of floating items at the start (ie. `floatingTopRowCount` for rows, `floatingLeftColumnCount` for columns)\n * @param endCount The number of floating items at the end (ie. `floatingBottomRowCount` for rows, `floatingRightColumnCount` for columns)\n * @param totalCount Total number of items in this dimension (ie. `rowCount` for rows, `columnCount` for columns)\n * @param max The max coordinate value (ie. `maxY` for rows, `maxX` for columns)\n * @param sizeMap Map from index to size of item (ie. `rowHeightMap` for rows, `columnWidthMap` for columns)\n */\nexport function getFloatingCoordinates(\n startCount: number,\n endCount: number,\n totalCount: number,\n max: number,\n sizeMap: SizeMap\n): CoordinateMap {\n const coordinates = new Map();\n let x = 0;\n for (let i = 0; i < startCount && i < totalCount; i += 1) {\n coordinates.set(i, x);\n x += getOrThrow(sizeMap, i);\n }\n\n x = max;\n for (let i = 0; i < endCount && totalCount - i - 1 >= 0; i += 1) {\n x -= getOrThrow(sizeMap, totalCount - i - 1);\n coordinates.set(totalCount - i - 1, x);\n }\n return coordinates;\n}\n\n/**\n * Class to calculate all the metrics for drawing a grid.\n * Call getMetrics() with the state to get the full metrics.\n * Override this class and override the individual methods to provide additional functionality.\n */\nexport class GridMetricCalculator {\n /** The size of the caches this calculator stores */\n static CACHE_SIZE = 10000;\n\n /** The maximum column width as a percentage of the full grid */\n static MAX_COLUMN_WIDTH = 0.8;\n\n /** User set column widths */\n protected userColumnWidths: ModelSizeMap;\n\n /** User set row heights */\n protected userRowHeights: ModelSizeMap;\n\n /** Calculated column widths based on cell contents */\n protected calculatedColumnWidths: ModelSizeMap;\n\n /** Calculated row heights based on cell contents */\n protected calculatedRowHeights: ModelSizeMap;\n\n /** Cache of fonts to estimated width of one char */\n protected fontWidths: Map<string, number>;\n\n /** Map from visible index to model index for rows (e.g. reversing movedRows operations) */\n protected modelRows: IndexModelMap;\n\n /** Map from visible index to model index for columns (e.g. reversing movedColumns operations) */\n protected modelColumns: IndexModelMap;\n\n /** List of moved row operations. Need to track the previous value so we know if modelRows needs to be cleared. */\n protected movedRows: MoveOperation[];\n\n /** List of moved column operations. Need to track the previous value so we know if modelColumns needs to be cleared. */\n protected movedColumns: MoveOperation[];\n\n constructor({\n userColumnWidths = new Map(),\n userRowHeights = new Map(),\n calculatedColumnWidths = new Map(),\n calculatedRowHeights = new Map(),\n fontWidths = new Map(),\n modelRows = new Map(),\n modelColumns = new Map(),\n movedRows = [],\n movedColumns = [],\n } = {}) {\n this.userColumnWidths = userColumnWidths;\n this.userRowHeights = userRowHeights;\n this.calculatedRowHeights = calculatedRowHeights;\n this.calculatedColumnWidths = calculatedColumnWidths;\n this.fontWidths = fontWidths;\n\n // Need to track the last moved rows/columns array so we know if we need to reset our models cache\n this.modelRows = modelRows;\n this.modelColumns = modelColumns;\n this.movedRows = movedRows;\n this.movedColumns = movedColumns;\n }\n\n /**\n * Get the metrics for the provided metric state\n * @params state The state to get metrics for\n * @returns The full metrics\n */\n getMetrics(state: GridMetricState): GridMetrics {\n const {\n left,\n top,\n leftOffset,\n topOffset,\n width,\n height,\n theme,\n model,\n movedRows,\n movedColumns,\n } = state;\n const {\n rowHeight,\n rowHeaderWidth,\n rowFooterWidth,\n columnWidth,\n columnHeaderHeight,\n minScrollHandleSize,\n scrollBarSize,\n } = theme;\n\n if (movedRows !== this.movedRows) {\n this.movedRows = movedRows;\n this.modelRows.clear();\n }\n\n if (movedColumns !== this.movedColumns) {\n this.movedColumns = movedColumns;\n this.modelColumns.clear();\n }\n\n const {\n columnCount,\n rowCount,\n floatingTopRowCount,\n floatingBottomRowCount,\n floatingLeftColumnCount,\n floatingRightColumnCount,\n } = model;\n\n // Get some basic metrics\n const firstRow = this.getFirstRow(state);\n const firstColumn = this.getFirstColumn(state);\n\n const gridX = this.getGridX(state);\n const gridY = this.getGridY(state);\n\n const treePaddingX =\n isExpandableGridModel(model) && model.hasExpandableRows\n ? this.calculateTreePaddingX(state)\n : 0;\n const treePaddingY = 0; // We don't support trees on columns (at least not yet)\n\n let visibleRowHeights = this.getVisibleRowHeights(state);\n let visibleColumnWidths = this.getVisibleColumnWidths(\n state,\n firstColumn,\n treePaddingX\n );\n\n // Calculate the metrics for the main grid\n const visibleRows = Array.from(visibleRowHeights.keys());\n const visibleColumns = Array.from(visibleColumnWidths.keys());\n\n // Add the floating row heights/column widths\n // TODO #316: Create an allRowHeights/allColumnWidths maps\n visibleRowHeights = new Map([\n ...visibleRowHeights,\n ...this.getFloatingRowHeights(state),\n ]);\n visibleColumnWidths = new Map([\n ...visibleColumnWidths,\n ...this.getFloatingColumnWidths(state),\n ]);\n\n let visibleColumnXs = this.getVisibleColumnXs(\n visibleColumnWidths,\n visibleColumns,\n leftOffset\n );\n let visibleRowYs = this.getVisibleRowYs(\n visibleRowHeights,\n visibleRows,\n topOffset\n );\n\n const bottom =\n visibleRows.length > 0 ? visibleRows[visibleRows.length - 1] : top;\n const right =\n visibleColumns.length > 0\n ? visibleColumns[visibleColumns.length - 1]\n : left;\n\n const bottomViewport = this.getBottomViewport(\n state,\n visibleRows,\n visibleRowYs,\n visibleRowHeights\n );\n const rightViewport = this.getRightViewport(\n state,\n visibleColumns,\n visibleColumnXs,\n visibleColumnWidths\n );\n\n const columnWidthValues = Array.from(visibleColumnWidths.values());\n const rowHeightValues = Array.from(visibleRowHeights.values());\n const maxX = columnWidthValues.reduce((x, w) => x + w, 0) - leftOffset;\n const maxY = rowHeightValues.reduce((y, h) => y + h, 0) - topOffset;\n\n const floatingBottomHeight = this.getFloatingBottomHeight(\n state,\n visibleRowHeights\n );\n\n const lastLeft = this.getLastLeft(\n state,\n null,\n width - gridX - scrollBarSize - rowFooterWidth\n );\n const lastTop = this.getLastTop(\n state,\n null,\n height - gridY - scrollBarSize - floatingBottomHeight\n );\n\n // How much total space the content will take\n const scrollableContentWidth = leftOffset + maxX + rowFooterWidth;\n const scrollableContentHeight = topOffset + maxY;\n\n // Visible space available in the canvas viewport\n const scrollableViewportWidth = width - gridX;\n const scrollableViewportHeight = height - gridY;\n\n // Calculate some metrics for the scroll bars\n const hasHorizontalBar =\n lastLeft > 0 || scrollableContentWidth > scrollableViewportWidth;\n const horizontalBarHeight = hasHorizontalBar ? scrollBarSize : 0;\n const hasVerticalBar =\n lastTop > 0 ||\n scrollableContentHeight > scrollableViewportHeight - horizontalBarHeight;\n const verticalBarWidth = hasVerticalBar ? scrollBarSize : 0;\n const barWidth = width - rowHeaderWidth - verticalBarWidth;\n const barHeight = height - columnHeaderHeight - horizontalBarHeight;\n\n // How big the scroll handle is relative to the bar\n const horizontalHandlePercent =\n columnCount === 1\n ? barWidth / scrollableContentWidth\n : (columnCount - lastLeft) / columnCount;\n\n const verticalHandlePercent =\n rowCount === 1\n ? barHeight / scrollableContentHeight\n : (rowCount - lastTop) / rowCount;\n\n const handleWidth = hasHorizontalBar\n ? clamp(\n barWidth * horizontalHandlePercent,\n minScrollHandleSize,\n barWidth - 1\n )\n : 0;\n const handleHeight = hasVerticalBar\n ? clamp(\n barHeight * verticalHandlePercent,\n minScrollHandleSize,\n barHeight - 1\n )\n : 0;\n\n const leftColumnWidth = getOrThrow(visibleColumnWidths, left, 0);\n const topRowHeight = getOrThrow(visibleRowHeights, top, 0);\n const leftOffsetPercent =\n leftColumnWidth > 0 ? leftOffset / leftColumnWidth : 0;\n const topOffsetPercent = topRowHeight > 0 ? topOffset / topRowHeight : 0;\n\n // How much of the available space has been scrolled\n const horizontalScrollPercent =\n columnCount === 1\n ? leftOffset / (scrollableContentWidth - scrollableViewportWidth)\n : (left + leftOffsetPercent) / lastLeft;\n const verticalScrollPercent =\n rowCount === 1\n ? topOffset / (scrollableContentHeight - scrollableViewportHeight)\n : (top + topOffsetPercent) / lastTop;\n\n const scrollX = hasHorizontalBar\n ? horizontalScrollPercent * (barWidth - handleWidth)\n : 0;\n const scrollY = hasVerticalBar\n ? verticalScrollPercent * (barHeight - handleHeight)\n : 0;\n\n // Now add the floating sections positions\n let floatingRows: ModelIndex[] = [];\n if (floatingTopRowCount > 0 || floatingBottomRowCount > 0) {\n floatingRows = [\n ...Array(floatingTopRowCount).keys(),\n ...[...Array(floatingBottomRowCount).keys()].map(i => rowCount - i - 1),\n ];\n visibleRowYs = new Map([\n ...visibleRowYs,\n ...this.getFloatingRowYs(\n state,\n visibleRowHeights,\n Math.floor(height - gridY - horizontalBarHeight)\n ),\n ]);\n }\n\n let floatingColumns: ModelIndex[] = [];\n if (floatingLeftColumnCount > 0 || floatingRightColumnCount > 0) {\n floatingColumns = [\n ...Array(floatingLeftColumnCount).keys(),\n ...[...Array(floatingRightColumnCount).keys()].map(\n i => columnCount - i - 1\n ),\n ];\n visibleColumnXs = new Map([\n ...visibleColumnXs,\n ...this.getFloatingColumnXs(\n state,\n visibleColumnWidths,\n Math.floor(width - gridX - verticalBarWidth)\n ),\n ]);\n }\n\n const allRows = visibleRows.concat(floatingRows);\n const allColumns = visibleColumns.concat(floatingColumns);\n const modelRows = this.getModelRows(allRows, state);\n const modelColumns = this.getModelColumns(allColumns, state);\n\n const visibleRowTreeBoxes = this.getVisibleRowTreeBoxes(\n visibleRowHeights,\n modelRows,\n state\n );\n\n // Calculate the visible viewport based on scroll position and floating sections\n const topVisible = this.getTopVisible(\n state,\n visibleRowYs,\n visibleRowHeights,\n visibleRows\n );\n const leftVisible = this.getLeftVisible(\n state,\n visibleColumnXs,\n visibleColumnWidths,\n visibleColumns\n );\n const bottomVisible =\n lastTop > 0\n ? this.getBottomVisible(\n state,\n visibleRowYs,\n visibleRowHeights,\n visibleRows,\n gridY\n )\n : bottom;\n const rightVisible =\n lastLeft > 0\n ? this.getRightVisible(\n state,\n visibleColumnXs,\n visibleColumnWidths,\n visibleColumns,\n gridX\n )\n : right;\n\n const floatingTopHeight = this.getFloatingTopHeight(\n state,\n visibleRowHeights\n );\n const floatingLeftWidth = this.getFloatingLeftWidth(\n state,\n visibleColumnWidths\n );\n const floatingRightWidth = this.getFloatingRightWidth(\n state,\n visibleColumnWidths\n );\n\n const {\n fontWidths,\n userColumnWidths,\n userRowHeights,\n calculatedRowHeights,\n calculatedColumnWidths,\n } = this;\n\n return {\n // Row/Column metrics from model\n rowHeight,\n rowHeaderWidth,\n rowFooterWidth,\n rowCount,\n columnWidth,\n columnCount,\n columnHeaderHeight,\n\n // Floating row and column counts\n floatingTopRowCount,\n floatingBottomRowCount,\n floatingLeftColumnCount,\n floatingRightColumnCount,\n\n // The grid offset from the top left\n gridX,\n gridY,\n\n // Index of non-hidden row/columns\n firstRow,\n firstColumn,\n\n // The amount of padding for tree (if applicable)\n treePaddingX,\n treePaddingY,\n\n // What viewport is currently visible, limited by data size\n left,\n top,\n bottom,\n right,\n topOffset,\n leftOffset,\n\n // Bottom and right that are fully visible, not overlapped by scroll bars or anything\n topVisible,\n leftVisible,\n bottomVisible,\n rightVisible,\n\n // Bottom and right of the viewport, not limited by data size\n bottomViewport,\n rightViewport,\n\n // Canvas width/height\n width,\n height,\n\n // Max x/y coordinate of the grid (does not include headers)\n maxX,\n maxY,\n\n // Last valid column/row that can be the left/top of the grid\n lastLeft,\n lastTop,\n\n // Scroll bar metrics\n barHeight,\n barWidth,\n handleHeight,\n handleWidth,\n hasHorizontalBar,\n hasVerticalBar,\n verticalBarWidth,\n horizontalBarHeight,\n\n // The vertical x/y scroll amount\n scrollX,\n scrollY,\n\n scrollableContentWidth,\n scrollableContentHeight,\n\n scrollableViewportWidth,\n scrollableViewportHeight,\n\n // Array of visible rows/columns, by grid index\n visibleRows,\n visibleColumns,\n\n // Array of floating rows/columns, by grid index\n floatingRows,\n floatingColumns,\n\n // Array of all rows/columns, visible and floating, by grid index\n allRows,\n allColumns,\n\n // Map of the height/width of visible rows/columns\n // TODO #316: This should be split into allRowHeights/visibleRowHeights/floatingRowHeights ideally\n visibleRowHeights,\n visibleColumnWidths,\n\n // Floating metrics\n floatingTopHeight,\n floatingBottomHeight,\n floatingLeftWidth,\n floatingRightWidth,\n\n // Map of the X/Y coordinates of the rows/columns, from the top left of the grid\n visibleRowYs,\n visibleColumnXs,\n\n // The boxes user can click on for expanding/collapsing tree rows\n visibleRowTreeBoxes,\n\n // Mapping from visible row indexes to the model row/columns they pull from\n modelRows,\n modelColumns,\n\n // Map of the width of the fonts\n fontWidths,\n\n // Map of user set column/row width/height\n userColumnWidths,\n userRowHeights,\n\n // Map of calculated row/column height/width\n calculatedRowHeights,\n calculatedColumnWidths,\n };\n }\n\n /**\n * The x offset of the grid\n * @param state The current grid state\n * @returns x value of the left side of the first cell\n */\n getGridX(state: GridMetricState): Coordinate {\n const { theme } = state;\n const { rowHeaderWidth } = theme;\n\n return rowHeaderWidth;\n }\n\n /**\n * The y offset of the grid\n * @param state The current grid state\n * @returns y value of the top side of the first cell\n */\n getGridY(state: GridMetricState): Coordinate {\n const { theme } = state;\n const { columnHeaderHeight } = theme;\n\n return columnHeaderHeight;\n }\n\n /**\n * The height of the \"visible\" area (excludes floating areas)\n * @param state The current grid state\n * @param visibleRowHeights All the visible row heights\n * @returns The visible height in pixels\n */\n getVisibleHeight(\n state: GridMetricState,\n visibleRowHeights: SizeMap = this.getFloatingRowHeights(state)\n ): number {\n const { height, theme } = state;\n const { scrollBarSize } = theme;\n const gridY = this.getGridY(state);\n const floatingBottomHeight = this.getFloatingBottomHeight(\n state,\n visibleRowHeights\n );\n const floatingTopHeight = this.getFloatingTopHeight(\n state,\n visibleRowHeights\n );\n\n return (\n height - floatingBottomHeight - floatingTopHeight - gridY - scrollBarSize\n );\n }\n\n /**\n * The width of the \"visible\" area (excludes floating areas)\n * @param state The current grid state\n * @param visibleColumnWidths All the visible column widths\n * @returns The visible width in pixels\n */\n getVisibleWidth(\n state: GridMetricState,\n visibleColumnWidths: SizeMap = this.getFloatingColumnWidths(state)\n ): number {\n const { width, theme } = state;\n const { scrollBarSize, rowFooterWidth } = theme;\n const gridX = this.getGridX(state);\n const floatingRightWidth = this.getFloatingRightWidth(\n state,\n visibleColumnWidths\n );\n const floatingLeftWidth = this.getFloatingLeftWidth(\n state,\n visibleColumnWidths\n );\n\n return (\n width -\n floatingLeftWidth -\n floatingRightWidth -\n gridX -\n scrollBarSize -\n rowFooterWidth\n );\n }\n\n /**\n * Retrieve the index of the first non-hidden item\n * @param itemSizes The size of the items in this dimension\n * @param getModelIndex A function to map from the Index to the ModelIndex\n * @param state The current grid state\n * @returns The first item that is not hidden\n */\n getFirstIndex(\n itemSizes: ModelSizeMap,\n getModelIndex: (\n visibleIndex: VisibleIndex,\n state: GridMetricState\n ) => ModelIndex,\n state: GridMetricState\n ): VisibleIndex {\n // We only need to check at the very most the number of items the user has hidden + 1\n const max = itemSizes.size + 1;\n for (let i = 0; i < max; i += 1) {\n const modelIndex = getModelIndex(i, state);\n if (itemSizes.get(modelIndex) !== 0) {\n return i;\n }\n }\n return 0;\n }\n\n /**\n * Get the first column index that isn't hidden\n * @param state The current grid state\n * @returns The first column that is not hidden\n */\n getFirstColumn(state: GridMetricState): VisibleIndex {\n return this.getFirstIndex(\n this.userColumnWidths,\n this.getModelColumn.bind(this),\n state\n );\n }\n\n /**\n * Get the first row index that isn't hidden\n * @param state The current grid state\n * @returns The first row that is not hidden\n */\n getFirstRow(state: GridMetricState): VisibleIndex {\n return this.getFirstIndex(\n this.userRowHeights,\n this.getModelRow.bind(this),\n state\n );\n }\n\n /**\n * Get the last column that can be the left most column (e.g. scrolled to the right)\n * If no right column is provided, then the last column is used.\n * @param state The current grid state\n * @param right The right-most column to be visible, or null to default to last cell\n * @param visibleWidth The width of the \"visible\" area (excluding floating items)\n * @returns The index of the last left visible column\n */\n getLastLeft(\n state: GridMetricState,\n right: VisibleIndex | null = null,\n visibleWidth: number = this.getVisibleWidth(state)\n ): VisibleIndex {\n const { model } = state;\n const { columnCount } = model;\n\n let lastLeft = columnCount - 1;\n if (right != null) {\n lastLeft = right;\n }\n let x = 0;\n while (lastLeft >= 0) {\n const columnWidth = this.getVisibleColumnWidth(lastLeft, state);\n x += columnWidth;\n\n if (x >= visibleWidth) {\n return Math.min(lastLeft + 1, columnCount - 1);\n }\n\n lastLeft -= 1;\n }\n\n return 0;\n }\n\n /**\n * The last row that can be the top row (e.g. scrolled to the bottom)\n * If no bottom row is provided, then the last row that is not floating is used\n */\n\n /**\n * The last row that can be the top row (e.g. scrolled to the bottom)\n * If no bottom row is provided, then the last row that is not floating is used\n * @param state The current grid state\n * @param bottom The bottom-most row to be visible, or null to default to last cell\n * @param visibleHeight The height of the \"visible\" area (excluding floating items)\n * @returns The index of the last left visible column\n */\n getLastTop(\n state: GridMetricState,\n bottom: VisibleIndex | null = null,\n visibleHeight: number = this.getVisibleHeight(state)\n ): VisibleIndex {\n const { model } = state;\n const { rowCount, floatingBottomRowCount } = model;\n\n let lastTop = Math.max(0, rowCount - floatingBottomRowCount - 1);\n if (bottom != null) {\n lastTop = bottom;\n }\n let y = 0;\n while (lastTop > 0) {\n const rowHeight = this.getVisibleRowHeight(lastTop, state);\n y += rowHeight;\n\n if (y >= visibleHeight) {\n return Math.min(lastTop + 1, rowCount - 1);\n }\n\n lastTop -= 1;\n }\n\n return 0;\n }\n\n /**\n * Retrieve the top row to scroll to so the passed in `topVisible` is completely visible, taking the floating rows into account.\n * The `top` row is at the top underneath any floating rows, whereas `topVisible` is visible below the floating rows.\n * If there are no floating rows, they should be the same value.\n * @param state The grid metric state\n * @param topVisible The top row to be visible\n * @returns The index of the top row to scroll to (under the floating top rows)\n */\n getTopForTopVisible(\n state: GridMetricState,\n topVisible: VisibleIndex\n ): VisibleIndex {\n const floatingTopHeight = this.getFloatingTopHeight(state);\n let top = topVisible;\n let y = 0;\n while (top > 0 && y < floatingTopHeight) {\n top -= 1;\n y += this.getVisibleRowHeight(top, state);\n }\n return top;\n }\n\n /**\n * Retrieve the top row to scroll to so the passed in `bottomVisible` is completely visible\n * at the bottom of the visible viewport, taking the floating rows into account.\n * @param state The grid metric state\n * @param bottomVisible The bottom row to be visible\n * @returns The index of the top row to scroll to (under the floating top rows)\n */\n getTopForBottomVisible(\n state: GridMetricState,\n bottomVisible: VisibleIndex\n ): VisibleIndex {\n const { height } = state;\n const gridY = this.getGridY(state);\n const floatingBottomHeight = this.getFloatingBottomHeight(state);\n const availableHeight = height - gridY - floatingBottomHeight;\n return this.getLastTop(state, bottomVisible, availableHeight);\n }\n\n /**\n * Retrieve the left column to scroll to so the passed in `leftVisible` is completely visible\n * at the left of the visible viewport, taking the floating columns into account.\n * @param state The grid metric state\n * @param leftVisible The left column to be visible\n * @returns The index of the left column to scroll to (under the floating left columns)\n */\n getLeftForLeftVisible(\n state: GridMetricState,\n leftVisible: VisibleIndex\n ): VisibleIndex {\n const floatingLeftWidth = this.getFloatingLeftWidth(state);\n let left = leftVisible;\n let x = 0;\n while (left > 0 && x < floatingLeftWidth) {\n left -= 1;\n x += this.getVisibleColumnWidth(left, state);\n }\n return left;\n }\n\n /**\n * Retrieve the left column to scroll to so the passed in `rightVisible` is completely visible\n * at the right of the visible viewport, taking the floating columns into account.\n * @param state The grid metric state\n * @param rightVisible The right column to be visible\n * @returns The index of the left column to scroll to (under the floating left columns)\n */\n getLeftForRightVisible(\n state: GridMetricState,\n rightVisible: VisibleIndex\n ): VisibleIndex {\n const { width } = state;\n const gridX = this.getGridX(state);\n const floatingRightWidth = this.getFloatingRightWidth(state);\n const availableWidth = width - gridX - floatingRightWidth;\n return this.getLastLeft(state, rightVisible, availableWidth);\n }\n\n /**\n * Retrieve a map of the height of each floating row\n * @param state The grid metric state\n * @returns The heights of all the floating rows\n */\n getFloatingRowHeights(state: GridMetricState): SizeMap {\n const { model } = state;\n const { floatingTopRowCount, floatingBottomRowCount, rowCount } = model;\n\n const rowHeights = new Map();\n for (let i = 0; i < floatingTopRowCount && i < rowCount; i += 1) {\n rowHeights.set(i, this.getVisibleRowHeight(i, state));\n }\n\n for (\n let i = 0;\n i < floatingBottomRowCount && rowCount - i - 1 >= 0;\n i += 1\n ) {\n const row = rowCount - i - 1;\n rowHeights.set(row, this.getVisibleRowHeight(row, state));\n }\n\n return rowHeights;\n }\n\n /**\n * Retrieve a map of the height of all the visible rows (non-floating)\n * @param state The grid metric state\n * @returns The heights of all the visible rows\n */\n getVisibleRowHeights(state: GridMetricState): SizeMap {\n const { top, topOffset, height, model } = state;\n\n let y = 0;\n let row = top;\n const rowHeights = new Map();\n const { rowCount } = model;\n while (y < height + topOffset && row < rowCount) {\n const rowHeight = this.getVisibleRowHeight(row, state);\n rowHeights.set(row, rowHeight);\n y += rowHeight;\n row += 1;\n }\n\n return rowHeights;\n }\n\n /**\n * Retrieve a map of the width of each floating column\n * @param state The grid metric state\n * @param firstColumn The first non-hidden column\n * @param treePaddingX The amount of padding taken up for the tree expansion buttons\n * @returns The widths of all the floating columns\n */\n getFloatingColumnWidths(\n state: GridMetricState,\n firstColumn: VisibleIndex = this.getFirstColumn(state),\n treePaddingX: number = this.calculateTreePaddingX(state)\n ): SizeMap {\n const { model } = state;\n const {\n columnCount,\n floatingLeftColumnCount,\n floatingRightColumnCount,\n } = model;\n\n const columnWidths = new Map();\n for (let i = 0; i < floatingLeftColumnCount && i < columnCount; i += 1) {\n columnWidths.set(\n i,\n this.getVisibleColumnWidth(i, state, firstColumn, treePaddingX)\n );\n }\n\n for (\n let i = 0;\n i < floatingRightColumnCount && columnCount - i - 1 >= 0;\n i += 1\n ) {\n const column = columnCount - i - 1;\n columnWidths.set(\n column,\n this.getVisibleColumnWidth(column, state, firstColumn, treePaddingX)\n );\n }\n\n return columnWidths;\n }\n\n /**\n * Retrieve a map of the width of all the visible columns (non-floating)\n * @param state The grid metric state\n * @returns The widths of all the visible columns\n */\n getVisibleColumnWidths(\n state: GridMetricState,\n firstColumn: VisibleIndex = this.getFirstColumn(state),\n treePaddingX: number = this.calculateTreePaddingX(state)\n ): SizeMap {\n const { left, leftOffset, width, model } = state;\n\n let x = 0;\n let column = left;\n const columnWidths = new Map();\n const { columnCount } = model;\n while (x < width + leftOffset && column < columnCount) {\n const columnWidth = this.getVisibleColumnWidth(\n column,\n state,\n firstColumn,\n treePaddingX\n );\n columnWidths.set(column, columnWidth);\n x += columnWidth;\n column += 1;\n }\n\n return columnWidths;\n }\n\n /**\n * Retrieve a map of all the floating columns to their x coordinate\n * @param state The grid metric state\n * @param columnWidthMap Map from visible index to column width\n * @param maxX The maximum X size for the grid\n * @returns Map of the x coordinate of all floating columns\n */\n getFloatingColumnXs(\n state: GridMetricState,\n columnWidthMap: SizeMap,\n maxX: Coordinate\n ): CoordinateMap {\n const { model } = state;\n const {\n columnCount,\n floatingLeftColumnCount,\n floatingRightColumnCount,\n } = model;\n\n return getFloatingCoordinates(\n floatingLeftColumnCount,\n floatingRightColumnCount,\n columnCount,\n maxX,\n columnWidthMap\n );\n }\n\n /**\n * Retrieve a map of all the visible columns to their x coordinate.\n * Starts at leftOffset with the first index in `visibleColumns`, then\n * calculates all the coordinates from there\n * @param visibleColumnWidths Map of visible column index to widths\n * @param visibleColumns All visible columns\n * @param leftOffset The left scroll offset\n * @returns Map of the x coordinate of all visible columns\n */\n getVisibleColumnXs(\n visibleColumnWidths: SizeMap,\n visibleColumns: VisibleIndex[],\n leftOffset: number\n ): CoordinateMap {\n const visibleColumnXs = new Map();\n let x = -leftOffset;\n for (let i = 0; i < visibleColumns.length; i += 1) {\n const column = visibleColumns[i];\n const columnWidth = getOrThrow(visibleColumnWidths, column);\n visibleColumnXs.set(column, x);\n x += columnWidth;\n }\n\n return visibleColumnXs;\n }\n\n /**\n * Retrieve a map of all the floating rows to their y coordinate\n * @param state The grid metric state\n * @param rowHeightMap Map of visible index to row height\n * @param maxY The maximum Y size for the grid\n * @returns Map of the y coordinate of all floating rows\n */\n getFloatingRowYs(\n state: GridMetricState,\n rowHeightMap: SizeMap,\n maxY: Coordinate\n ): CoordinateMap {\n const { model } = state;\n const { floatingTopRowCount, floatingBottomRowCount, rowCount } = model;\n\n return getFloatingCoordinates(\n floatingTopRowCount,\n floatingBottomRowCount,\n rowCount,\n maxY,\n rowHeightMap\n );\n }\n\n /**\n * Retrieve a map of all the visible rows to their y coordinate.\n * Starts at topOffset with the first index in `visibleRows`, then\n * calculates all the coordinates from there\n * @param visibleRowHeights Map of visible row index to heights\n * @param visibleRows All visible rows\n * @param topOffset The top scroll offset\n * @returns Map of the y coordinate of all visible rows\n */\n getVisibleRowYs(\n visibleRowHeights: SizeMap,\n visibleRows: VisibleIndex[],\n topOffset: number\n ): CoordinateMap {\n const visibleRowYs = new Map();\n let y = -topOffset;\n for (let i = 0; i < visibleRows.length; i += 1) {\n const row = visibleRows[i];\n const rowHeight = getOrThrow(visibleRowHeights, row);\n visibleRowYs.set(row, y);\n y += rowHeight;\n }\n\n return visibleRowYs;\n }\n\n /**\n * Calculates the tree box click areas that are visible. In relation to the columnX/rowY\n * @param visibleRowHeights Map of visible index to row height\n * @param modelRows Map from visible `Index` to `ModelIndex`\n * @param state The grid metric state\n * @returns Coordinates of tree boxes for each row\n */\n getVisibleRowTreeBoxes(\n visibleRowHeights: SizeMap,\n modelRows: IndexModelMap,\n state: GridMetricState\n ): Map<VisibleIndex, BoxCoordinates> {\n const visibleRowTreeBoxes = new Map();\n const { model, theme } = state;\n const { treeDepthIndent, treeHorizontalPadding } = theme;\n\n if (isExpandableGridModel(model) && model.hasExpandableRows) {\n visibleRowHeights.forEach((rowHeight, row) => {\n const modelRow = getOrThrow(modelRows, row);\n if (model.isRowExpandable(modelRow)) {\n const depth = model.depthForRow(modelRow);\n const x1 = depth * treeDepthIndent + treeHorizontalPadding;\n const x2 = (depth + 1) * treeDepthIndent + treeHorizontalPadding;\n const y1 = 0;\n const y2 = rowHeight;\n visibleRowTreeBoxes.set(row, { x1, y1, x2, y2 });\n }\n });\n }\n\n return visibleRowTreeBoxes;\n }\n\n /**\n * Get the total width of the floating columns on the left\n * @param state The grid metric state\n * @param columnWidths Map of column index to width\n * @returns The total width of the floating left section\n */\n getFloatingLeftWidth(\n state: GridMetricState,\n columnWidths: SizeMap = this.getFloatingColumnWidths(state)\n ): number {\n const { model } = state;\n const { floatingLeftColumnCount } = model;\n let floatingWidth = 0;\n for (let i = 0; i < floatingLeftColumnCount; i += 1) {\n floatingWidth += getOrThrow(columnWidths, i);\n }\n return floatingWidth;\n }\n\n /**\n * Get the total width of the floating columns on the right\n * @param state The grid metric state\n * @param columnWidths Map of column index to width\n * @returns The total width of the floating right section\n */\n getFloatingRightWidth(\n state: GridMetricState,\n columnWidths: SizeMap = this.getFloatingColumnWidths(state)\n ): number {\n const { model } = state;\n const { floatingRightColumnCount, columnCount } = model;\n let floatingWidth = 0;\n for (let i = 0; i < floatingRightColumnCount; i += 1) {\n floatingWidth += getOrThrow(columnWidths, columnCount - i - 1);\n }\n\n return floatingWidth;\n }\n\n /**\n * Get the total height of the floating rows on the top\n * @param state The grid metric state\n * @param rowHeights Map of row index to height\n * @returns The total height of the floating top section\n */\n getFloatingTopHeight(\n state: GridMetricState,\n rowHeights: SizeMap = this.getFloatingRowHeights(state)\n ): number {\n const { model } = state;\n const { floatingTopRowCount } = model;\n let floatingHeight = 0;\n for (let i = 0; i < floatingTopRowCount; i += 1) {\n floatingHeight += getOrThrow(rowHeights, i);\n }\n return floatingHeight;\n }\n\n /**\n * Get the total height of the floating rows on the bottom\n * @param state The grid metric state\n * @param rowHeights Map of row index to height\n * @returns The total height of the floating bottom section\n */\n getFloatingBottomHeight(\n state: GridMetricState,\n rowHeights: SizeMap = this.getFloatingRowHeights(state)\n ): number {\n const { model } = state;\n const { floatingBottomRowCount, rowCount } = model;\n let floatingHeight = 0;\n for (let i = 0; i < floatingBottomRowCount; i += 1) {\n floatingHeight += getOrThrow(rowHeights, rowCount - i - 1);\n }\n return floatingHeight;\n }\n\n /**\n * Retrieve the index of the first fully visible row in the \"visible\" viewport of the grid.\n * E.g. First row visible after the floating rows, provided the visible rows.\n * @param state The grid metric state\n * @param visibleRowYs Map of row index to y coordinate\n * @param visibleRowHeights Map of row index to height\n * @param visibleRows Array of visible row indexes\n * @returns Index of the top visible row\n */\n getTopVisible(\n state: GridMetricState,\n visibleRowYs: CoordinateMap,\n visibleRowHeights: SizeMap,\n visibleRows: VisibleIndex[]\n ): VisibleIndex {\n const floatingHeight = this.getFloatingTopHeight(state, visibleRowHeights);\n for (let i = 0; i < visibleRows.length; i += 1) {\n const row = visibleRows[i];\n const y = getOrThrow(visibleRowYs, row);\n if (y >= floatingHeight) {\n return row;\n }\n }\n return 0;\n }\n\n /**\n * Retrieve the index of the first fully visible column in the \"visible\" viewport of the grid.\n * E.g. First column visible after the floating columns, provided the visible columns.\n * @param state The grid metric state\n * @param visibleColumnXs Map of column index to x coordinate\n * @param visibleColumnWidths Map of column index to widths\n * @param visibleColumns Array of visible row indexes\n * @returns Index of the left visible column\n */\n getLeftVisible(\n state: GridMetricState,\n visibleColumnXs: CoordinateMap,\n visibleColumnWidths: SizeMap,\n visibleColumns: VisibleIndex[]\n ): VisibleIndex {\n const floatingWidth = this.getFloatingLeftWidth(state, visibleColumnWidths);\n for (let i = 0; i < visibleColumns.length; i += 1) {\n const column = visibleColumns[i];\n const x = getOrThrow(visibleColumnXs, column);\n if (x >= floatingWidth) {\n return column;\n }\n }\n return 0;\n }\n\n /**\n * Retrieve the index of the last fully visible row in the \"visible\" viewport of the grid.\n * E.g. Last row visible before the bottom floating rows, provided the visible rows.\n * @param state The grid metric state\n * @param visibleRowYs Map of row index to y coordinate\n * @param visibleRowHeights Map of row index to height\n * @param visibleRows Array of visible row indexes\n * @param gridY The starting y coordinate of the grid\n * @returns Index of the bottom visible row\n */\n getBottomVisible(\n state: GridMetricState,\n visibleRowYs: CoordinateMap,\n visibleRowHeights: SizeMap,\n visibleRows: VisibleIndex[],\n gridY: Coordinate\n ): VisibleIndex {\n const { height, theme } = state;\n const { scrollBarSize } = theme;\n const floatingHeight = this.getFloatingBottomHeight(\n state,\n visibleRowHeights\n );\n const visibleHeight = height - gridY - scrollBarSize - floatingHeight;\n for (let i = visibleRows.length - 1; i >= 0; i -= 1) {\n const row = visibleRows[i];\n const rowY = getOrThrow(visibleRowYs, row);\n const rowHeight = getOrThrow(visibleRowHeights, row);\n if (rowY + rowHeight <= visibleHeight) {\n return row;\n }\n }\n\n return 0;\n }\n\n /**\n * Retrieve the index of the last fully visible column in the \"visible\" viewport of the grid.\n * E.g. Last column visible before the floating columns, provided the visible columns.\n * @param state The grid metric state\n * @param visibleColumnXs Map of column index to x coordinate\n * @param visibleColumnWidths Map of column index to widths\n * @param visibleColumns Array of visible column indexes\n * @returns Index of the right visible column\n */\n getRightVisible(\n state: GridMetricState,\n visibleColumnXs: CoordinateMap,\n visibleColumnWidths: SizeMap,\n visibleColumns: VisibleIndex[],\n gridX: Coordinate\n ): VisibleIndex {\n const { width, theme } = state;\n const { scrollBarSize } = theme;\n const floatingWidth = this.getFloatingRightWidth(\n state,\n visibleColumnWidths\n );\n const visibleWidth = width - gridX - scrollBarSize - floatingWidth;\n for (let i = visibleColumns.length - 1; i >= 0; i -= 1) {\n const column = visibleColumns[i];\n const columnX = getOrThrow(visibleColumnXs, column);\n const columnWidth = getOrThrow(visibleColumnWidths, column);\n if (columnX + columnWidth <= visibleWidth) {\n return column;\n }\n }\n\n return 0;\n }\n\n /**\n * Retrieve the possible bottom of the visible viewport (not limited by data size)\n * @param state The grid metric state\n * @param visibleRows Array of visible row indexes\n * @param visibleRowYs Map of row index to y coordinate\n * @param visibleRowHeights Map of row index to height\n * @returns The index of the bottom viewport possible\n */\n getBottomViewport(\n state: GridMetricState,\n visibleRows: VisibleIndex[],\n visibleRowYs: CoordinateMap,\n visibleRowHeights: SizeMap\n ): VisibleIndex {\n const { height, theme } = state;\n const { rowHeight } = theme;\n\n return this.getLastIndexViewport(\n visibleRows,\n visibleRowYs,\n visibleRowHeights,\n height,\n rowHeight\n );\n }\n\n /**\n * Retrieve the possible right of the visible viewport (not limited by data size)\n * @param state The grid metric state\n * @param visibleColumns Array of visible column indexes\n * @param visibleColumnXs Map of column index to x coordinate\n * @param visibleColumnWidths Map of column index to width\n * @returns The index of the right viewport possible\n */\n getRightViewport(\n state: GridMetricState,\n visibleColumns: VisibleIndex[],\n visibleColumnXs: CoordinateMap,\n visibleColumnWidths: SizeMap\n ): VisibleIndex {\n const { width, theme } = state;\n const { columnWidth } = theme;\n\n return this.getLastIndexViewport(\n visibleColumns,\n visibleColumnXs,\n visibleColumnWidths,\n width,\n columnWidth\n );\n }\n\n /**\n * Get the Index of the of the last index visible\n * @param items Array of visible item indexes\n * @param itemXs Map of index to coordinate\n * @param itemSizes Map of index to size\n * @param maxSize Full size of the grid\n * @param defaultItemSize Default size of an item\n * @returns The Index of the last index visible\n */\n getLastIndexViewport(\n items: VisibleIndex[],\n itemXs: CoordinateMap,\n itemSizes: SizeMap,\n maxSize: number,\n defaultItemSize: number\n ): VisibleIndex {\n let lastIndex = 0;\n let dataSize = 0;\n if (items.length > 0) {\n lastIndex = items[items.length - 1];\n dataSize =\n getOrThrow(itemXs, lastIndex) + getOrThrow(itemSizes, lastIndex);\n }\n\n if (dataSize < maxSize) {\n lastIndex += Math.ceil((maxSize - dataSize) / defaultItemSize);\n }\n\n return lastIndex;\n }\n\n /**\n * Get the size from the provided size map of the specified item\n * @param modelIndex The model index to get the size for\n * @param userSizes The user set sizes\n * @param calculateSize Method to calculate the size for this item\n * @returns The size from the provided size map of the specified item\n */\n getVisibleItemSize(\n modelIndex: ModelIndex,\n userSizes: ModelSizeMap,\n calculateSize: () => number\n ): number {\n // Always re-calculate the size of the item so the calculated size maps are populated\n const calculatedSize = calculateSize();\n return userSizes.get(modelIndex) ?? calculatedSize;\n }\n\n /**\n * Get the height of the specified row\n * @param row Index of the row to get the height of\n * @param state The grid metric state\n * @returns The height of the row specified\n */\n getVisibleRowHeight(row: VisibleIndex, state: GridMetricState): number {\n const modelRow = this.getModelRow(row, state);\n\n return this.getVisibleItemSize(modelRow, this.userRowHeights, () =>\n this.calculateRowHeight(row, modelRow, state)\n );\n }\n\n /**\n * Get the width of the specified column\n * @param column Index of the column to get the width of\n * @param state The grid metric state\n * @param firstColumn Index of first visible column\n * @param treePaddingX The amount of tree padding to add to the first visible column\n * @returns The width of the column\n */\n getVisibleColumnWidth(\n column: VisibleIndex,\n state: GridMetricState,\n firstColumn: VisibleIndex = this.getFirstColumn(state),\n treePaddingX: number = this.calculateTreePaddingX(state)\n ): number {\n const modelColumn = this.getModelColumn(column, state);\n\n return this.getVisibleItemSize(modelColumn, this.userColumnWidths, () =>\n this.calculateColumnWidth(\n column,\n modelColumn,\n state,\n firstColumn,\n treePaddingX\n )\n );\n }\n\n /**\n * Get a map of ModelIndex to Index\n * @param visibleRows Array of visible row indexes\n * @param state The grid metric state\n * @returns Map of Index to ModelIndex\n */\n getModelRows(\n visibleRows: VisibleIndex[],\n state: GridMetricState\n ): IndexModelMap {\n const modelRows = new Map();\n for (let i = 0; i < visibleRows.length; i += 1) {\n const visibleRow = visibleRows[i];\n const modelRow = this.getModelRow(visibleRow, state);\n modelRows.set(visibleRow, modelRow);\n }\n return modelRows;\n }\n\n /**\n * Get the ModelIndex of the specified row\n * @param visibleRow Index of the row\n * @param state The grid metric state\n * @returns ModelIndex of the row\n */\n getModelRow(visibleRow: VisibleIndex, state: GridMetricState): ModelIndex {\n if (this.modelRows.has(visibleRow)) {\n return getOrThrow(this.modelRows, visibleRow);\n }\n const { movedRows } = state;\n const modelRow = GridUtils.getModelIndex(visibleRow, movedRows);\n this.modelRows.set(visibleRow, modelRow);\n return modelRow;\n }\n\n /**\n * Get a map of Index to ModelIndex. Applies the move operations to get the transformation.\n * @param visibleColumns Array of visible column indexes\n * @param state The grid metric state\n * @returns Map of Index to ModelIndex\n */\n getModelColumns(\n visibleColumns: VisibleIndex[],\n state: GridMetricState\n ): IndexModelMap {\n const modelColumns = new Map();\n for (let i = 0; i < visibleColumns.length; i += 1) {\n const visibleColumn = visibleColumns[i];\n const modelColumn = this.getModelColumn(visibleColumn, state);\n modelColumns.set(visibleColumn, modelColumn);\n }\n return modelColumns;\n }\n\n /**\n * Get the ModelIndex of the specified column\n * @param visibleColumn Index of the column\n * @param state The grid metric state\n * @returns ModelIndex of the column\n */\n getModelColumn(\n visibleColumn: VisibleIndex,\n state: GridMetricState\n ): ModelIndex {\n if (this.modelColumns.has(visibleColumn)) {\n return getOrThrow(this.modelColumns, visibleColumn);\n }\n const { movedColumns } = state;\n const modelColumn = GridUtils.getModelIndex(visibleColumn, movedColumns);\n this.modelColumns.set(visibleColumn, modelColumn);\n return modelColumn;\n }\n\n /**\n * Calculate the height of the row specified.\n * @param row Index of the row to calculate the height for\n * @param modelRow ModelIndex of the row to calculate the height\n * @param state The grid metric state\n * @returns The height of the row\n */\n calculateRowHeight(\n row: VisibleIndex,\n modelRow: ModelIndex,\n state: GridMetricState\n ): number {\n const { theme } = state;\n const { autoSizeRows, rowHeight } = theme;\n if (!autoSizeRows) {\n return rowHeight;\n }\n\n const cachedValue = this.calculatedRowHeights.get(modelRow);\n if (cachedValue != null) {\n return cachedValue;\n }\n\n // Not sure how to accurately get the height of text. For now just return the theme height.\n this.calculatedRowHeights.set(modelRow, Math.ceil(rowHeight));\n trimMap(this.calculatedRowHeights);\n return rowHeight;\n }\n\n /**\n * Calculates the column width based on the provided column model index\n * @param column Index of the column to calculate the width for\n * @param modelColumn ModelIndex of the column to calculate the width\n * @param state The grid metric state\n * @param firstColumn The first visible column\n * @param treePaddingX Tree padding offset for expandable rows\n * @returns The width of the column\n */\n calculateColumnWidth(\n column: VisibleIndex,\n modelColumn: ModelIndex,\n state: GridMetricState,\n firstColumn: VisibleIndex = this.getFirstColumn(state),\n treePaddingX: number = this.calculateTreePaddingX(state)\n ): number {\n const { theme } = state;\n const { autoSizeColumns, minColumnWidth } = theme;\n if (!autoSizeColumns) {\n const { columnWidth } = theme;\n return columnWidth;\n }\n\n const headerWidth = this.calculateColumnHeaderWidth(modelColumn, state);\n const dataWidth = this.calculateColumnDataWidth(modelColumn, state);\n const cachedValue = this.calculatedColumnWidths.get(modelColumn);\n let columnWidth = Math.ceil(Math.max(headerWidth, dataWidth));\n columnWidth = Math.max(minColumnWidth, columnWidth);\n if (cachedValue != null && cachedValue > columnWidth) {\n columnWidth = cachedValue;\n } else {\n this.calculatedColumnWidths.set(modelColumn, columnWidth);\n trimMap(this.calculatedColumnWidths);\n }\n\n if (column === firstColumn) {\n columnWidth += treePaddingX;\n }\n\n return columnWidth;\n }\n\n /**\n * Calculate the width of the specified column's header\n * @param modelColumn ModelIndex of the column to get the header width for\n * @param state The grid metric state\n * @returns The calculated width of the column header\n */\n calculateColumnHeaderWidth(\n modelColumn: ModelIndex,\n state: GridMetricState\n ): number {\n const { model, theme } = state;\n const { headerFont, headerHorizontalPadding } = theme;\n\n const headerText = model.textForColumnHeader(modelColumn);\n if (headerText) {\n const headerFontWidth = this.getWidthForFont(headerFont, state);\n return headerText.length * headerFontWidth + headerHorizontalPadding * 2;\n }\n\n return headerHorizontalPadding * 2;\n }\n\n /**\n * Calculate the width of the specified column's data\n * @param modelColumn ModelIndex of the column to get the data width for\n * @param state The grid metric state\n * @returns The calculated width of the column data\n */\n calculateColumnDataWidth(\n modelColumn: ModelIndex,\n state: GridMetricState\n ): number {\n const { top, height, width, model, theme } = state;\n const { floatingTopRowCount, floatingBottomRowCount, rowCount } = model;\n const {\n font,\n cellHorizontalPadding,\n rowHeight,\n rowHeaderWidth,\n rowFooterWidth,\n scrollBarSize,\n } = theme;\n\n let columnWidth = 0;\n\n const fontWidth = this.getWidthForFont(font, state);\n const rowsPerPage = height / rowHeight;\n const bottom = Math.ceil(top + rowsPerPage);\n GridUtils.iterateAllItems(\n top,\n bottom,\n floatingTopRowCount,\n floatingBottomRowCount,\n rowCount,\n row => {\n const modelRow = this.getModelRow(row, state);\n const text = model.textForCell(modelColumn, modelRow);\n if (text) {\n const cellPadding = cellHorizontalPadding * 2;\n columnWidth = Math.max(\n columnWidth,\n text.length * fontWidth + cellPadding\n );\n }\n }\n );\n\n columnWidth = Math.max(\n Math.min(\n columnWidth,\n (width - rowHeaderWidth - scrollBarSize - rowFooterWidth) *\n GridMetricCalculator.MAX_COLUMN_WIDTH\n ),\n cellHorizontalPadding * 2\n );\n\n return columnWidth;\n }\n\n /**\n * The coordinate for where the tree padding should be drawn\n * @param state The grid metric state\n * @returns The coordinate for tree padding\n */\n calculateTreePaddingX(state: GridMetricState): Coordinate {\n const { top, height, model, theme } = state;\n const { rowHeight, treeDepthIndent } = theme;\n if (!isExpandableGridModel(model) || !model.hasExpandableRows) {\n return 0;\n }\n let treePadding = 0;\n\n const rowsPerPage = height / rowHeight;\n const bottom = Math.ceil(top + rowsPerPage);\n for (let row = top; row <= bottom; row += 1) {\n const modelRow = this.getModelRow(row, state);\n const depth = model.depthForRow(modelRow);\n treePadding = Math.max(treePadding, treeDepthIndent * (depth + 1));\n }\n\n return treePadding;\n }\n\n /**\n * Get the width of the provided font. Exploits the fact that we're\n * using tabular figures so every character is same width\n * @param font The font to get the width for\n * @param state The grid metric state\n * @returns Width of the char `8` for the specified font\n */\n getWidthForFont(font: GridFont, state: GridMetricState): number {\n if (this.fontWidths.has(font)) {\n return getOrThrow(this.fontWidths, font);\n }\n const { context } = state;\n context.font = font;\n const textMetrics = context.measureText('8');\n const { width } = textMetrics;\n\n // context.font changes the string a little bit, e.g. '10px Arial, sans serif' => '10px Arial, \"sans serif\"'\n // Rather than require checking with the correct font def (theme, or context font), just key it to both\n this.fontWidths.set(font, width);\n this.fontWidths.set(context.font, width);\n\n return width;\n }\n\n /**\n * Sets the width for the specified column\n * @param column The column model index to set\n * @param size The size to set it to\n */\n setColumnWidth(column: ModelIndex, size: number): void {\n // Always use a new instance of the map so any consumer of the metrics knows there has been a change\n const userColumnWidths = new Map(this.userColumnWidths);\n userColumnWidths.set(column, Math.ceil(size));\n trimMap(userColumnWidths);\n this.userColumnWidths = userColumnWidths;\n }\n\n /**\n * Resets the column width for the specified column to the calculated width\n * @param column The column model index to reset\n */\n resetColumnWidth(column: ModelIndex): void {\n // Always use a new instance of the map so any consumer of the metrics knows there has been a change\n const userColumnWidths = new Map(this.userColumnWidths);\n userColumnWidths.delete(column);\n this.userColumnWidths = userColumnWidths;\n }\n\n /**\n * Sets the width for the specified row\n * @param row The row model index to set\n * @param size The size to set it to\n */\n setRowHeight(row: ModelIndex, size: number): void {\n // Always use a new instance of the map so any consumer of the metrics knows there has been a change\n const userRowHeights = new Map(this.userRowHeights);\n userRowHeights.set(row, Math.ceil(size));\n trimMap(userRowHeights);\n this.userRowHeights = userRowHeights;\n }\n\n /**\n * Resets the row height for the specified row to the calculated height\n * @param row The row model index to reset\n */\n resetRowHeight(row: ModelIndex): void {\n // Always use a new instance of the map so any consumer of the metrics knows there has been a change\n const userRowHeights = new Map(this.userRowHeights);\n userRowHeights.delete(row);\n this.userRowHeights = userRowHeights;\n this.calculatedRowHeights.delete(row);\n }\n}\n\nexport default GridMetricCalculator;\n"],"file":"GridMetricCalculator.js"}
|
|
1
|
+
{"version":3,"sources":["../src/GridMetricCalculator.ts"],"names":["clamp","GridUtils","isExpandableGridModel","getOrThrow","map","key","defaultValue","undefined","value","get","Error","trimMap","cacheSize","GridMetricCalculator","CACHE_SIZE","targetSize","Math","floor","size","iter","keys","delete","next","getFloatingCoordinates","startCount","endCount","totalCount","max","sizeMap","coordinates","Map","x","i","set","constructor","userColumnWidths","userRowHeights","calculatedColumnWidths","calculatedRowHeights","fontWidths","modelRows","modelColumns","movedRows","movedColumns","getMetrics","state","left","top","leftOffset","topOffset","width","height","theme","model","rowHeight","rowHeaderWidth","rowFooterWidth","columnWidth","columnHeaderHeight","minScrollHandleSize","scrollBarSize","clear","columnCount","rowCount","floatingTopRowCount","floatingBottomRowCount","floatingLeftColumnCount","floatingRightColumnCount","firstRow","getFirstRow","firstColumn","getFirstColumn","gridX","getGridX","gridY","getGridY","treePaddingX","hasExpandableRows","calculateTreePaddingX","treePaddingY","visibleRowHeights","getVisibleRowHeights","visibleColumnWidths","getVisibleColumnWidths","visibleRows","Array","from","visibleColumns","getFloatingRowHeights","getFloatingColumnWidths","visibleColumnXs","getVisibleColumnXs","visibleRowYs","getVisibleRowYs","bottom","length","right","bottomViewport","getBottomViewport","rightViewport","getRightViewport","columnWidthValues","values","rowHeightValues","maxX","reduce","w","maxY","y","h","floatingBottomHeight","getFloatingBottomHeight","lastLeft","getLastLeft","lastTop","getLastTop","scrollableContentWidth","scrollableContentHeight","scrollableViewportWidth","scrollableViewportHeight","hasHorizontalBar","horizontalBarHeight","hasVerticalBar","verticalBarWidth","barWidth","barHeight","horizontalHandlePercent","verticalHandlePercent","handleWidth","handleHeight","leftColumnWidth","topRowHeight","leftOffsetPercent","topOffsetPercent","horizontalScrollPercent","verticalScrollPercent","scrollX","scrollY","floatingRows","getFloatingRowYs","floatingColumns","getFloatingColumnXs","allRows","concat","allColumns","getModelRows","getModelColumns","visibleRowTreeBoxes","getVisibleRowTreeBoxes","topVisible","getTopVisible","leftVisible","getLeftVisible","bottomVisible","getBottomVisible","rightVisible","getRightVisible","floatingTopHeight","getFloatingTopHeight","floatingLeftWidth","getFloatingLeftWidth","floatingRightWidth","getFloatingRightWidth","getVisibleHeight","getVisibleWidth","getFirstIndex","itemSizes","getModelIndex","modelIndex","getModelColumn","bind","getModelRow","visibleWidth","getVisibleColumnWidth","min","visibleHeight","getVisibleRowHeight","getTopForTopVisible","getTopForBottomVisible","availableHeight","getLeftForLeftVisible","getLeftForRightVisible","availableWidth","rowHeights","row","columnWidths","column","columnWidthMap","rowHeightMap","treeDepthIndent","treeHorizontalPadding","forEach","modelRow","isRowExpandable","depth","depthForRow","x1","x2","y1","y2","floatingWidth","floatingHeight","rowY","columnX","getLastIndexViewport","items","itemXs","maxSize","defaultItemSize","lastIndex","dataSize","ceil","getVisibleItemSize","userSizes","calculateSize","calculatedSize","calculateRowHeight","modelColumn","calculateColumnWidth","visibleRow","has","visibleColumn","autoSizeRows","cachedValue","autoSizeColumns","minColumnWidth","headerWidth","calculateColumnHeaderWidth","dataWidth","calculateColumnDataWidth","headerFont","headerHorizontalPadding","headerText","textForColumnHeader","headerFontWidth","getWidthForFont","font","cellHorizontalPadding","fontWidth","rowsPerPage","iterateAllItems","text","textForCell","cellPadding","MAX_COLUMN_WIDTH","treePadding","context","textMetrics","measureText","setColumnWidth","resetColumnWidth","setRowHeight","resetRowHeight"],"mappings":"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","sourcesContent":["import clamp from 'lodash.clamp';\nimport GridModel from './GridModel';\nimport type {\n GridMetrics,\n BoxCoordinates,\n Coordinate,\n CoordinateMap,\n VisibleIndex,\n IndexModelMap,\n ModelIndex,\n ModelSizeMap,\n MoveOperation,\n SizeMap,\n} from './GridMetrics';\nimport GridUtils from './GridUtils';\nimport { GridFont, GridTheme } from './GridTheme';\nimport { isExpandableGridModel } from './ExpandableGridModel';\n\n/* eslint class-methods-use-this: \"off\" */\n/* eslint react/destructuring-assignment: \"off\" */\n\nexport interface GridMetricState {\n // The top/left cell of the scrolled viewport\n left: VisibleIndex;\n top: VisibleIndex;\n\n // The scroll offset within the top/left of the viewport\n leftOffset: Coordinate;\n topOffset: Coordinate;\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 // Moved columns/rows in the grid\n movedColumns: MoveOperation[];\n movedRows: MoveOperation[];\n\n // Whether the scrollbars are currently being dragged\n isDraggingHorizontalScrollBar: boolean;\n isDraggingVerticalScrollBar: boolean;\n}\n\n/**\n * Retrieve a value from a map. If the value is not found and no default value is provided, throw.\n * Use when the value _must_ be present\n * @param map The map to get the value from\n * @param key The key to fetch the value for\n * @param defaultValue A default value to set if the key is not present\n * @returns The value set for that key\n */\nexport function getOrThrow<K, V>(\n map: Map<K, V>,\n key: K,\n defaultValue: V | undefined = undefined\n): V {\n const value = map.get(key) ?? defaultValue;\n if (value !== undefined) {\n return value;\n }\n\n throw new Error(`Missing value for key ${key}`);\n}\n\n/**\n * Trim the provided map in place. Trims oldest inserted items down to the target size if the cache size is exceeded.\n * Instead of trimming one item on every tick, we trim half the items so there isn't a cache clear on every new item.\n * @param map The map to trim\n * @param cacheSize The maximum number of elements to cache\n * @param targetSize The number of elements to reduce the cache down to if `cacheSize` is exceeded\n */\nexport function trimMap(\n map: Map<unknown, unknown>,\n cacheSize = GridMetricCalculator.CACHE_SIZE,\n targetSize = Math.floor(cacheSize / 2)\n): void {\n if (map.size > cacheSize) {\n const iter = map.keys();\n while (map.size > targetSize) {\n map.delete(iter.next().value);\n }\n }\n}\n\n/**\n * Get the coordinates of floating items in one dimension.\n * Can be used for getting the y coordinates of floating rows, or x coordinates of floating columns, calculated using the `sizeMap` passed in.\n * @param startCount The number of floating items at the start (ie. `floatingTopRowCount` for rows, `floatingLeftColumnCount` for columns)\n * @param endCount The number of floating items at the end (ie. `floatingBottomRowCount` for rows, `floatingRightColumnCount` for columns)\n * @param totalCount Total number of items in this dimension (ie. `rowCount` for rows, `columnCount` for columns)\n * @param max The max coordinate value (ie. `maxY` for rows, `maxX` for columns)\n * @param sizeMap Map from index to size of item (ie. `rowHeightMap` for rows, `columnWidthMap` for columns)\n */\nexport function getFloatingCoordinates(\n startCount: number,\n endCount: number,\n totalCount: number,\n max: number,\n sizeMap: SizeMap\n): CoordinateMap {\n const coordinates = new Map();\n let x = 0;\n for (let i = 0; i < startCount && i < totalCount; i += 1) {\n coordinates.set(i, x);\n x += getOrThrow(sizeMap, i);\n }\n\n x = max;\n for (let i = 0; i < endCount && totalCount - i - 1 >= 0; i += 1) {\n x -= getOrThrow(sizeMap, totalCount - i - 1);\n coordinates.set(totalCount - i - 1, x);\n }\n return coordinates;\n}\n\n/**\n * Class to calculate all the metrics for drawing a grid.\n * Call getMetrics() with the state to get the full metrics.\n * Override this class and override the individual methods to provide additional functionality.\n */\nexport class GridMetricCalculator {\n /** The size of the caches this calculator stores */\n static CACHE_SIZE = 10000;\n\n /** The maximum column width as a percentage of the full grid */\n static MAX_COLUMN_WIDTH = 0.8;\n\n /** User set column widths */\n protected userColumnWidths: ModelSizeMap;\n\n /** User set row heights */\n protected userRowHeights: ModelSizeMap;\n\n /** Calculated column widths based on cell contents */\n protected calculatedColumnWidths: ModelSizeMap;\n\n /** Calculated row heights based on cell contents */\n protected calculatedRowHeights: ModelSizeMap;\n\n /** Cache of fonts to estimated width of one char */\n protected fontWidths: Map<string, number>;\n\n /** Map from visible index to model index for rows (e.g. reversing movedRows operations) */\n protected modelRows: IndexModelMap;\n\n /** Map from visible index to model index for columns (e.g. reversing movedColumns operations) */\n protected modelColumns: IndexModelMap;\n\n /** List of moved row operations. Need to track the previous value so we know if modelRows needs to be cleared. */\n protected movedRows: MoveOperation[];\n\n /** List of moved column operations. Need to track the previous value so we know if modelColumns needs to be cleared. */\n protected movedColumns: MoveOperation[];\n\n constructor({\n userColumnWidths = new Map(),\n userRowHeights = new Map(),\n calculatedColumnWidths = new Map(),\n calculatedRowHeights = new Map(),\n fontWidths = new Map(),\n modelRows = new Map(),\n modelColumns = new Map(),\n movedRows = [],\n movedColumns = [],\n } = {}) {\n this.userColumnWidths = userColumnWidths;\n this.userRowHeights = userRowHeights;\n this.calculatedRowHeights = calculatedRowHeights;\n this.calculatedColumnWidths = calculatedColumnWidths;\n this.fontWidths = fontWidths;\n\n // Need to track the last moved rows/columns array so we know if we need to reset our models cache\n this.modelRows = modelRows;\n this.modelColumns = modelColumns;\n this.movedRows = movedRows;\n this.movedColumns = movedColumns;\n }\n\n /**\n * Get the metrics for the provided metric state\n * @params state The state to get metrics for\n * @returns The full metrics\n */\n getMetrics(state: GridMetricState): GridMetrics {\n const {\n left,\n top,\n leftOffset,\n topOffset,\n width,\n height,\n theme,\n model,\n movedRows,\n movedColumns,\n } = state;\n const {\n rowHeight,\n rowHeaderWidth,\n rowFooterWidth,\n columnWidth,\n columnHeaderHeight,\n minScrollHandleSize,\n scrollBarSize,\n } = theme;\n\n if (movedRows !== this.movedRows) {\n this.movedRows = movedRows;\n this.modelRows.clear();\n }\n\n if (movedColumns !== this.movedColumns) {\n this.movedColumns = movedColumns;\n this.modelColumns.clear();\n }\n\n const {\n columnCount,\n rowCount,\n floatingTopRowCount,\n floatingBottomRowCount,\n floatingLeftColumnCount,\n floatingRightColumnCount,\n } = model;\n\n // Get some basic metrics\n const firstRow = this.getFirstRow(state);\n const firstColumn = this.getFirstColumn(state);\n\n const gridX = this.getGridX(state);\n const gridY = this.getGridY(state);\n\n const treePaddingX =\n isExpandableGridModel(model) && model.hasExpandableRows\n ? this.calculateTreePaddingX(state)\n : 0;\n const treePaddingY = 0; // We don't support trees on columns (at least not yet)\n\n let visibleRowHeights = this.getVisibleRowHeights(state);\n let visibleColumnWidths = this.getVisibleColumnWidths(\n state,\n firstColumn,\n treePaddingX\n );\n\n // Calculate the metrics for the main grid\n const visibleRows = Array.from(visibleRowHeights.keys());\n const visibleColumns = Array.from(visibleColumnWidths.keys());\n\n // Add the floating row heights/column widths\n // TODO #316: Create an allRowHeights/allColumnWidths maps\n visibleRowHeights = new Map([\n ...visibleRowHeights,\n ...this.getFloatingRowHeights(state),\n ]);\n visibleColumnWidths = new Map([\n ...visibleColumnWidths,\n ...this.getFloatingColumnWidths(state),\n ]);\n\n let visibleColumnXs = this.getVisibleColumnXs(\n visibleColumnWidths,\n visibleColumns,\n leftOffset\n );\n let visibleRowYs = this.getVisibleRowYs(\n visibleRowHeights,\n visibleRows,\n topOffset\n );\n\n const bottom =\n visibleRows.length > 0 ? visibleRows[visibleRows.length - 1] : top;\n const right =\n visibleColumns.length > 0\n ? visibleColumns[visibleColumns.length - 1]\n : left;\n\n const bottomViewport = this.getBottomViewport(\n state,\n visibleRows,\n visibleRowYs,\n visibleRowHeights\n );\n const rightViewport = this.getRightViewport(\n state,\n visibleColumns,\n visibleColumnXs,\n visibleColumnWidths\n );\n\n const columnWidthValues = Array.from(visibleColumnWidths.values());\n const rowHeightValues = Array.from(visibleRowHeights.values());\n const maxX = columnWidthValues.reduce((x, w) => x + w, 0) - leftOffset;\n const maxY = rowHeightValues.reduce((y, h) => y + h, 0) - topOffset;\n\n const floatingBottomHeight = this.getFloatingBottomHeight(\n state,\n visibleRowHeights\n );\n\n const lastLeft = this.getLastLeft(\n state,\n null,\n width - gridX - scrollBarSize - rowFooterWidth\n );\n const lastTop = this.getLastTop(\n state,\n null,\n height - gridY - scrollBarSize - floatingBottomHeight\n );\n\n // How much total space the content will take\n const scrollableContentWidth = leftOffset + maxX + rowFooterWidth;\n const scrollableContentHeight = topOffset + maxY;\n\n // Visible space available in the canvas viewport\n const scrollableViewportWidth = width - gridX;\n const scrollableViewportHeight = height - gridY;\n\n // Calculate some metrics for the scroll bars\n const hasHorizontalBar =\n lastLeft > 0 || scrollableContentWidth > scrollableViewportWidth;\n const horizontalBarHeight = hasHorizontalBar ? scrollBarSize : 0;\n const hasVerticalBar =\n lastTop > 0 ||\n scrollableContentHeight > scrollableViewportHeight - horizontalBarHeight;\n const verticalBarWidth = hasVerticalBar ? scrollBarSize : 0;\n const barWidth = width - rowHeaderWidth - verticalBarWidth;\n const barHeight = height - columnHeaderHeight - horizontalBarHeight;\n\n // How big the scroll handle is relative to the bar\n const horizontalHandlePercent =\n columnCount === 1\n ? barWidth / scrollableContentWidth\n : (columnCount - lastLeft) / columnCount;\n\n const verticalHandlePercent =\n rowCount === 1\n ? barHeight / scrollableContentHeight\n : (rowCount - lastTop) / rowCount;\n\n const handleWidth = hasHorizontalBar\n ? clamp(\n barWidth * horizontalHandlePercent,\n minScrollHandleSize,\n barWidth - 1\n )\n : 0;\n const handleHeight = hasVerticalBar\n ? clamp(\n barHeight * verticalHandlePercent,\n minScrollHandleSize,\n barHeight - 1\n )\n : 0;\n\n const leftColumnWidth = getOrThrow(visibleColumnWidths, left, 0);\n const topRowHeight = getOrThrow(visibleRowHeights, top, 0);\n const leftOffsetPercent =\n leftColumnWidth > 0 ? leftOffset / leftColumnWidth : 0;\n const topOffsetPercent = topRowHeight > 0 ? topOffset / topRowHeight : 0;\n\n // How much of the available space has been scrolled\n const horizontalScrollPercent =\n columnCount === 1\n ? leftOffset / (scrollableContentWidth - scrollableViewportWidth)\n : (left + leftOffsetPercent) / lastLeft;\n const verticalScrollPercent =\n rowCount === 1\n ? topOffset / (scrollableContentHeight - scrollableViewportHeight)\n : (top + topOffsetPercent) / lastTop;\n\n const scrollX = hasHorizontalBar\n ? horizontalScrollPercent * (barWidth - handleWidth)\n : 0;\n const scrollY = hasVerticalBar\n ? verticalScrollPercent * (barHeight - handleHeight)\n : 0;\n\n // Now add the floating sections positions\n let floatingRows: ModelIndex[] = [];\n if (floatingTopRowCount > 0 || floatingBottomRowCount > 0) {\n floatingRows = [\n ...Array(floatingTopRowCount).keys(),\n ...[...Array(floatingBottomRowCount).keys()].map(i => rowCount - i - 1),\n ];\n visibleRowYs = new Map([\n ...visibleRowYs,\n ...this.getFloatingRowYs(\n state,\n visibleRowHeights,\n Math.floor(height - gridY - horizontalBarHeight)\n ),\n ]);\n }\n\n let floatingColumns: ModelIndex[] = [];\n if (floatingLeftColumnCount > 0 || floatingRightColumnCount > 0) {\n floatingColumns = [\n ...Array(floatingLeftColumnCount).keys(),\n ...[...Array(floatingRightColumnCount).keys()].map(\n i => columnCount - i - 1\n ),\n ];\n visibleColumnXs = new Map([\n ...visibleColumnXs,\n ...this.getFloatingColumnXs(\n state,\n visibleColumnWidths,\n Math.floor(width - gridX - verticalBarWidth)\n ),\n ]);\n }\n\n const allRows = visibleRows.concat(floatingRows);\n const allColumns = visibleColumns.concat(floatingColumns);\n const modelRows = this.getModelRows(allRows, state);\n const modelColumns = this.getModelColumns(allColumns, state);\n\n const visibleRowTreeBoxes = this.getVisibleRowTreeBoxes(\n visibleRowHeights,\n modelRows,\n state\n );\n\n // Calculate the visible viewport based on scroll position and floating sections\n const topVisible = this.getTopVisible(\n state,\n visibleRowYs,\n visibleRowHeights,\n visibleRows\n );\n const leftVisible = this.getLeftVisible(\n state,\n visibleColumnXs,\n visibleColumnWidths,\n visibleColumns\n );\n const bottomVisible =\n lastTop > 0\n ? this.getBottomVisible(\n state,\n visibleRowYs,\n visibleRowHeights,\n visibleRows,\n gridY\n )\n : bottom;\n const rightVisible =\n lastLeft > 0\n ? this.getRightVisible(\n state,\n visibleColumnXs,\n visibleColumnWidths,\n visibleColumns,\n gridX\n )\n : right;\n\n const floatingTopHeight = this.getFloatingTopHeight(\n state,\n visibleRowHeights\n );\n const floatingLeftWidth = this.getFloatingLeftWidth(\n state,\n visibleColumnWidths\n );\n const floatingRightWidth = this.getFloatingRightWidth(\n state,\n visibleColumnWidths\n );\n\n const {\n fontWidths,\n userColumnWidths,\n userRowHeights,\n calculatedRowHeights,\n calculatedColumnWidths,\n } = this;\n\n return {\n // Row/Column metrics from model\n rowHeight,\n rowHeaderWidth,\n rowFooterWidth,\n rowCount,\n columnWidth,\n columnCount,\n columnHeaderHeight,\n\n // Floating row and column counts\n floatingTopRowCount,\n floatingBottomRowCount,\n floatingLeftColumnCount,\n floatingRightColumnCount,\n\n // The grid offset from the top left\n gridX,\n gridY,\n\n // Index of non-hidden row/columns\n firstRow,\n firstColumn,\n\n // The amount of padding for tree (if applicable)\n treePaddingX,\n treePaddingY,\n\n // What viewport is currently visible, limited by data size\n left,\n top,\n bottom,\n right,\n topOffset,\n leftOffset,\n\n // Bottom and right that are fully visible, not overlapped by scroll bars or anything\n topVisible,\n leftVisible,\n bottomVisible,\n rightVisible,\n\n // Bottom and right of the viewport, not limited by data size\n bottomViewport,\n rightViewport,\n\n // Canvas width/height\n width,\n height,\n\n // Max x/y coordinate of the grid (does not include headers)\n maxX,\n maxY,\n\n // Last valid column/row that can be the left/top of the grid\n lastLeft,\n lastTop,\n\n // Scroll bar metrics\n barHeight,\n barWidth,\n handleHeight,\n handleWidth,\n hasHorizontalBar,\n hasVerticalBar,\n verticalBarWidth,\n horizontalBarHeight,\n\n // The vertical x/y scroll amount\n scrollX,\n scrollY,\n\n scrollableContentWidth,\n scrollableContentHeight,\n\n scrollableViewportWidth,\n scrollableViewportHeight,\n\n // Array of visible rows/columns, by grid index\n visibleRows,\n visibleColumns,\n\n // Array of floating rows/columns, by grid index\n floatingRows,\n floatingColumns,\n\n // Array of all rows/columns, visible and floating, by grid index\n allRows,\n allColumns,\n\n // Map of the height/width of visible rows/columns\n // TODO #316: This should be split into allRowHeights/visibleRowHeights/floatingRowHeights ideally\n visibleRowHeights,\n visibleColumnWidths,\n\n // Floating metrics\n floatingTopHeight,\n floatingBottomHeight,\n floatingLeftWidth,\n floatingRightWidth,\n\n // Map of the X/Y coordinates of the rows/columns, from the top left of the grid\n visibleRowYs,\n visibleColumnXs,\n\n // The boxes user can click on for expanding/collapsing tree rows\n visibleRowTreeBoxes,\n\n // Mapping from visible row indexes to the model row/columns they pull from\n modelRows,\n modelColumns,\n\n // Map of the width of the fonts\n fontWidths,\n\n // Map of user set column/row width/height\n userColumnWidths,\n userRowHeights,\n\n // Map of calculated row/column height/width\n calculatedRowHeights,\n calculatedColumnWidths,\n };\n }\n\n /**\n * The x offset of the grid\n * @param state The current grid state\n * @returns x value of the left side of the first cell\n */\n getGridX(state: GridMetricState): Coordinate {\n const { theme } = state;\n const { rowHeaderWidth } = theme;\n\n return rowHeaderWidth;\n }\n\n /**\n * The y offset of the grid\n * @param state The current grid state\n * @returns y value of the top side of the first cell\n */\n getGridY(state: GridMetricState): Coordinate {\n const { theme } = state;\n const { columnHeaderHeight } = theme;\n\n return columnHeaderHeight;\n }\n\n /**\n * The height of the \"visible\" area (excludes floating areas)\n * @param state The current grid state\n * @param visibleRowHeights All the visible row heights\n * @returns The visible height in pixels\n */\n getVisibleHeight(\n state: GridMetricState,\n visibleRowHeights: SizeMap = this.getFloatingRowHeights(state)\n ): number {\n const { height, theme } = state;\n const { scrollBarSize } = theme;\n const gridY = this.getGridY(state);\n const floatingBottomHeight = this.getFloatingBottomHeight(\n state,\n visibleRowHeights\n );\n const floatingTopHeight = this.getFloatingTopHeight(\n state,\n visibleRowHeights\n );\n\n return (\n height - floatingBottomHeight - floatingTopHeight - gridY - scrollBarSize\n );\n }\n\n /**\n * The width of the \"visible\" area (excludes floating areas)\n * @param state The current grid state\n * @param visibleColumnWidths All the visible column widths\n * @returns The visible width in pixels\n */\n getVisibleWidth(\n state: GridMetricState,\n visibleColumnWidths: SizeMap = this.getFloatingColumnWidths(state)\n ): number {\n const { width, theme } = state;\n const { scrollBarSize, rowFooterWidth } = theme;\n const gridX = this.getGridX(state);\n const floatingRightWidth = this.getFloatingRightWidth(\n state,\n visibleColumnWidths\n );\n const floatingLeftWidth = this.getFloatingLeftWidth(\n state,\n visibleColumnWidths\n );\n\n return (\n width -\n floatingLeftWidth -\n floatingRightWidth -\n gridX -\n scrollBarSize -\n rowFooterWidth\n );\n }\n\n /**\n * Retrieve the index of the first non-hidden item\n * @param itemSizes The size of the items in this dimension\n * @param getModelIndex A function to map from the Index to the ModelIndex\n * @param state The current grid state\n * @returns The first item that is not hidden\n */\n getFirstIndex(\n itemSizes: ModelSizeMap,\n getModelIndex: (\n visibleIndex: VisibleIndex,\n state: GridMetricState\n ) => ModelIndex,\n state: GridMetricState\n ): VisibleIndex {\n // We only need to check at the very most the number of items the user has hidden + 1\n const max = itemSizes.size + 1;\n for (let i = 0; i < max; i += 1) {\n const modelIndex = getModelIndex(i, state);\n if (itemSizes.get(modelIndex) !== 0) {\n return i;\n }\n }\n return 0;\n }\n\n /**\n * Get the first column index that isn't hidden\n * @param state The current grid state\n * @returns The first column that is not hidden\n */\n getFirstColumn(state: GridMetricState): VisibleIndex {\n return this.getFirstIndex(\n this.userColumnWidths,\n this.getModelColumn.bind(this),\n state\n );\n }\n\n /**\n * Get the first row index that isn't hidden\n * @param state The current grid state\n * @returns The first row that is not hidden\n */\n getFirstRow(state: GridMetricState): VisibleIndex {\n return this.getFirstIndex(\n this.userRowHeights,\n this.getModelRow.bind(this),\n state\n );\n }\n\n /**\n * Get the last column that can be the left most column (e.g. scrolled to the right)\n * If no right column is provided, then the last column is used.\n * @param state The current grid state\n * @param right The right-most column to be visible, or null to default to last cell\n * @param visibleWidth The width of the \"visible\" area (excluding floating items)\n * @returns The index of the last left visible column\n */\n getLastLeft(\n state: GridMetricState,\n right: VisibleIndex | null = null,\n visibleWidth: number = this.getVisibleWidth(state)\n ): VisibleIndex {\n const { model } = state;\n const { columnCount, floatingRightColumnCount } = model;\n\n if (columnCount === 0) {\n return 0;\n }\n\n let lastLeft = Math.max(0, columnCount - floatingRightColumnCount - 1);\n if (right != null) {\n lastLeft = right;\n }\n let x = 0;\n while (lastLeft >= 0) {\n const columnWidth = this.getVisibleColumnWidth(lastLeft, state);\n x += columnWidth;\n\n if (x >= visibleWidth) {\n return Math.min(lastLeft + 1, columnCount - 1);\n }\n\n lastLeft -= 1;\n }\n\n return 0;\n }\n\n /**\n * The last row that can be the top row (e.g. scrolled to the bottom)\n * If no bottom row is provided, then the last row that is not floating is used\n */\n\n /**\n * The last row that can be the top row (e.g. scrolled to the bottom)\n * If no bottom row is provided, then the last row that is not floating is used\n * @param state The current grid state\n * @param bottom The bottom-most row to be visible, or null to default to last cell\n * @param visibleHeight The height of the \"visible\" area (excluding floating items)\n * @returns The index of the last left visible column\n */\n getLastTop(\n state: GridMetricState,\n bottom: VisibleIndex | null = null,\n visibleHeight: number = this.getVisibleHeight(state)\n ): VisibleIndex {\n const { model } = state;\n const { rowCount, floatingBottomRowCount } = model;\n\n let lastTop = Math.max(0, rowCount - floatingBottomRowCount - 1);\n if (bottom != null) {\n lastTop = bottom;\n }\n let y = 0;\n while (lastTop > 0) {\n const rowHeight = this.getVisibleRowHeight(lastTop, state);\n y += rowHeight;\n\n if (y >= visibleHeight) {\n return Math.min(lastTop + 1, rowCount - 1);\n }\n\n lastTop -= 1;\n }\n\n return 0;\n }\n\n /**\n * Retrieve the top row to scroll to so the passed in `topVisible` is completely visible, taking the floating rows into account.\n * The `top` row is at the top underneath any floating rows, whereas `topVisible` is visible below the floating rows.\n * If there are no floating rows, they should be the same value.\n * @param state The grid metric state\n * @param topVisible The top row to be visible\n * @returns The index of the top row to scroll to (under the floating top rows)\n */\n getTopForTopVisible(\n state: GridMetricState,\n topVisible: VisibleIndex\n ): VisibleIndex {\n const floatingTopHeight = this.getFloatingTopHeight(state);\n let top = topVisible;\n let y = 0;\n while (top > 0 && y < floatingTopHeight) {\n top -= 1;\n y += this.getVisibleRowHeight(top, state);\n }\n return top;\n }\n\n /**\n * Retrieve the top row to scroll to so the passed in `bottomVisible` is completely visible\n * at the bottom of the visible viewport, taking the floating rows into account.\n * @param state The grid metric state\n * @param bottomVisible The bottom row to be visible\n * @returns The index of the top row to scroll to (under the floating top rows)\n */\n getTopForBottomVisible(\n state: GridMetricState,\n bottomVisible: VisibleIndex\n ): VisibleIndex {\n const { height } = state;\n const gridY = this.getGridY(state);\n const floatingBottomHeight = this.getFloatingBottomHeight(state);\n const availableHeight = height - gridY - floatingBottomHeight;\n return this.getLastTop(state, bottomVisible, availableHeight);\n }\n\n /**\n * Retrieve the left column to scroll to so the passed in `leftVisible` is completely visible\n * at the left of the visible viewport, taking the floating columns into account.\n * @param state The grid metric state\n * @param leftVisible The left column to be visible\n * @returns The index of the left column to scroll to (under the floating left columns)\n */\n getLeftForLeftVisible(\n state: GridMetricState,\n leftVisible: VisibleIndex\n ): VisibleIndex {\n const floatingLeftWidth = this.getFloatingLeftWidth(state);\n let left = leftVisible;\n let x = 0;\n while (left > 0 && x < floatingLeftWidth) {\n left -= 1;\n x += this.getVisibleColumnWidth(left, state);\n }\n return left;\n }\n\n /**\n * Retrieve the left column to scroll to so the passed in `rightVisible` is completely visible\n * at the right of the visible viewport, taking the floating columns into account.\n * @param state The grid metric state\n * @param rightVisible The right column to be visible\n * @returns The index of the left column to scroll to (under the floating left columns)\n */\n getLeftForRightVisible(\n state: GridMetricState,\n rightVisible: VisibleIndex\n ): VisibleIndex {\n const { width } = state;\n const gridX = this.getGridX(state);\n const floatingRightWidth = this.getFloatingRightWidth(state);\n const availableWidth = width - gridX - floatingRightWidth;\n return this.getLastLeft(state, rightVisible, availableWidth);\n }\n\n /**\n * Retrieve a map of the height of each floating row\n * @param state The grid metric state\n * @returns The heights of all the floating rows\n */\n getFloatingRowHeights(state: GridMetricState): SizeMap {\n const { model } = state;\n const { floatingTopRowCount, floatingBottomRowCount, rowCount } = model;\n\n const rowHeights = new Map();\n for (let i = 0; i < floatingTopRowCount && i < rowCount; i += 1) {\n rowHeights.set(i, this.getVisibleRowHeight(i, state));\n }\n\n for (\n let i = 0;\n i < floatingBottomRowCount && rowCount - i - 1 >= 0;\n i += 1\n ) {\n const row = rowCount - i - 1;\n rowHeights.set(row, this.getVisibleRowHeight(row, state));\n }\n\n return rowHeights;\n }\n\n /**\n * Retrieve a map of the height of all the visible rows (non-floating)\n * @param state The grid metric state\n * @returns The heights of all the visible rows\n */\n getVisibleRowHeights(state: GridMetricState): SizeMap {\n const { top, topOffset, height, model } = state;\n\n let y = 0;\n let row = top;\n const rowHeights = new Map();\n const { rowCount } = model;\n while (y < height + topOffset && row < rowCount) {\n const rowHeight = this.getVisibleRowHeight(row, state);\n rowHeights.set(row, rowHeight);\n y += rowHeight;\n row += 1;\n }\n\n return rowHeights;\n }\n\n /**\n * Retrieve a map of the width of each floating column\n * @param state The grid metric state\n * @param firstColumn The first non-hidden column\n * @param treePaddingX The amount of padding taken up for the tree expansion buttons\n * @returns The widths of all the floating columns\n */\n getFloatingColumnWidths(\n state: GridMetricState,\n firstColumn: VisibleIndex = this.getFirstColumn(state),\n treePaddingX: number = this.calculateTreePaddingX(state)\n ): SizeMap {\n const { model } = state;\n const { columnCount, floatingLeftColumnCount, floatingRightColumnCount } =\n model;\n\n const columnWidths = new Map();\n for (let i = 0; i < floatingLeftColumnCount && i < columnCount; i += 1) {\n columnWidths.set(\n i,\n this.getVisibleColumnWidth(i, state, firstColumn, treePaddingX)\n );\n }\n\n for (\n let i = 0;\n i < floatingRightColumnCount && columnCount - i - 1 >= 0;\n i += 1\n ) {\n const column = columnCount - i - 1;\n columnWidths.set(\n column,\n this.getVisibleColumnWidth(column, state, firstColumn, treePaddingX)\n );\n }\n\n return columnWidths;\n }\n\n /**\n * Retrieve a map of the width of all the visible columns (non-floating)\n * @param state The grid metric state\n * @returns The widths of all the visible columns\n */\n getVisibleColumnWidths(\n state: GridMetricState,\n firstColumn: VisibleIndex = this.getFirstColumn(state),\n treePaddingX: number = this.calculateTreePaddingX(state)\n ): SizeMap {\n const { left, leftOffset, width, model } = state;\n\n let x = 0;\n let column = left;\n const columnWidths = new Map();\n const { columnCount } = model;\n while (x < width + leftOffset && column < columnCount) {\n const columnWidth = this.getVisibleColumnWidth(\n column,\n state,\n firstColumn,\n treePaddingX\n );\n columnWidths.set(column, columnWidth);\n x += columnWidth;\n column += 1;\n }\n\n return columnWidths;\n }\n\n /**\n * Retrieve a map of all the floating columns to their x coordinate\n * @param state The grid metric state\n * @param columnWidthMap Map from visible index to column width\n * @param maxX The maximum X size for the grid\n * @returns Map of the x coordinate of all floating columns\n */\n getFloatingColumnXs(\n state: GridMetricState,\n columnWidthMap: SizeMap,\n maxX: Coordinate\n ): CoordinateMap {\n const { model } = state;\n const { columnCount, floatingLeftColumnCount, floatingRightColumnCount } =\n model;\n\n return getFloatingCoordinates(\n floatingLeftColumnCount,\n floatingRightColumnCount,\n columnCount,\n maxX,\n columnWidthMap\n );\n }\n\n /**\n * Retrieve a map of all the visible columns to their x coordinate.\n * Starts at leftOffset with the first index in `visibleColumns`, then\n * calculates all the coordinates from there\n * @param visibleColumnWidths Map of visible column index to widths\n * @param visibleColumns All visible columns\n * @param leftOffset The left scroll offset\n * @returns Map of the x coordinate of all visible columns\n */\n getVisibleColumnXs(\n visibleColumnWidths: SizeMap,\n visibleColumns: VisibleIndex[],\n leftOffset: number\n ): CoordinateMap {\n const visibleColumnXs = new Map();\n let x = -leftOffset;\n for (let i = 0; i < visibleColumns.length; i += 1) {\n const column = visibleColumns[i];\n const columnWidth = getOrThrow(visibleColumnWidths, column);\n visibleColumnXs.set(column, x);\n x += columnWidth;\n }\n\n return visibleColumnXs;\n }\n\n /**\n * Retrieve a map of all the floating rows to their y coordinate\n * @param state The grid metric state\n * @param rowHeightMap Map of visible index to row height\n * @param maxY The maximum Y size for the grid\n * @returns Map of the y coordinate of all floating rows\n */\n getFloatingRowYs(\n state: GridMetricState,\n rowHeightMap: SizeMap,\n maxY: Coordinate\n ): CoordinateMap {\n const { model } = state;\n const { floatingTopRowCount, floatingBottomRowCount, rowCount } = model;\n\n return getFloatingCoordinates(\n floatingTopRowCount,\n floatingBottomRowCount,\n rowCount,\n maxY,\n rowHeightMap\n );\n }\n\n /**\n * Retrieve a map of all the visible rows to their y coordinate.\n * Starts at topOffset with the first index in `visibleRows`, then\n * calculates all the coordinates from there\n * @param visibleRowHeights Map of visible row index to heights\n * @param visibleRows All visible rows\n * @param topOffset The top scroll offset\n * @returns Map of the y coordinate of all visible rows\n */\n getVisibleRowYs(\n visibleRowHeights: SizeMap,\n visibleRows: VisibleIndex[],\n topOffset: number\n ): CoordinateMap {\n const visibleRowYs = new Map();\n let y = -topOffset;\n for (let i = 0; i < visibleRows.length; i += 1) {\n const row = visibleRows[i];\n const rowHeight = getOrThrow(visibleRowHeights, row);\n visibleRowYs.set(row, y);\n y += rowHeight;\n }\n\n return visibleRowYs;\n }\n\n /**\n * Calculates the tree box click areas that are visible. In relation to the columnX/rowY\n * @param visibleRowHeights Map of visible index to row height\n * @param modelRows Map from visible `Index` to `ModelIndex`\n * @param state The grid metric state\n * @returns Coordinates of tree boxes for each row\n */\n getVisibleRowTreeBoxes(\n visibleRowHeights: SizeMap,\n modelRows: IndexModelMap,\n state: GridMetricState\n ): Map<VisibleIndex, BoxCoordinates> {\n const visibleRowTreeBoxes = new Map();\n const { model, theme } = state;\n const { treeDepthIndent, treeHorizontalPadding } = theme;\n\n if (isExpandableGridModel(model) && model.hasExpandableRows) {\n visibleRowHeights.forEach((rowHeight, row) => {\n const modelRow = getOrThrow(modelRows, row);\n if (model.isRowExpandable(modelRow)) {\n const depth = model.depthForRow(modelRow);\n const x1 = depth * treeDepthIndent + treeHorizontalPadding;\n const x2 = (depth + 1) * treeDepthIndent + treeHorizontalPadding;\n const y1 = 0;\n const y2 = rowHeight;\n visibleRowTreeBoxes.set(row, { x1, y1, x2, y2 });\n }\n });\n }\n\n return visibleRowTreeBoxes;\n }\n\n /**\n * Get the total width of the floating columns on the left\n * @param state The grid metric state\n * @param columnWidths Map of column index to width\n * @returns The total width of the floating left section\n */\n getFloatingLeftWidth(\n state: GridMetricState,\n columnWidths: SizeMap = this.getFloatingColumnWidths(state)\n ): number {\n const { model } = state;\n const { floatingLeftColumnCount } = model;\n let floatingWidth = 0;\n for (let i = 0; i < floatingLeftColumnCount; i += 1) {\n floatingWidth += getOrThrow(columnWidths, i);\n }\n return floatingWidth;\n }\n\n /**\n * Get the total width of the floating columns on the right\n * @param state The grid metric state\n * @param columnWidths Map of column index to width\n * @returns The total width of the floating right section\n */\n getFloatingRightWidth(\n state: GridMetricState,\n columnWidths: SizeMap = this.getFloatingColumnWidths(state)\n ): number {\n const { model } = state;\n const { floatingRightColumnCount, columnCount } = model;\n let floatingWidth = 0;\n for (let i = 0; i < floatingRightColumnCount; i += 1) {\n floatingWidth += getOrThrow(columnWidths, columnCount - i - 1);\n }\n\n return floatingWidth;\n }\n\n /**\n * Get the total height of the floating rows on the top\n * @param state The grid metric state\n * @param rowHeights Map of row index to height\n * @returns The total height of the floating top section\n */\n getFloatingTopHeight(\n state: GridMetricState,\n rowHeights: SizeMap = this.getFloatingRowHeights(state)\n ): number {\n const { model } = state;\n const { floatingTopRowCount } = model;\n let floatingHeight = 0;\n for (let i = 0; i < floatingTopRowCount; i += 1) {\n floatingHeight += getOrThrow(rowHeights, i);\n }\n return floatingHeight;\n }\n\n /**\n * Get the total height of the floating rows on the bottom\n * @param state The grid metric state\n * @param rowHeights Map of row index to height\n * @returns The total height of the floating bottom section\n */\n getFloatingBottomHeight(\n state: GridMetricState,\n rowHeights: SizeMap = this.getFloatingRowHeights(state)\n ): number {\n const { model } = state;\n const { floatingBottomRowCount, rowCount } = model;\n let floatingHeight = 0;\n for (let i = 0; i < floatingBottomRowCount; i += 1) {\n floatingHeight += getOrThrow(rowHeights, rowCount - i - 1);\n }\n return floatingHeight;\n }\n\n /**\n * Retrieve the index of the first fully visible row in the \"visible\" viewport of the grid.\n * E.g. First row visible after the floating rows, provided the visible rows.\n * @param state The grid metric state\n * @param visibleRowYs Map of row index to y coordinate\n * @param visibleRowHeights Map of row index to height\n * @param visibleRows Array of visible row indexes\n * @returns Index of the top visible row\n */\n getTopVisible(\n state: GridMetricState,\n visibleRowYs: CoordinateMap,\n visibleRowHeights: SizeMap,\n visibleRows: VisibleIndex[]\n ): VisibleIndex {\n const floatingHeight = this.getFloatingTopHeight(state, visibleRowHeights);\n for (let i = 0; i < visibleRows.length; i += 1) {\n const row = visibleRows[i];\n const y = getOrThrow(visibleRowYs, row);\n if (y >= floatingHeight) {\n return row;\n }\n }\n return 0;\n }\n\n /**\n * Retrieve the index of the first fully visible column in the \"visible\" viewport of the grid.\n * E.g. First column visible after the floating columns, provided the visible columns.\n * @param state The grid metric state\n * @param visibleColumnXs Map of column index to x coordinate\n * @param visibleColumnWidths Map of column index to widths\n * @param visibleColumns Array of visible row indexes\n * @returns Index of the left visible column\n */\n getLeftVisible(\n state: GridMetricState,\n visibleColumnXs: CoordinateMap,\n visibleColumnWidths: SizeMap,\n visibleColumns: VisibleIndex[]\n ): VisibleIndex {\n const floatingWidth = this.getFloatingLeftWidth(state, visibleColumnWidths);\n for (let i = 0; i < visibleColumns.length; i += 1) {\n const column = visibleColumns[i];\n const x = getOrThrow(visibleColumnXs, column);\n if (x >= floatingWidth) {\n return column;\n }\n }\n return 0;\n }\n\n /**\n * Retrieve the index of the last fully visible row in the \"visible\" viewport of the grid.\n * E.g. Last row visible before the bottom floating rows, provided the visible rows.\n * @param state The grid metric state\n * @param visibleRowYs Map of row index to y coordinate\n * @param visibleRowHeights Map of row index to height\n * @param visibleRows Array of visible row indexes\n * @param gridY The starting y coordinate of the grid\n * @returns Index of the bottom visible row\n */\n getBottomVisible(\n state: GridMetricState,\n visibleRowYs: CoordinateMap,\n visibleRowHeights: SizeMap,\n visibleRows: VisibleIndex[],\n gridY: Coordinate\n ): VisibleIndex {\n const { height, theme } = state;\n const { scrollBarSize } = theme;\n const floatingHeight = this.getFloatingBottomHeight(\n state,\n visibleRowHeights\n );\n const visibleHeight = height - gridY - scrollBarSize - floatingHeight;\n for (let i = visibleRows.length - 1; i >= 0; i -= 1) {\n const row = visibleRows[i];\n const rowY = getOrThrow(visibleRowYs, row);\n const rowHeight = getOrThrow(visibleRowHeights, row);\n if (rowY + rowHeight <= visibleHeight) {\n return row;\n }\n }\n\n return 0;\n }\n\n /**\n * Retrieve the index of the last fully visible column in the \"visible\" viewport of the grid.\n * E.g. Last column visible before the floating columns, provided the visible columns.\n * @param state The grid metric state\n * @param visibleColumnXs Map of column index to x coordinate\n * @param visibleColumnWidths Map of column index to widths\n * @param visibleColumns Array of visible column indexes\n * @returns Index of the right visible column\n */\n getRightVisible(\n state: GridMetricState,\n visibleColumnXs: CoordinateMap,\n visibleColumnWidths: SizeMap,\n visibleColumns: VisibleIndex[],\n gridX: Coordinate\n ): VisibleIndex {\n const { width, theme } = state;\n const { scrollBarSize } = theme;\n const floatingWidth = this.getFloatingRightWidth(\n state,\n visibleColumnWidths\n );\n const visibleWidth = width - gridX - scrollBarSize - floatingWidth;\n for (let i = visibleColumns.length - 1; i >= 0; i -= 1) {\n const column = visibleColumns[i];\n const columnX = getOrThrow(visibleColumnXs, column);\n const columnWidth = getOrThrow(visibleColumnWidths, column);\n if (columnX + columnWidth <= visibleWidth) {\n return column;\n }\n }\n\n return 0;\n }\n\n /**\n * Retrieve the possible bottom of the visible viewport (not limited by data size)\n * @param state The grid metric state\n * @param visibleRows Array of visible row indexes\n * @param visibleRowYs Map of row index to y coordinate\n * @param visibleRowHeights Map of row index to height\n * @returns The index of the bottom viewport possible\n */\n getBottomViewport(\n state: GridMetricState,\n visibleRows: VisibleIndex[],\n visibleRowYs: CoordinateMap,\n visibleRowHeights: SizeMap\n ): VisibleIndex {\n const { height, theme } = state;\n const { rowHeight } = theme;\n\n return this.getLastIndexViewport(\n visibleRows,\n visibleRowYs,\n visibleRowHeights,\n height,\n rowHeight\n );\n }\n\n /**\n * Retrieve the possible right of the visible viewport (not limited by data size)\n * @param state The grid metric state\n * @param visibleColumns Array of visible column indexes\n * @param visibleColumnXs Map of column index to x coordinate\n * @param visibleColumnWidths Map of column index to width\n * @returns The index of the right viewport possible\n */\n getRightViewport(\n state: GridMetricState,\n visibleColumns: VisibleIndex[],\n visibleColumnXs: CoordinateMap,\n visibleColumnWidths: SizeMap\n ): VisibleIndex {\n const { width, theme } = state;\n const { columnWidth } = theme;\n\n return this.getLastIndexViewport(\n visibleColumns,\n visibleColumnXs,\n visibleColumnWidths,\n width,\n columnWidth\n );\n }\n\n /**\n * Get the Index of the of the last index visible\n * @param items Array of visible item indexes\n * @param itemXs Map of index to coordinate\n * @param itemSizes Map of index to size\n * @param maxSize Full size of the grid\n * @param defaultItemSize Default size of an item\n * @returns The Index of the last index visible\n */\n getLastIndexViewport(\n items: VisibleIndex[],\n itemXs: CoordinateMap,\n itemSizes: SizeMap,\n maxSize: number,\n defaultItemSize: number\n ): VisibleIndex {\n let lastIndex = 0;\n let dataSize = 0;\n if (items.length > 0) {\n lastIndex = items[items.length - 1];\n dataSize =\n getOrThrow(itemXs, lastIndex) + getOrThrow(itemSizes, lastIndex);\n }\n\n if (dataSize < maxSize) {\n lastIndex += Math.ceil((maxSize - dataSize) / defaultItemSize);\n }\n\n return lastIndex;\n }\n\n /**\n * Get the size from the provided size map of the specified item\n * @param modelIndex The model index to get the size for\n * @param userSizes The user set sizes\n * @param calculateSize Method to calculate the size for this item\n * @returns The size from the provided size map of the specified item\n */\n getVisibleItemSize(\n modelIndex: ModelIndex,\n userSizes: ModelSizeMap,\n calculateSize: () => number\n ): number {\n // Always re-calculate the size of the item so the calculated size maps are populated\n const calculatedSize = calculateSize();\n return userSizes.get(modelIndex) ?? calculatedSize;\n }\n\n /**\n * Get the height of the specified row\n * @param row Index of the row to get the height of\n * @param state The grid metric state\n * @returns The height of the row specified\n */\n getVisibleRowHeight(row: VisibleIndex, state: GridMetricState): number {\n const modelRow = this.getModelRow(row, state);\n\n return this.getVisibleItemSize(modelRow, this.userRowHeights, () =>\n this.calculateRowHeight(row, modelRow, state)\n );\n }\n\n /**\n * Get the width of the specified column\n * @param column Index of the column to get the width of\n * @param state The grid metric state\n * @param firstColumn Index of first visible column\n * @param treePaddingX The amount of tree padding to add to the first visible column\n * @returns The width of the column\n */\n getVisibleColumnWidth(\n column: VisibleIndex,\n state: GridMetricState,\n firstColumn: VisibleIndex = this.getFirstColumn(state),\n treePaddingX: number = this.calculateTreePaddingX(state)\n ): number {\n const modelColumn = this.getModelColumn(column, state);\n\n return this.getVisibleItemSize(modelColumn, this.userColumnWidths, () =>\n this.calculateColumnWidth(\n column,\n modelColumn,\n state,\n firstColumn,\n treePaddingX\n )\n );\n }\n\n /**\n * Get a map of ModelIndex to Index\n * @param visibleRows Array of visible row indexes\n * @param state The grid metric state\n * @returns Map of Index to ModelIndex\n */\n getModelRows(\n visibleRows: VisibleIndex[],\n state: GridMetricState\n ): IndexModelMap {\n const modelRows = new Map();\n for (let i = 0; i < visibleRows.length; i += 1) {\n const visibleRow = visibleRows[i];\n const modelRow = this.getModelRow(visibleRow, state);\n modelRows.set(visibleRow, modelRow);\n }\n return modelRows;\n }\n\n /**\n * Get the ModelIndex of the specified row\n * @param visibleRow Index of the row\n * @param state The grid metric state\n * @returns ModelIndex of the row\n */\n getModelRow(visibleRow: VisibleIndex, state: GridMetricState): ModelIndex {\n if (this.modelRows.has(visibleRow)) {\n return getOrThrow(this.modelRows, visibleRow);\n }\n const { movedRows } = state;\n const modelRow = GridUtils.getModelIndex(visibleRow, movedRows);\n this.modelRows.set(visibleRow, modelRow);\n return modelRow;\n }\n\n /**\n * Get a map of Index to ModelIndex. Applies the move operations to get the transformation.\n * @param visibleColumns Array of visible column indexes\n * @param state The grid metric state\n * @returns Map of Index to ModelIndex\n */\n getModelColumns(\n visibleColumns: VisibleIndex[],\n state: GridMetricState\n ): IndexModelMap {\n const modelColumns = new Map();\n for (let i = 0; i < visibleColumns.length; i += 1) {\n const visibleColumn = visibleColumns[i];\n const modelColumn = this.getModelColumn(visibleColumn, state);\n modelColumns.set(visibleColumn, modelColumn);\n }\n return modelColumns;\n }\n\n /**\n * Get the ModelIndex of the specified column\n * @param visibleColumn Index of the column\n * @param state The grid metric state\n * @returns ModelIndex of the column\n */\n getModelColumn(\n visibleColumn: VisibleIndex,\n state: GridMetricState\n ): ModelIndex {\n if (this.modelColumns.has(visibleColumn)) {\n return getOrThrow(this.modelColumns, visibleColumn);\n }\n const { movedColumns } = state;\n const modelColumn = GridUtils.getModelIndex(visibleColumn, movedColumns);\n this.modelColumns.set(visibleColumn, modelColumn);\n return modelColumn;\n }\n\n /**\n * Calculate the height of the row specified.\n * @param row Index of the row to calculate the height for\n * @param modelRow ModelIndex of the row to calculate the height\n * @param state The grid metric state\n * @returns The height of the row\n */\n calculateRowHeight(\n row: VisibleIndex,\n modelRow: ModelIndex,\n state: GridMetricState\n ): number {\n const { theme } = state;\n const { autoSizeRows, rowHeight } = theme;\n if (!autoSizeRows) {\n return rowHeight;\n }\n\n const cachedValue = this.calculatedRowHeights.get(modelRow);\n if (cachedValue != null) {\n return cachedValue;\n }\n\n // Not sure how to accurately get the height of text. For now just return the theme height.\n this.calculatedRowHeights.set(modelRow, Math.ceil(rowHeight));\n trimMap(this.calculatedRowHeights);\n return rowHeight;\n }\n\n /**\n * Calculates the column width based on the provided column model index\n * @param column Index of the column to calculate the width for\n * @param modelColumn ModelIndex of the column to calculate the width\n * @param state The grid metric state\n * @param firstColumn The first visible column\n * @param treePaddingX Tree padding offset for expandable rows\n * @returns The width of the column\n */\n calculateColumnWidth(\n column: VisibleIndex,\n modelColumn: ModelIndex,\n state: GridMetricState,\n firstColumn: VisibleIndex = this.getFirstColumn(state),\n treePaddingX: number = this.calculateTreePaddingX(state)\n ): number {\n const { theme } = state;\n const { autoSizeColumns, minColumnWidth } = theme;\n if (!autoSizeColumns) {\n const { columnWidth } = theme;\n return columnWidth;\n }\n\n const headerWidth = this.calculateColumnHeaderWidth(modelColumn, state);\n const dataWidth = this.calculateColumnDataWidth(modelColumn, state);\n const cachedValue = this.calculatedColumnWidths.get(modelColumn);\n let columnWidth = Math.ceil(Math.max(headerWidth, dataWidth));\n columnWidth = Math.max(minColumnWidth, columnWidth);\n if (cachedValue != null && cachedValue > columnWidth) {\n columnWidth = cachedValue;\n } else {\n this.calculatedColumnWidths.set(modelColumn, columnWidth);\n trimMap(this.calculatedColumnWidths);\n }\n\n if (column === firstColumn) {\n columnWidth += treePaddingX;\n }\n\n return columnWidth;\n }\n\n /**\n * Calculate the width of the specified column's header\n * @param modelColumn ModelIndex of the column to get the header width for\n * @param state The grid metric state\n * @returns The calculated width of the column header\n */\n calculateColumnHeaderWidth(\n modelColumn: ModelIndex,\n state: GridMetricState\n ): number {\n const { model, theme } = state;\n const { headerFont, headerHorizontalPadding } = theme;\n\n const headerText = model.textForColumnHeader(modelColumn);\n if (headerText) {\n const headerFontWidth = this.getWidthForFont(headerFont, state);\n return headerText.length * headerFontWidth + headerHorizontalPadding * 2;\n }\n\n return headerHorizontalPadding * 2;\n }\n\n /**\n * Calculate the width of the specified column's data\n * @param modelColumn ModelIndex of the column to get the data width for\n * @param state The grid metric state\n * @returns The calculated width of the column data\n */\n calculateColumnDataWidth(\n modelColumn: ModelIndex,\n state: GridMetricState\n ): number {\n const { top, height, width, model, theme } = state;\n const { floatingTopRowCount, floatingBottomRowCount, rowCount } = model;\n const {\n font,\n cellHorizontalPadding,\n rowHeight,\n rowHeaderWidth,\n rowFooterWidth,\n scrollBarSize,\n } = theme;\n\n let columnWidth = 0;\n\n const fontWidth = this.getWidthForFont(font, state);\n const rowsPerPage = height / rowHeight;\n const bottom = Math.ceil(top + rowsPerPage);\n GridUtils.iterateAllItems(\n top,\n bottom,\n floatingTopRowCount,\n floatingBottomRowCount,\n rowCount,\n row => {\n const modelRow = this.getModelRow(row, state);\n const text = model.textForCell(modelColumn, modelRow);\n if (text) {\n const cellPadding = cellHorizontalPadding * 2;\n columnWidth = Math.max(\n columnWidth,\n text.length * fontWidth + cellPadding\n );\n }\n }\n );\n\n columnWidth = Math.max(\n Math.min(\n columnWidth,\n (width - rowHeaderWidth - scrollBarSize - rowFooterWidth) *\n GridMetricCalculator.MAX_COLUMN_WIDTH\n ),\n cellHorizontalPadding * 2\n );\n\n return columnWidth;\n }\n\n /**\n * The coordinate for where the tree padding should be drawn\n * @param state The grid metric state\n * @returns The coordinate for tree padding\n */\n calculateTreePaddingX(state: GridMetricState): Coordinate {\n const { top, height, model, theme } = state;\n const { rowHeight, treeDepthIndent } = theme;\n if (!isExpandableGridModel(model) || !model.hasExpandableRows) {\n return 0;\n }\n let treePadding = 0;\n\n const rowsPerPage = height / rowHeight;\n const bottom = Math.ceil(top + rowsPerPage);\n for (let row = top; row <= bottom; row += 1) {\n const modelRow = this.getModelRow(row, state);\n const depth = model.depthForRow(modelRow);\n treePadding = Math.max(treePadding, treeDepthIndent * (depth + 1));\n }\n\n return treePadding;\n }\n\n /**\n * Get the width of the provided font. Exploits the fact that we're\n * using tabular figures so every character is same width\n * @param font The font to get the width for\n * @param state The grid metric state\n * @returns Width of the char `8` for the specified font\n */\n getWidthForFont(font: GridFont, state: GridMetricState): number {\n if (this.fontWidths.has(font)) {\n return getOrThrow(this.fontWidths, font);\n }\n const { context } = state;\n context.font = font;\n const textMetrics = context.measureText('8');\n const { width } = textMetrics;\n\n // context.font changes the string a little bit, e.g. '10px Arial, sans serif' => '10px Arial, \"sans serif\"'\n // Rather than require checking with the correct font def (theme, or context font), just key it to both\n this.fontWidths.set(font, width);\n this.fontWidths.set(context.font, width);\n\n return width;\n }\n\n /**\n * Sets the width for the specified column\n * @param column The column model index to set\n * @param size The size to set it to\n */\n setColumnWidth(column: ModelIndex, size: number): void {\n // Always use a new instance of the map so any consumer of the metrics knows there has been a change\n const userColumnWidths = new Map(this.userColumnWidths);\n userColumnWidths.set(column, Math.ceil(size));\n trimMap(userColumnWidths);\n this.userColumnWidths = userColumnWidths;\n }\n\n /**\n * Resets the column width for the specified column to the calculated width\n * @param column The column model index to reset\n */\n resetColumnWidth(column: ModelIndex): void {\n // Always use a new instance of the map so any consumer of the metrics knows there has been a change\n const userColumnWidths = new Map(this.userColumnWidths);\n userColumnWidths.delete(column);\n this.userColumnWidths = userColumnWidths;\n }\n\n /**\n * Sets the width for the specified row\n * @param row The row model index to set\n * @param size The size to set it to\n */\n setRowHeight(row: ModelIndex, size: number): void {\n // Always use a new instance of the map so any consumer of the metrics knows there has been a change\n const userRowHeights = new Map(this.userRowHeights);\n userRowHeights.set(row, Math.ceil(size));\n trimMap(userRowHeights);\n this.userRowHeights = userRowHeights;\n }\n\n /**\n * Resets the row height for the specified row to the calculated height\n * @param row The row model index to reset\n */\n resetRowHeight(row: ModelIndex): void {\n // Always use a new instance of the map so any consumer of the metrics knows there has been a change\n const userRowHeights = new Map(this.userRowHeights);\n userRowHeights.delete(row);\n this.userRowHeights = userRowHeights;\n this.calculatedRowHeights.delete(row);\n }\n}\n\nexport default GridMetricCalculator;\n"],"file":"GridMetricCalculator.js"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@deephaven/grid",
|
|
3
|
-
"version": "0.13.
|
|
3
|
+
"version": "0.13.14-input-table-paste-jackson.2+87de7466",
|
|
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.13.
|
|
36
|
+
"@deephaven/tsconfig": "^0.13.14-input-table-paste-jackson.2+87de7466"
|
|
37
37
|
},
|
|
38
38
|
"files": [
|
|
39
39
|
"dist"
|
|
@@ -50,5 +50,5 @@
|
|
|
50
50
|
"publishConfig": {
|
|
51
51
|
"access": "public"
|
|
52
52
|
},
|
|
53
|
-
"gitHead": "
|
|
53
|
+
"gitHead": "87de74660c7f75641f3c7360154748a811eccb41"
|
|
54
54
|
}
|