(function ($) { // register namespace $.extend(true, window, { "Slick": { "CellSelectionModel": CellSelectionModel } }); function CellSelectionModel(options) { var _grid; var _canvas; var _ranges = []; var _self = this; var _selector = new Slick.CellRangeSelector({ "selectionCss": { "border": "2px solid black" } }); var _options; var _defaults = { selectActiveCell: true }; function init(grid) { _options = $.extend(true, {}, _defaults, options); _grid = grid; _canvas = _grid.getCanvasNode(); _grid.onActiveCellChanged.subscribe(handleActiveCellChange); grid.registerPlugin(_selector); _selector.onCellRangeSelected.subscribe(handleCellRangeSelected); _selector.onBeforeCellRangeSelected.subscribe(handleBeforeCellRangeSelected); } function destroy() { _grid.onActiveCellChanged.unsubscribe(handleActiveCellChange); _selector.onCellRangeSelected.unsubscribe(handleCellRangeSelected); _selector.onBeforeCellRangeSelected.unsubscribe(handleBeforeCellRangeSelected); _grid.unregisterPlugin(_selector); } function removeInvalidRanges(ranges) { var result = []; for (var i = 0; i < ranges.length; i++) { var r = ranges[i]; if (_grid.canCellBeSelected(r.fromRow, r.fromCell) && _grid.canCellBeSelected(r.toRow, r.toCell)) { result.push(r); } } return result; } function setSelectedRanges(ranges) { _ranges = removeInvalidRanges(ranges); _self.onSelectedRangesChanged.notify(_ranges); } function getSelectedRanges() { return _ranges; } function handleBeforeCellRangeSelected(e, args) { if (_grid.getEditorLock().isActive()) { e.stopPropagation(); return false; } } function handleCellRangeSelected(e, args) { setSelectedRanges([args.range]); } function handleActiveCellChange(e, args) { if (_options.selectActiveCell) { setSelectedRanges([new Slick.Range(args.row, args.cell)]); } } $.extend(this, { "getSelectedRanges": getSelectedRanges, "setSelectedRanges": setSelectedRanges, "init": init, "destroy": destroy, "onSelectedRangesChanged": new Slick.Event() }); } })(jQuery);