105 lines
3.1 KiB
JavaScript
105 lines
3.1 KiB
JavaScript
(function($) {
|
|
// register namespace
|
|
$.extend(true, window, {
|
|
"Slick": {
|
|
"CellRangeSelector": CellRangeSelector
|
|
}
|
|
});
|
|
|
|
|
|
function CellRangeSelector(options) {
|
|
var _grid;
|
|
var _canvas;
|
|
var _dragging;
|
|
var _decorator;
|
|
var _self = this;
|
|
var _defaults = {
|
|
selectionCss: {
|
|
"border": "2px dashed blue"
|
|
}
|
|
};
|
|
|
|
|
|
function init(grid) {
|
|
options = $.extend(true, {}, _defaults, options);
|
|
_decorator = new Slick.CellRangeDecorator(grid, options);
|
|
_grid = grid;
|
|
_canvas = _grid.getCanvasNode();
|
|
_grid.onDragStart.subscribe(handleDragStart);
|
|
_grid.onDrag.subscribe(handleDrag);
|
|
_grid.onDragEnd.subscribe(handleDragEnd);
|
|
}
|
|
|
|
function destroy() {
|
|
_grid.onDragStart.unsubscribe(handleDragStart);
|
|
_grid.onDrag.unsubscribe(handleDrag);
|
|
_grid.onDragEnd.unsubscribe(handleDragEnd);
|
|
}
|
|
|
|
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;
|
|
}
|
|
|
|
var start = _grid.getCellFromPoint(
|
|
dd.startX - $(_canvas).offset().left,
|
|
dd.startY - $(_canvas).offset().top);
|
|
|
|
dd.range = {start:start,end:{}};
|
|
|
|
return _decorator.show(new Slick.Range(start.row,start.cell));
|
|
}
|
|
|
|
function handleDrag(e,dd) {
|
|
if (!_dragging) {
|
|
return;
|
|
}
|
|
e.stopImmediatePropagation();
|
|
|
|
var end = _grid.getCellFromPoint(
|
|
e.pageX - $(_canvas).offset().left,
|
|
e.pageY - $(_canvas).offset().top);
|
|
|
|
if (!_grid.canCellBeSelected(end.row,end.cell)) {
|
|
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); |