92 lines
2.8 KiB
JavaScript
92 lines
2.8 KiB
JavaScript
(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); |