first step for manual merging of the slickgrid branch
[myslice.git] / third-party / slickgrid-2.1 / plugins / slick.rowmovemanager.js
diff --git a/third-party/slickgrid-2.1/plugins/slick.rowmovemanager.js b/third-party/slickgrid-2.1/plugins/slick.rowmovemanager.js
new file mode 100644 (file)
index 0000000..5f87a1e
--- /dev/null
@@ -0,0 +1,138 @@
+(function ($) {
+  // register namespace
+  $.extend(true, window, {
+    "Slick": {
+      "RowMoveManager": RowMoveManager
+    }
+  });
+
+  function RowMoveManager(options) {
+    var _grid;
+    var _canvas;
+    var _dragging;
+    var _self = this;
+    var _handler = new Slick.EventHandler();
+    var _defaults = {
+      cancelEditOnDrag: false
+    };
+
+    function init(grid) {
+      options = $.extend(true, {}, _defaults, options);
+      _grid = grid;
+      _canvas = _grid.getCanvasNode();
+      _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) {
+      // prevent the grid from cancelling drag'n'drop by default
+      e.stopImmediatePropagation();
+    }
+
+    function handleDragStart(e, dd) {
+      var cell = _grid.getCellFromEvent(e);
+
+      if (options.cancelEditOnDrag && _grid.getEditorLock().isActive()) {
+        _grid.getEditorLock().cancelCurrentEdit();
+      }
+
+      if (_grid.getEditorLock().isActive() || !/move|selectAndMove/.test(_grid.getColumns()[cell.cell].behavior)) {
+        return false;
+      }
+
+      _dragging = true;
+      e.stopImmediatePropagation();
+
+      var selectedRows = _grid.getSelectedRows();
+
+      if (selectedRows.length == 0 || $.inArray(cell.row, selectedRows) == -1) {
+        selectedRows = [cell.row];
+        _grid.setSelectedRows(selectedRows);
+      }
+
+      var rowHeight = _grid.getOptions().rowHeight;
+
+      dd.selectedRows = selectedRows;
+
+      dd.selectionProxy = $("<div class='slick-reorder-proxy'/>")
+          .css("position", "absolute")
+          .css("zIndex", "99999")
+          .css("width", $(_canvas).innerWidth())
+          .css("height", rowHeight * selectedRows.length)
+          .appendTo(_canvas);
+
+      dd.guide = $("<div class='slick-reorder-guide'/>")
+          .css("position", "absolute")
+          .css("zIndex", "99998")
+          .css("width", $(_canvas).innerWidth())
+          .css("top", -1000)
+          .appendTo(_canvas);
+
+      dd.insertBefore = -1;
+    }
+
+    function handleDrag(e, dd) {
+      if (!_dragging) {
+        return;
+      }
+
+      e.stopImmediatePropagation();
+
+      var top = e.pageY - $(_canvas).offset().top;
+      dd.selectionProxy.css("top", top - 5);
+
+      var insertBefore = Math.max(0, Math.min(Math.round(top / _grid.getOptions().rowHeight), _grid.getDataLength()));
+      if (insertBefore !== dd.insertBefore) {
+        var eventData = {
+          "rows": dd.selectedRows,
+          "insertBefore": insertBefore
+        };
+
+        if (_self.onBeforeMoveRows.notify(eventData) === false) {
+          dd.guide.css("top", -1000);
+          dd.canMove = false;
+        } else {
+          dd.guide.css("top", insertBefore * _grid.getOptions().rowHeight);
+          dd.canMove = true;
+        }
+
+        dd.insertBefore = insertBefore;
+      }
+    }
+
+    function handleDragEnd(e, dd) {
+      if (!_dragging) {
+        return;
+      }
+      _dragging = false;
+      e.stopImmediatePropagation();
+
+      dd.guide.remove();
+      dd.selectionProxy.remove();
+
+      if (dd.canMove) {
+        var eventData = {
+          "rows": dd.selectedRows,
+          "insertBefore": dd.insertBefore
+        };
+        // TODO:  _grid.remapCellCssClasses ?
+        _self.onMoveRows.notify(eventData);
+      }
+    }
+
+    $.extend(this, {
+      "onBeforeMoveRows": new Slick.Event(),
+      "onMoveRows": new Slick.Event(),
+
+      "init": init,
+      "destroy": destroy
+    });
+  }
+})(jQuery);
\ No newline at end of file