1 // -*- js-indent-level:2 -*-
2 // originally cloned from slick.rowselectionmodel.js
5 $.extend(true, window, {
7 "UnfoldSelectionModel": UnfoldSelectionModel
11 function UnfoldSelectionModel(options) {
15 var _handler = new Slick.EventHandler();
23 messages.debug ("init: incoming grid="+grid+" onclick="+grid.onClick);
24 _options = $.extend(true, {}, _defaults, options);
26 _handler.subscribe(_grid.onActiveCellChanged,
27 wrapHandler(handleActiveCellChange));
28 _handler.subscribe(_grid.onKeyDown,
29 wrapHandler(handleKeyDown));
30 _handler.subscribe(_grid.onClick,
31 wrapHandler(handleClick));
35 _handler.unsubscribeAll();
38 function wrapHandler(handler) {
42 handler.apply(this, arguments);
48 function rangesToRows(ranges) {
50 for (var i = 0; i < ranges.length; i++) {
51 for (var j = ranges[i].fromRow; j <= ranges[i].toRow; j++) {
58 function rowsToRanges(rows) {
60 var lastCell = _grid.getColumns().length - 1;
61 for (var i = 0; i < rows.length; i++) {
62 ranges.push(new Slick.Range(rows[i], 0, rows[i], lastCell));
67 function getRowsRange(from, to) {
69 for (i = from; i <= to; i++) {
72 for (i = to; i < from; i++) {
78 function getSelectedRows() {
79 return rangesToRows(_ranges);
82 function setSelectedRows(rows) {
83 setSelectedRanges(rowsToRanges(rows));
86 function setSelectedRanges(ranges) {
88 _self.onSelectedRangesChanged.notify(_ranges);
91 function getSelectedRanges() {
95 function handleActiveCellChange(e, data) {
96 if (_options.selectActiveRow && data.row != null) {
97 setSelectedRanges([new Slick.Range(data.row, 0, data.row, _grid.getColumns().length - 1)]);
101 function handleKeyDown(e) {
102 var activeRow = _grid.getActiveCell();
103 if (activeRow && e.shiftKey && !e.ctrlKey && !e.altKey && !e.metaKey && (e.which == 38 || e.which == 40)) {
104 var selectedRows = getSelectedRows();
105 selectedRows.sort(function (x, y) {
109 if (!selectedRows.length) {
110 selectedRows = [activeRow.row];
113 var top = selectedRows[0];
114 var bottom = selectedRows[selectedRows.length - 1];
118 active = activeRow.row < bottom || top == bottom ? ++bottom : ++top;
120 active = activeRow.row < bottom ? --bottom : --top;
123 if (active >= 0 && active < _grid.getDataLength()) {
124 _grid.scrollRowIntoView(active);
125 _ranges = rowsToRanges(getRowsRange(top, bottom));
126 setSelectedRanges(_ranges);
134 function handleClick(e) {
135 messages.debug("UnfoldSelectionModel.handleClick");
136 var cell = _grid.getCellFromEvent(e);
137 if (!cell || !_grid.canCellBeActive(cell.row, cell.cell)) {
141 var selection = rangesToRows(_ranges);
142 var idx = $.inArray(cell.row, selection);
144 if (!e.ctrlKey && !e.shiftKey && !e.metaKey) {
147 else if (_grid.getOptions().multiSelect) {
148 if (idx === -1 && (e.ctrlKey || e.metaKey)) {
149 selection.push(cell.row);
150 _grid.setActiveCell(cell.row, cell.cell);
151 } else if (idx !== -1 && (e.ctrlKey || e.metaKey)) {
152 selection = $.grep(selection, function (o, i) {
153 return (o !== cell.row);
155 _grid.setActiveCell(cell.row, cell.cell);
156 } else if (selection.length && e.shiftKey) {
157 var last = selection.pop();
158 var from = Math.min(cell.row, last);
159 var to = Math.max(cell.row, last);
161 for (var i = from; i <= to; i++) {
166 selection.push(last);
167 _grid.setActiveCell(cell.row, cell.cell);
171 _ranges = rowsToRanges(selection);
172 setSelectedRanges(_ranges);
173 e.stopImmediatePropagation();
179 "getSelectedRows": getSelectedRows,
180 "setSelectedRows": setSelectedRows,
182 "getSelectedRanges": getSelectedRanges,
183 "setSelectedRanges": setSelectedRanges,
188 "onSelectedRangesChanged": new Slick.Event()