slickgrid added to third-party
[myslice.git] / third-party / slickgrid-2.1 / plugins / slick.cellrangeselector.js
1 (function ($) {
2   // register namespace
3   $.extend(true, window, {
4     "Slick": {
5       "CellRangeSelector": CellRangeSelector
6     }
7   });
8
9
10   function CellRangeSelector(options) {
11     var _grid;
12     var _canvas;
13     var _dragging;
14     var _decorator;
15     var _self = this;
16     var _handler = new Slick.EventHandler();
17     var _defaults = {
18       selectionCss: {
19         "border": "2px dashed blue"
20       }
21     };
22
23
24     function init(grid) {
25       options = $.extend(true, {}, _defaults, options);
26       _decorator = new Slick.CellRangeDecorator(grid, options);
27       _grid = grid;
28       _canvas = _grid.getCanvasNode();
29       _handler
30         .subscribe(_grid.onDragInit, handleDragInit)
31         .subscribe(_grid.onDragStart, handleDragStart)
32         .subscribe(_grid.onDrag, handleDrag)
33         .subscribe(_grid.onDragEnd, handleDragEnd);
34     }
35
36     function destroy() {
37       _handler.unsubscribeAll();
38     }
39
40     function handleDragInit(e, dd) {
41       // prevent the grid from cancelling drag'n'drop by default
42       e.stopImmediatePropagation();
43     }
44
45     function handleDragStart(e, dd) {
46       var cell = _grid.getCellFromEvent(e);
47       if (_self.onBeforeCellRangeSelected.notify(cell) !== false) {
48         if (_grid.canCellBeSelected(cell.row, cell.cell)) {
49           _dragging = true;
50           e.stopImmediatePropagation();
51         }
52       }
53       if (!_dragging) {
54         return;
55       }
56
57       _grid.focus();
58
59       var start = _grid.getCellFromPoint(
60           dd.startX - $(_canvas).offset().left,
61           dd.startY - $(_canvas).offset().top);
62
63       dd.range = {start: start, end: {}};
64
65       return _decorator.show(new Slick.Range(start.row, start.cell));
66     }
67
68     function handleDrag(e, dd) {
69       if (!_dragging) {
70         return;
71       }
72       e.stopImmediatePropagation();
73
74       var end = _grid.getCellFromPoint(
75           e.pageX - $(_canvas).offset().left,
76           e.pageY - $(_canvas).offset().top);
77
78       if (!_grid.canCellBeSelected(end.row, end.cell)) {
79         return;
80       }
81
82       dd.range.end = end;
83       _decorator.show(new Slick.Range(dd.range.start.row, dd.range.start.cell, end.row, end.cell));
84     }
85
86     function handleDragEnd(e, dd) {
87       if (!_dragging) {
88         return;
89       }
90
91       _dragging = false;
92       e.stopImmediatePropagation();
93
94       _decorator.hide();
95       _self.onCellRangeSelected.notify({
96         range: new Slick.Range(
97             dd.range.start.row,
98             dd.range.start.cell,
99             dd.range.end.row,
100             dd.range.end.cell
101         )
102       });
103     }
104
105     $.extend(this, {
106       "init": init,
107       "destroy": destroy,
108
109       "onBeforeCellRangeSelected": new Slick.Event(),
110       "onCellRangeSelected": new Slick.Event()
111     });
112   }
113 })(jQuery);