/plugins/slick.cellselectionmodel.js

http://github.com/mleibman/SlickGrid · JavaScript · 154 lines · 116 code · 26 blank · 12 comment · 38 complexity · cd61ca87ee2ec54d7a4fce485abee7e3 MD5 · raw file

  1. (function ($) {
  2. // register namespace
  3. $.extend(true, window, {
  4. "Slick": {
  5. "CellSelectionModel": CellSelectionModel
  6. }
  7. });
  8. function CellSelectionModel(options) {
  9. var _grid;
  10. var _canvas;
  11. var _ranges = [];
  12. var _self = this;
  13. var _selector = new Slick.CellRangeSelector({
  14. "selectionCss": {
  15. "border": "2px solid black"
  16. }
  17. });
  18. var _options;
  19. var _defaults = {
  20. selectActiveCell: true
  21. };
  22. function init(grid) {
  23. _options = $.extend(true, {}, _defaults, options);
  24. _grid = grid;
  25. _canvas = _grid.getCanvasNode();
  26. _grid.onActiveCellChanged.subscribe(handleActiveCellChange);
  27. _grid.onKeyDown.subscribe(handleKeyDown);
  28. grid.registerPlugin(_selector);
  29. _selector.onCellRangeSelected.subscribe(handleCellRangeSelected);
  30. _selector.onBeforeCellRangeSelected.subscribe(handleBeforeCellRangeSelected);
  31. }
  32. function destroy() {
  33. _grid.onActiveCellChanged.unsubscribe(handleActiveCellChange);
  34. _grid.onKeyDown.unsubscribe(handleKeyDown);
  35. _selector.onCellRangeSelected.unsubscribe(handleCellRangeSelected);
  36. _selector.onBeforeCellRangeSelected.unsubscribe(handleBeforeCellRangeSelected);
  37. _grid.unregisterPlugin(_selector);
  38. }
  39. function removeInvalidRanges(ranges) {
  40. var result = [];
  41. for (var i = 0; i < ranges.length; i++) {
  42. var r = ranges[i];
  43. if (_grid.canCellBeSelected(r.fromRow, r.fromCell) && _grid.canCellBeSelected(r.toRow, r.toCell)) {
  44. result.push(r);
  45. }
  46. }
  47. return result;
  48. }
  49. function setSelectedRanges(ranges) {
  50. _ranges = removeInvalidRanges(ranges);
  51. _self.onSelectedRangesChanged.notify(_ranges);
  52. }
  53. function getSelectedRanges() {
  54. return _ranges;
  55. }
  56. function handleBeforeCellRangeSelected(e, args) {
  57. if (_grid.getEditorLock().isActive()) {
  58. e.stopPropagation();
  59. return false;
  60. }
  61. }
  62. function handleCellRangeSelected(e, args) {
  63. setSelectedRanges([args.range]);
  64. }
  65. function handleActiveCellChange(e, args) {
  66. if (_options.selectActiveCell && args.row != null && args.cell != null) {
  67. setSelectedRanges([new Slick.Range(args.row, args.cell)]);
  68. }
  69. }
  70. function handleKeyDown(e) {
  71. /***
  72. * Кey codes
  73. * 37 left
  74. * 38 up
  75. * 39 right
  76. * 40 down
  77. */
  78. var ranges, last;
  79. var active = _grid.getActiveCell();
  80. if ( active && e.shiftKey && !e.ctrlKey && !e.altKey &&
  81. (e.which == 37 || e.which == 39 || e.which == 38 || e.which == 40) ) {
  82. ranges = getSelectedRanges();
  83. if (!ranges.length)
  84. ranges.push(new Slick.Range(active.row, active.cell));
  85. // keyboard can work with last range only
  86. last = ranges.pop();
  87. // can't handle selection out of active cell
  88. if (!last.contains(active.row, active.cell))
  89. last = new Slick.Range(active.row, active.cell);
  90. var dRow = last.toRow - last.fromRow,
  91. dCell = last.toCell - last.fromCell,
  92. // walking direction
  93. dirRow = active.row == last.fromRow ? 1 : -1,
  94. dirCell = active.cell == last.fromCell ? 1 : -1;
  95. if (e.which == 37) {
  96. dCell -= dirCell;
  97. } else if (e.which == 39) {
  98. dCell += dirCell ;
  99. } else if (e.which == 38) {
  100. dRow -= dirRow;
  101. } else if (e.which == 40) {
  102. dRow += dirRow;
  103. }
  104. // define new selection range
  105. var new_last = new Slick.Range(active.row, active.cell, active.row + dirRow*dRow, active.cell + dirCell*dCell);
  106. if (removeInvalidRanges([new_last]).length) {
  107. ranges.push(new_last);
  108. var viewRow = dirRow > 0 ? new_last.toRow : new_last.fromRow;
  109. var viewCell = dirCell > 0 ? new_last.toCell : new_last.fromCell;
  110. _grid.scrollRowIntoView(viewRow);
  111. _grid.scrollCellIntoView(viewRow, viewCell);
  112. }
  113. else
  114. ranges.push(last);
  115. setSelectedRanges(ranges);
  116. e.preventDefault();
  117. e.stopPropagation();
  118. }
  119. }
  120. $.extend(this, {
  121. "getSelectedRanges": getSelectedRanges,
  122. "setSelectedRanges": setSelectedRanges,
  123. "init": init,
  124. "destroy": destroy,
  125. "onSelectedRangesChanged": new Slick.Event()
  126. });
  127. }
  128. })(jQuery);