3 $.extend(true, window, {
5 "CellSelectionModel": CellSelectionModel
10 function CellSelectionModel(options) {
15 var _selector = new Slick.CellRangeSelector({
17 "border": "2px solid black"
22 selectActiveCell: true
27 _options = $.extend(true, {}, _defaults, options);
29 _canvas = _grid.getCanvasNode();
30 _grid.onActiveCellChanged.subscribe(handleActiveCellChange);
31 _grid.onKeyDown.subscribe(handleKeyDown);
32 grid.registerPlugin(_selector);
33 _selector.onCellRangeSelected.subscribe(handleCellRangeSelected);
34 _selector.onBeforeCellRangeSelected.subscribe(handleBeforeCellRangeSelected);
38 _grid.onActiveCellChanged.unsubscribe(handleActiveCellChange);
39 _grid.onKeyDown.unsubscribe(handleKeyDown);
40 _selector.onCellRangeSelected.unsubscribe(handleCellRangeSelected);
41 _selector.onBeforeCellRangeSelected.unsubscribe(handleBeforeCellRangeSelected);
42 _grid.unregisterPlugin(_selector);
45 function removeInvalidRanges(ranges) {
48 for (var i = 0; i < ranges.length; i++) {
50 if (_grid.canCellBeSelected(r.fromRow, r.fromCell) && _grid.canCellBeSelected(r.toRow, r.toCell)) {
58 function setSelectedRanges(ranges) {
59 _ranges = removeInvalidRanges(ranges);
60 _self.onSelectedRangesChanged.notify(_ranges);
63 function getSelectedRanges() {
67 function handleBeforeCellRangeSelected(e, args) {
68 if (_grid.getEditorLock().isActive()) {
74 function handleCellRangeSelected(e, args) {
75 setSelectedRanges([args.range]);
78 function handleActiveCellChange(e, args) {
79 if (_options.selectActiveCell && args.row != null && args.cell != null) {
80 setSelectedRanges([new Slick.Range(args.row, args.cell)]);
84 function handleKeyDown(e) {
93 var active = _grid.getActiveCell();
95 if ( active && e.shiftKey && !e.ctrlKey && !e.altKey &&
96 (e.which == 37 || e.which == 39 || e.which == 38 || e.which == 40) ) {
98 ranges = getSelectedRanges();
100 ranges.push(new Slick.Range(active.row, active.cell));
102 // keyboard can work with last range only
105 // can't handle selection out of active cell
106 if (!last.contains(active.row, active.cell))
107 last = new Slick.Range(active.row, active.cell);
109 var dRow = last.toRow - last.fromRow,
110 dCell = last.toCell - last.fromCell,
112 dirRow = active.row == last.fromRow ? 1 : -1,
113 dirCell = active.cell == last.fromCell ? 1 : -1;
117 } else if (e.which == 39) {
119 } else if (e.which == 38) {
121 } else if (e.which == 40) {
125 // define new selection range
126 var new_last = new Slick.Range(active.row, active.cell, active.row + dirRow*dRow, active.cell + dirCell*dCell);
127 if (removeInvalidRanges([new_last]).length) {
128 ranges.push(new_last);
129 var viewRow = dirRow > 0 ? new_last.toRow : new_last.fromRow;
130 var viewCell = dirCell > 0 ? new_last.toCell : new_last.fromCell;
131 _grid.scrollRowIntoView(viewRow);
132 _grid.scrollCellIntoView(viewRow, viewCell);
137 setSelectedRanges(ranges);
145 "getSelectedRanges": getSelectedRanges,
146 "setSelectedRanges": setSelectedRanges,
151 "onSelectedRangesChanged": new Slick.Event()