slickgrid added to third-party
[myslice.git] / third-party / slickgrid-2.1 / plugins / slick.rowmovemanager.js
1 (function ($) {
2   // register namespace
3   $.extend(true, window, {
4     "Slick": {
5       "RowMoveManager": RowMoveManager
6     }
7   });
8
9   function RowMoveManager(options) {
10     var _grid;
11     var _canvas;
12     var _dragging;
13     var _self = this;
14     var _handler = new Slick.EventHandler();
15     var _defaults = {
16       cancelEditOnDrag: false
17     };
18
19     function init(grid) {
20       options = $.extend(true, {}, _defaults, options);
21       _grid = grid;
22       _canvas = _grid.getCanvasNode();
23       _handler
24         .subscribe(_grid.onDragInit, handleDragInit)
25         .subscribe(_grid.onDragStart, handleDragStart)
26         .subscribe(_grid.onDrag, handleDrag)
27         .subscribe(_grid.onDragEnd, handleDragEnd);
28     }
29
30     function destroy() {
31       _handler.unsubscribeAll();
32     }
33
34     function handleDragInit(e, dd) {
35       // prevent the grid from cancelling drag'n'drop by default
36       e.stopImmediatePropagation();
37     }
38
39     function handleDragStart(e, dd) {
40       var cell = _grid.getCellFromEvent(e);
41
42       if (options.cancelEditOnDrag && _grid.getEditorLock().isActive()) {
43         _grid.getEditorLock().cancelCurrentEdit();
44       }
45
46       if (_grid.getEditorLock().isActive() || !/move|selectAndMove/.test(_grid.getColumns()[cell.cell].behavior)) {
47         return false;
48       }
49
50       _dragging = true;
51       e.stopImmediatePropagation();
52
53       var selectedRows = _grid.getSelectedRows();
54
55       if (selectedRows.length == 0 || $.inArray(cell.row, selectedRows) == -1) {
56         selectedRows = [cell.row];
57         _grid.setSelectedRows(selectedRows);
58       }
59
60       var rowHeight = _grid.getOptions().rowHeight;
61
62       dd.selectedRows = selectedRows;
63
64       dd.selectionProxy = $("<div class='slick-reorder-proxy'/>")
65           .css("position", "absolute")
66           .css("zIndex", "99999")
67           .css("width", $(_canvas).innerWidth())
68           .css("height", rowHeight * selectedRows.length)
69           .appendTo(_canvas);
70
71       dd.guide = $("<div class='slick-reorder-guide'/>")
72           .css("position", "absolute")
73           .css("zIndex", "99998")
74           .css("width", $(_canvas).innerWidth())
75           .css("top", -1000)
76           .appendTo(_canvas);
77
78       dd.insertBefore = -1;
79     }
80
81     function handleDrag(e, dd) {
82       if (!_dragging) {
83         return;
84       }
85
86       e.stopImmediatePropagation();
87
88       var top = e.pageY - $(_canvas).offset().top;
89       dd.selectionProxy.css("top", top - 5);
90
91       var insertBefore = Math.max(0, Math.min(Math.round(top / _grid.getOptions().rowHeight), _grid.getDataLength()));
92       if (insertBefore !== dd.insertBefore) {
93         var eventData = {
94           "rows": dd.selectedRows,
95           "insertBefore": insertBefore
96         };
97
98         if (_self.onBeforeMoveRows.notify(eventData) === false) {
99           dd.guide.css("top", -1000);
100           dd.canMove = false;
101         } else {
102           dd.guide.css("top", insertBefore * _grid.getOptions().rowHeight);
103           dd.canMove = true;
104         }
105
106         dd.insertBefore = insertBefore;
107       }
108     }
109
110     function handleDragEnd(e, dd) {
111       if (!_dragging) {
112         return;
113       }
114       _dragging = false;
115       e.stopImmediatePropagation();
116
117       dd.guide.remove();
118       dd.selectionProxy.remove();
119
120       if (dd.canMove) {
121         var eventData = {
122           "rows": dd.selectedRows,
123           "insertBefore": dd.insertBefore
124         };
125         // TODO:  _grid.remapCellCssClasses ?
126         _self.onMoveRows.notify(eventData);
127       }
128     }
129
130     $.extend(this, {
131       "onBeforeMoveRows": new Slick.Event(),
132       "onMoveRows": new Slick.Event(),
133
134       "init": init,
135       "destroy": destroy
136     });
137   }
138 })(jQuery);