| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133 |
- import { isRightClick as isRightClickEvent, isLeftClick as isLeftClickEvent } from './../helpers/dom/event';
- import { CellCoords } from './../3rdparty/walkontable/src';
- /**
- * MouseDown handler.
- *
- * @param {Object} options
- * @param {Boolean} options.isShiftKey The flag which indicates if the shift key is pressed.
- * @param {Boolean} options.isLeftClick The flag which indicates if the left mouse button is pressed.
- * @param {Boolean} options.isRightClick The flag which indicates if the right mouse button is pressed.
- * @param {CellRange} options.coords The CellCoords object with defined visual coordinates.
- * @param {Selection} options.selection The Selection class instance.
- * @param {Object} options.controller An object with keys `row`, `column`, `cell` which indicate what
- * operation will be performed in later selection stages.
- */
- export function mouseDown({ isShiftKey, isLeftClick, isRightClick, coords, selection, controller }) {
- const currentSelection = selection.isSelected() ? selection.getSelectedRange().current() : null;
- const selectedCorner = selection.isSelectedByCorner();
- const selectedRow = selection.isSelectedByRowHeader();
- if (isShiftKey && currentSelection) {
- if (coords.row >= 0 && coords.col >= 0 && !controller.cells) {
- selection.setRangeEnd(coords);
- } else if ((selectedCorner || selectedRow) && coords.row >= 0 && coords.col >= 0 && !controller.cells) {
- selection.setRangeEnd(new CellCoords(coords.row, coords.col));
- } else if (selectedCorner && coords.row < 0 && !controller.column) {
- selection.setRangeEnd(new CellCoords(currentSelection.to.row, coords.col));
- } else if (selectedRow && coords.col < 0 && !controller.row) {
- selection.setRangeEnd(new CellCoords(coords.row, currentSelection.to.col));
- } else if (((!selectedCorner && !selectedRow && coords.col < 0) ||
- (selectedCorner && coords.col < 0)) && !controller.row) {
- selection.selectRows(currentSelection.from.row, coords.row);
- } else if (((!selectedCorner && !selectedRow && coords.row < 0) ||
- (selectedRow && coords.row < 0)) && !controller.column) {
- selection.selectColumns(currentSelection.from.col, coords.col);
- }
- } else {
- const newCoord = new CellCoords(coords.row, coords.col);
- if (newCoord.row < 0) {
- newCoord.row = 0;
- }
- if (newCoord.col < 0) {
- newCoord.col = 0;
- }
- const allowRightClickSelection = !selection.inInSelection(newCoord);
- const performSelection = isLeftClick || (isRightClick && allowRightClickSelection);
- // clicked row header and when some column was selected
- if (coords.row < 0 && coords.col >= 0 && !controller.column) {
- if (performSelection) {
- selection.selectColumns(coords.col);
- }
- // clicked column header and when some row was selected
- } else if (coords.col < 0 && coords.row >= 0 && !controller.row) {
- if (performSelection) {
- selection.selectRows(coords.row);
- }
- } else if (coords.col >= 0 && coords.row >= 0 && !controller.cells) {
- if (performSelection) {
- selection.setRangeStart(coords);
- }
- } else if (coords.col < 0 && coords.row < 0) {
- selection.setRangeStart(coords);
- }
- }
- }
- /**
- * MouseOver handler.
- *
- * @param {Object} options
- * @param {Boolean} options.isLeftClick
- * @param {CellRange} options.coords The CellCoords object with defined visual coordinates.
- * @param {Selection} options.selection The Selection class instance.
- * @param {Object} options.controller An object with keys `row`, `column`, `cell` which indicate what
- * operation will be performed in later selection stages.
- */
- export function mouseOver({ isLeftClick, coords, selection, controller }) {
- if (!isLeftClick) {
- return;
- }
- const selectedRow = selection.isSelectedByRowHeader();
- const selectedColumn = selection.isSelectedByColumnHeader();
- const countCols = selection.tableProps.countCols();
- const countRows = selection.tableProps.countRows();
- if (selectedColumn && !controller.column) {
- selection.setRangeEnd(new CellCoords(countRows - 1, coords.col));
- } else if (selectedRow && !controller.row) {
- selection.setRangeEnd(new CellCoords(coords.row, countCols - 1));
- } else if (!controller.cell) {
- selection.setRangeEnd(coords);
- }
- }
- const handlers = new Map([
- ['mousedown', mouseDown],
- ['mouseover', mouseOver],
- ['touchstart', mouseDown],
- ]);
- /**
- * Mouse handler for selection functionality.
- *
- * @param {Event} event An native event to handle.
- * @param {Object} options
- * @param {CellRange} options.coords The CellCoords object with defined visual coordinates.
- * @param {Selection} options.selection The Selection class instance.
- * @param {Object} options.controller An object with keys `row`, `column`, `cell` which indicate what
- * operation will be performed in later selection stages.
- */
- export function handleMouseEvent(event, { coords, selection, controller }) {
- handlers.get(event.type)({
- coords,
- selection,
- controller,
- isShiftKey: event.shiftKey,
- isLeftClick: isLeftClickEvent(event) || event.type === 'touchstart',
- isRightClick: isRightClickEvent(event),
- });
- }
|