3 $.extend(true, window, {
5 "RowSelectionModel": RowSelectionModel
9 function RowSelectionModel(options) {
13 var _handler = new Slick.EventHandler();
21 _options = $.extend(true, {}, _defaults, options);
23 _handler.subscribe(_grid.onActiveCellChanged,
24 wrapHandler(handleActiveCellChange));
25 _handler.subscribe(_grid.onKeyDown,
26 wrapHandler(handleKeyDown));
27 _handler.subscribe(_grid.onClick,
28 wrapHandler(handleClick));
32 _handler.unsubscribeAll();
35 function wrapHandler(handler) {
39 handler.apply(this, arguments);
45 function rangesToRows(ranges) {
47 for (var i = 0; i < ranges.length; i++) {
48 for (var j = ranges[i].fromRow; j <= ranges[i].toRow; j++) {
55 function rowsToRanges(rows) {
57 var lastCell = _grid.getColumns().length - 1;
58 for (var i = 0; i < rows.length; i++) {
59 ranges.push(new Slick.Range(rows[i], 0, rows[i], lastCell));
64 function getRowsRange(from, to) {
66 for (i = from; i <= to; i++) {
69 for (i = to; i < from; i++) {
75 function getSelectedRows() {
76 return rangesToRows(_ranges);
79 function setSelectedRows(rows) {
80 setSelectedRanges(rowsToRanges(rows));
83 function setSelectedRanges(ranges) {
85 _self.onSelectedRangesChanged.notify(_ranges);
88 function getSelectedRanges() {
92 function handleActiveCellChange(e, data) {
93 if (_options.selectActiveRow && data.row != null) {
94 setSelectedRanges([new Slick.Range(data.row, 0, data.row, _grid.getColumns().length - 1)]);
98 function handleKeyDown(e) {
99 var activeRow = _grid.getActiveCell();
100 if (activeRow && e.shiftKey && !e.ctrlKey && !e.altKey && !e.metaKey && (e.which == 38 || e.which == 40)) {
101 var selectedRows = getSelectedRows();
102 selectedRows.sort(function (x, y) {
106 if (!selectedRows.length) {
107 selectedRows = [activeRow.row];
110 var top = selectedRows[0];
111 var bottom = selectedRows[selectedRows.length - 1];
115 active = activeRow.row < bottom || top == bottom ? ++bottom : ++top;
117 active = activeRow.row < bottom ? --bottom : --top;
120 if (active >= 0 && active < _grid.getDataLength()) {
121 _grid.scrollRowIntoView(active);
122 _ranges = rowsToRanges(getRowsRange(top, bottom));
123 setSelectedRanges(_ranges);
131 function handleClick(e) {
132 var cell = _grid.getCellFromEvent(e);
133 if (!cell || !_grid.canCellBeActive(cell.row, cell.cell)) {
137 var selection = rangesToRows(_ranges);
138 var idx = $.inArray(cell.row, selection);
140 if (!e.ctrlKey && !e.shiftKey && !e.metaKey) {
143 else if (_grid.getOptions().multiSelect) {
144 if (idx === -1 && (e.ctrlKey || e.metaKey)) {
145 selection.push(cell.row);
146 _grid.setActiveCell(cell.row, cell.cell);
147 } else if (idx !== -1 && (e.ctrlKey || e.metaKey)) {
148 selection = $.grep(selection, function (o, i) {
149 return (o !== cell.row);
151 _grid.setActiveCell(cell.row, cell.cell);
152 } else if (selection.length && e.shiftKey) {
153 var last = selection.pop();
154 var from = Math.min(cell.row, last);
155 var to = Math.max(cell.row, last);
157 for (var i = from; i <= to; i++) {
162 selection.push(last);
163 _grid.setActiveCell(cell.row, cell.cell);
167 _ranges = rowsToRanges(selection);
168 setSelectedRanges(_ranges);
169 e.stopImmediatePropagation();
175 "getSelectedRows": getSelectedRows,
176 "setSelectedRows": setSelectedRows,
178 "getSelectedRanges": getSelectedRanges,
179 "setSelectedRanges": setSelectedRanges,
184 "onSelectedRangesChanged": new Slick.Event()