forked from mleibman/SlickGrid
-
Notifications
You must be signed in to change notification settings - Fork 75
/
Copy pathslick.cellrangeselector.js
142 lines (116 loc) · 4.05 KB
/
slick.cellrangeselector.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
(function ($) {
// register namespace
$.extend(true, window, {
"Slick": {
"CellRangeSelector": CellRangeSelector
}
});
function CellRangeSelector(options) {
var _grid;
var _gridOptions;
var _$activeCanvas;
var _dragging;
var _decorator;
var _self = this;
var _handler = new Slick.EventHandler();
var _defaults = {
selectionCss: {
"border": "2px dashed blue"
}
};
// Frozen row & column variables
var _rowOffset;
var _columnOffset;
var _isRightCanvas;
var _isBottomCanvas;
function init(grid) {
options = $.extend(true, {}, _defaults, options);
_decorator = new Slick.CellRangeDecorator(grid, options);
_grid = grid;
_gridOptions = _grid.getOptions();
_handler
.subscribe(_grid.onDragInit, handleDragInit)
.subscribe(_grid.onDragStart, handleDragStart)
.subscribe(_grid.onDrag, handleDrag)
.subscribe(_grid.onDragEnd, handleDragEnd);
}
function destroy() {
_handler.unsubscribeAll();
}
function handleDragInit(e, dd) {
// Set the active canvas node because the decorator needs to append its
// box to the correct canvas
_$activeCanvas = $( _grid.getActiveCanvasNode( e ) );
var c = _$activeCanvas.offset();
_rowOffset = 0;
_columnOffset = 0;
_isBottomCanvas = _$activeCanvas.hasClass( 'grid-canvas-bottom' );
if ( _gridOptions.frozenRow > -1 && _isBottomCanvas ) {
_rowOffset = ( _gridOptions.frozenBottom ) ? $('.grid-canvas-bottom').height() : $('.grid-canvas-top').height();
}
_isRightCanvas = _$activeCanvas.hasClass( 'grid-canvas-right' );
if ( _gridOptions.frozenColumn > -1 && _isRightCanvas ) {
_columnOffset = $('.grid-canvas-left').width();
}
// prevent the grid from cancelling drag'n'drop by default
e.stopImmediatePropagation();
}
function handleDragStart(e, dd) {
var cell = _grid.getCellFromEvent(e);
if (_self.onBeforeCellRangeSelected.notify(cell) !== false) {
if (_grid.canCellBeSelected(cell.row, cell.cell)) {
_dragging = true;
e.stopImmediatePropagation();
}
}
if (!_dragging) {
return;
}
_grid.focus();
dd.range = {start: cell, end: {}};
return _decorator.show(new Slick.Range(cell.row, cell.cell));
}
function handleDrag(e, dd) {
if (!_dragging) {
return;
}
e.stopImmediatePropagation();
var end = _grid.getCellFromPoint(
e.pageX - _$activeCanvas.offset().left + _columnOffset,
e.pageY - _$activeCanvas.offset().top + _rowOffset
);
if ( (!_grid.canCellBeSelected( end.row, end.cell ) )
|| ( !_isRightCanvas && ( end.cell > _gridOptions.frozenColumn ) )
|| ( _isRightCanvas && ( end.cell <= _gridOptions.frozenColumn ) )
|| ( !_isBottomCanvas && ( end.row >= _gridOptions.frozenRow ) )
|| ( _isBottomCanvas && ( end.row < _gridOptions.frozenRow ) )
) {
return;
}
dd.range.end = end;
_decorator.show(new Slick.Range(dd.range.start.row, dd.range.start.cell, end.row, end.cell));
}
function handleDragEnd(e, dd) {
if (!_dragging) {
return;
}
_dragging = false;
e.stopImmediatePropagation();
_decorator.hide();
_self.onCellRangeSelected.notify({
range: new Slick.Range(
dd.range.start.row,
dd.range.start.cell,
dd.range.end.row,
dd.range.end.cell
)
});
}
$.extend(this, {
"init": init,
"destroy": destroy,
"onBeforeCellRangeSelected": new Slick.Event(),
"onCellRangeSelected": new Slick.Event()
});
}
})(jQuery);