You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

111 lines
2.7 KiB

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