Nie możesz wybrać więcej, niż 25 tematów Tematy muszą się zaczynać od litery lub cyfry, mogą zawierać myślniki ('-') i mogą mieć do 35 znaków.
 
 
 
 
 
 

145 wiersze
4.2 KiB

  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. var ranges, last;
  72. var active = _grid.getActiveCell();
  73. if ( active && e.shiftKey && !e.ctrlKey && !e.altKey &&
  74. (e.which == 37 || e.which == 39 || e.which == 38 || e.which == 40) ) {
  75. ranges = getSelectedRanges();
  76. if (!ranges.length)
  77. ranges.push(new Slick.Range(active.row, active.cell));
  78. // keyboard can work with last range only
  79. last = ranges.pop();
  80. // can't handle selection out of active cell
  81. if (!last.contains(active.row, active.cell))
  82. last = new Slick.Range(active.row, active.cell);
  83. var dRow = last.toRow - last.fromRow,
  84. dCell = last.toCell - last.fromCell,
  85. // walking direction
  86. dirRow = active.row == last.fromRow ? 1 : -1,
  87. dirCell = active.cell == last.fromCell ? 1 : -1;
  88. if (e.which == 37) {
  89. dCell -= dirCell;
  90. } else if (e.which == 39) {
  91. dCell += dirCell ;
  92. } else if (e.which == 38) {
  93. dRow -= dirRow;
  94. } else if (e.which == 40) {
  95. dRow += dirRow;
  96. }
  97. // define new selection range
  98. var new_last = new Slick.Range(active.row, active.cell, active.row + dirRow*dRow, active.cell + dirCell*dCell);
  99. if (removeInvalidRanges([new_last]).length) {
  100. ranges.push(new_last);
  101. _grid.scrollRowIntoView(dirRow > 0 ? new_last.toRow : new_last.fromRow);
  102. _grid.scrollCellIntoView(new_last.fromRow, dirCell > 0 ? new_last.toCell : new_last.fromCell);
  103. }
  104. else
  105. ranges.push(last);
  106. setSelectedRanges(ranges);
  107. e.preventDefault();
  108. e.stopPropagation();
  109. }
  110. }
  111. $.extend(this, {
  112. "getSelectedRanges": getSelectedRanges,
  113. "setSelectedRanges": setSelectedRanges,
  114. "init": init,
  115. "destroy": destroy,
  116. "onSelectedRangesChanged": new Slick.Event()
  117. });
  118. }
  119. })(jQuery);