mergeCells.js 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648
  1. 'use strict';
  2. exports.__esModule = true;
  3. var _pluginHooks = require('./../../pluginHooks');
  4. var _pluginHooks2 = _interopRequireDefault(_pluginHooks);
  5. var _plugins = require('./../../plugins');
  6. var _event = require('./../../helpers/dom/event');
  7. var _src = require('./../../3rdparty/walkontable/src');
  8. function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
  9. function CellInfoCollection() {
  10. var collection = [];
  11. collection.getInfo = function (row, col) {
  12. for (var i = 0, ilen = this.length; i < ilen; i++) {
  13. if (this[i].row <= row && this[i].row + this[i].rowspan - 1 >= row && this[i].col <= col && this[i].col + this[i].colspan - 1 >= col) {
  14. return this[i];
  15. }
  16. }
  17. };
  18. collection.setInfo = function (info) {
  19. for (var i = 0, ilen = this.length; i < ilen; i++) {
  20. if (this[i].row === info.row && this[i].col === info.col) {
  21. this[i] = info;
  22. return;
  23. }
  24. }
  25. this.push(info);
  26. };
  27. collection.removeInfo = function (row, col) {
  28. for (var i = 0, ilen = this.length; i < ilen; i++) {
  29. if (this[i].row === row && this[i].col === col) {
  30. this.splice(i, 1);
  31. break;
  32. }
  33. }
  34. };
  35. return collection;
  36. }
  37. /**
  38. * Plugin used to merge cells in Handsontable.
  39. *
  40. * @private
  41. * @plugin MergeCells
  42. * @class MergeCells
  43. */
  44. function MergeCells(mergeCellsSetting) {
  45. this.mergedCellInfoCollection = new CellInfoCollection();
  46. if (Array.isArray(mergeCellsSetting)) {
  47. for (var i = 0, ilen = mergeCellsSetting.length; i < ilen; i++) {
  48. this.mergedCellInfoCollection.setInfo(mergeCellsSetting[i]);
  49. }
  50. }
  51. }
  52. /**
  53. * @param cellRange (CellRange)
  54. */
  55. MergeCells.prototype.canMergeRange = function (cellRange) {
  56. // is more than one cell selected
  57. return !cellRange.isSingle();
  58. };
  59. MergeCells.prototype.mergeRange = function (cellRange) {
  60. if (!this.canMergeRange(cellRange)) {
  61. return;
  62. }
  63. // normalize top left corner
  64. var topLeft = cellRange.getTopLeftCorner();
  65. var bottomRight = cellRange.getBottomRightCorner();
  66. var mergeParent = {};
  67. mergeParent.row = topLeft.row;
  68. mergeParent.col = topLeft.col;
  69. // TD has rowspan == 1 by default. rowspan == 2 means spread over 2 cells
  70. mergeParent.rowspan = bottomRight.row - topLeft.row + 1;
  71. mergeParent.colspan = bottomRight.col - topLeft.col + 1;
  72. this.mergedCellInfoCollection.setInfo(mergeParent);
  73. };
  74. MergeCells.prototype.mergeOrUnmergeSelection = function (cellRange) {
  75. var info = this.mergedCellInfoCollection.getInfo(cellRange.from.row, cellRange.from.col);
  76. if (info) {
  77. // unmerge
  78. this.unmergeSelection(cellRange.from);
  79. } else {
  80. // merge
  81. this.mergeSelection(cellRange);
  82. }
  83. };
  84. MergeCells.prototype.mergeSelection = function (cellRange) {
  85. this.mergeRange(cellRange);
  86. };
  87. MergeCells.prototype.unmergeSelection = function (cellRange) {
  88. var info = this.mergedCellInfoCollection.getInfo(cellRange.row, cellRange.col);
  89. this.mergedCellInfoCollection.removeInfo(info.row, info.col);
  90. };
  91. MergeCells.prototype.applySpanProperties = function (TD, row, col) {
  92. var info = this.mergedCellInfoCollection.getInfo(row, col);
  93. if (info) {
  94. if (info.row === row && info.col === col) {
  95. TD.setAttribute('rowspan', info.rowspan);
  96. TD.setAttribute('colspan', info.colspan);
  97. } else {
  98. TD.removeAttribute('rowspan');
  99. TD.removeAttribute('colspan');
  100. TD.style.display = 'none';
  101. }
  102. } else {
  103. TD.removeAttribute('rowspan');
  104. TD.removeAttribute('colspan');
  105. }
  106. };
  107. MergeCells.prototype.modifyTransform = function (hook, currentSelectedRange, delta) {
  108. var sameRowspan = function sameRowspan(merged, coords) {
  109. if (coords.row >= merged.row && coords.row <= merged.row + merged.rowspan - 1) {
  110. return true;
  111. }
  112. return false;
  113. },
  114. sameColspan = function sameColspan(merged, coords) {
  115. if (coords.col >= merged.col && coords.col <= merged.col + merged.colspan - 1) {
  116. return true;
  117. }
  118. return false;
  119. },
  120. getNextPosition = function getNextPosition(newDelta) {
  121. return new _src.CellCoords(currentSelectedRange.to.row + newDelta.row, currentSelectedRange.to.col + newDelta.col);
  122. };
  123. var newDelta = {
  124. row: delta.row,
  125. col: delta.col
  126. };
  127. if (hook == 'modifyTransformStart') {
  128. /* eslint-disable block-scoped-var */
  129. var nextPosition;
  130. if (!this.lastDesiredCoords) {
  131. this.lastDesiredCoords = new _src.CellCoords(null, null);
  132. }
  133. var currentPosition = new _src.CellCoords(currentSelectedRange.highlight.row, currentSelectedRange.highlight.col),
  134. // if current position's parent is a merged range, returns it
  135. mergedParent = this.mergedCellInfoCollection.getInfo(currentPosition.row, currentPosition.col),
  136. currentRangeContainsMerge; // if current range contains a merged range
  137. for (var i = 0, mergesLength = this.mergedCellInfoCollection.length; i < mergesLength; i++) {
  138. var range = this.mergedCellInfoCollection[i];
  139. range = new _src.CellCoords(range.row + range.rowspan - 1, range.col + range.colspan - 1);
  140. if (currentSelectedRange.includes(range)) {
  141. currentRangeContainsMerge = true;
  142. break;
  143. }
  144. }
  145. if (mergedParent) {
  146. // only merge selected
  147. var mergeTopLeft = new _src.CellCoords(mergedParent.row, mergedParent.col);
  148. var mergeBottomRight = new _src.CellCoords(mergedParent.row + mergedParent.rowspan - 1, mergedParent.col + mergedParent.colspan - 1);
  149. var mergeRange = new _src.CellRange(mergeTopLeft, mergeTopLeft, mergeBottomRight);
  150. if (!mergeRange.includes(this.lastDesiredCoords)) {
  151. this.lastDesiredCoords = new _src.CellCoords(null, null); // reset outdated version of lastDesiredCoords
  152. }
  153. newDelta.row = this.lastDesiredCoords.row ? this.lastDesiredCoords.row - currentPosition.row : newDelta.row;
  154. newDelta.col = this.lastDesiredCoords.col ? this.lastDesiredCoords.col - currentPosition.col : newDelta.col;
  155. if (delta.row > 0) {
  156. // moving down
  157. newDelta.row = mergedParent.row + mergedParent.rowspan - 1 - currentPosition.row + delta.row;
  158. } else if (delta.row < 0) {
  159. // moving up
  160. newDelta.row = currentPosition.row - mergedParent.row + delta.row;
  161. }
  162. if (delta.col > 0) {
  163. // moving right
  164. newDelta.col = mergedParent.col + mergedParent.colspan - 1 - currentPosition.col + delta.col;
  165. } else if (delta.col < 0) {
  166. // moving left
  167. newDelta.col = currentPosition.col - mergedParent.col + delta.col;
  168. }
  169. }
  170. nextPosition = new _src.CellCoords(currentSelectedRange.highlight.row + newDelta.row, currentSelectedRange.highlight.col + newDelta.col);
  171. var nextParentIsMerged = this.mergedCellInfoCollection.getInfo(nextPosition.row, nextPosition.col);
  172. if (nextParentIsMerged) {
  173. // skipping the invisible cells in the merge range
  174. this.lastDesiredCoords = nextPosition;
  175. newDelta = {
  176. row: nextParentIsMerged.row - currentPosition.row,
  177. col: nextParentIsMerged.col - currentPosition.col
  178. };
  179. }
  180. } else if (hook == 'modifyTransformEnd') {
  181. for (var _i = 0, _mergesLength = this.mergedCellInfoCollection.length; _i < _mergesLength; _i++) {
  182. var currentMerge = this.mergedCellInfoCollection[_i];
  183. var _mergeTopLeft = new _src.CellCoords(currentMerge.row, currentMerge.col);
  184. var _mergeBottomRight = new _src.CellCoords(currentMerge.row + currentMerge.rowspan - 1, currentMerge.col + currentMerge.colspan - 1);
  185. var mergedRange = new _src.CellRange(_mergeTopLeft, _mergeTopLeft, _mergeBottomRight);
  186. var sharedBorders = currentSelectedRange.getBordersSharedWith(mergedRange);
  187. if (mergedRange.isEqual(currentSelectedRange)) {
  188. // only the merged range is selected
  189. currentSelectedRange.setDirection('NW-SE');
  190. } else if (sharedBorders.length > 0) {
  191. var mergeHighlighted = currentSelectedRange.highlight.isEqual(mergedRange.from);
  192. if (sharedBorders.indexOf('top') > -1) {
  193. // if range shares a border with the merged section, change range direction accordingly
  194. if (currentSelectedRange.to.isSouthEastOf(mergedRange.from) && mergeHighlighted) {
  195. currentSelectedRange.setDirection('NW-SE');
  196. } else if (currentSelectedRange.to.isSouthWestOf(mergedRange.from) && mergeHighlighted) {
  197. currentSelectedRange.setDirection('NE-SW');
  198. }
  199. } else if (sharedBorders.indexOf('bottom') > -1) {
  200. if (currentSelectedRange.to.isNorthEastOf(mergedRange.from) && mergeHighlighted) {
  201. currentSelectedRange.setDirection('SW-NE');
  202. } else if (currentSelectedRange.to.isNorthWestOf(mergedRange.from) && mergeHighlighted) {
  203. currentSelectedRange.setDirection('SE-NW');
  204. }
  205. }
  206. }
  207. nextPosition = getNextPosition(newDelta);
  208. var withinRowspan = sameRowspan(currentMerge, nextPosition),
  209. withinColspan = sameColspan(currentMerge, nextPosition);
  210. if (currentSelectedRange.includesRange(mergedRange) && (mergedRange.includes(nextPosition) || withinRowspan || withinColspan)) {
  211. // if next step overlaps a merged range, jump past it
  212. if (withinRowspan) {
  213. if (newDelta.row < 0) {
  214. newDelta.row -= currentMerge.rowspan - 1;
  215. } else if (newDelta.row > 0) {
  216. newDelta.row += currentMerge.rowspan - 1;
  217. }
  218. }
  219. if (withinColspan) {
  220. if (newDelta.col < 0) {
  221. newDelta.col -= currentMerge.colspan - 1;
  222. } else if (newDelta.col > 0) {
  223. newDelta.col += currentMerge.colspan - 1;
  224. }
  225. }
  226. }
  227. }
  228. }
  229. if (newDelta.row !== 0) {
  230. delta.row = newDelta.row;
  231. }
  232. if (newDelta.col !== 0) {
  233. delta.col = newDelta.col;
  234. }
  235. };
  236. MergeCells.prototype.shiftCollection = function (direction, index, count) {
  237. var shiftVector = [0, 0];
  238. switch (direction) {
  239. case 'right':
  240. shiftVector[0] += 1;
  241. break;
  242. case 'left':
  243. shiftVector[0] -= 1;
  244. break;
  245. case 'down':
  246. shiftVector[1] += 1;
  247. break;
  248. case 'up':
  249. shiftVector[1] -= 1;
  250. break;
  251. default:
  252. break;
  253. }
  254. for (var i = 0; i < this.mergedCellInfoCollection.length; i++) {
  255. var currentMerge = this.mergedCellInfoCollection[i];
  256. if (direction === 'right' || direction === 'left') {
  257. if (index <= currentMerge.col) {
  258. currentMerge.col += shiftVector[0];
  259. }
  260. } else if (index <= currentMerge.row) {
  261. currentMerge.row += shiftVector[1];
  262. }
  263. }
  264. };
  265. var beforeInit = function beforeInit() {
  266. var instance = this;
  267. var mergeCellsSetting = instance.getSettings().mergeCells;
  268. if (mergeCellsSetting) {
  269. if (!instance.mergeCells) {
  270. instance.mergeCells = new MergeCells(mergeCellsSetting);
  271. }
  272. }
  273. };
  274. var afterInit = function afterInit() {
  275. var instance = this;
  276. if (instance.mergeCells) {
  277. /**
  278. * Monkey patch Table.prototype.getCell to return TD for merged cell parent if asked for TD of a cell that is
  279. * invisible due to the merge. This is not the cleanest solution but there is a test case for it (merged cells scroll) so feel free to refactor it!
  280. */
  281. instance.view.wt.wtTable.getCell = function (coords) {
  282. if (instance.getSettings().mergeCells) {
  283. var mergeParent = instance.mergeCells.mergedCellInfoCollection.getInfo(coords.row, coords.col);
  284. if (mergeParent) {
  285. coords = mergeParent;
  286. }
  287. }
  288. return _src.Table.prototype.getCell.call(this, coords);
  289. };
  290. }
  291. };
  292. var afterUpdateSettings = function afterUpdateSettings() {
  293. var instance = this;
  294. var mergeCellsSetting = instance.getSettings().mergeCells;
  295. if (mergeCellsSetting) {
  296. if (instance.mergeCells) {
  297. instance.mergeCells.mergedCellInfoCollection = new CellInfoCollection();
  298. if (Array.isArray(mergeCellsSetting)) {
  299. for (var i = 0, ilen = mergeCellsSetting.length; i < ilen; i++) {
  300. instance.mergeCells.mergedCellInfoCollection.setInfo(mergeCellsSetting[i]);
  301. }
  302. }
  303. } else {
  304. instance.mergeCells = new MergeCells(mergeCellsSetting);
  305. }
  306. } else if (instance.mergeCells) {
  307. // it doesn't actually turn off the plugin, just resets the settings. Need to refactor.
  308. instance.mergeCells.mergedCellInfoCollection = new CellInfoCollection();
  309. }
  310. };
  311. var onBeforeKeyDown = function onBeforeKeyDown(event) {
  312. if (!this.mergeCells) {
  313. return;
  314. }
  315. var ctrlDown = (event.ctrlKey || event.metaKey) && !event.altKey;
  316. if (ctrlDown) {
  317. if (event.keyCode === 77) {
  318. // CTRL + M
  319. this.mergeCells.mergeOrUnmergeSelection(this.getSelectedRange());
  320. this.render();
  321. (0, _event.stopImmediatePropagation)(event);
  322. }
  323. }
  324. };
  325. var addMergeActionsToContextMenu = function addMergeActionsToContextMenu(defaultOptions) {
  326. if (!this.getSettings().mergeCells) {
  327. return;
  328. }
  329. defaultOptions.items.push({ name: '---------' });
  330. defaultOptions.items.push({
  331. key: 'mergeCells',
  332. name: function name() {
  333. var sel = this.getSelected();
  334. var info = this.mergeCells.mergedCellInfoCollection.getInfo(sel[0], sel[1]);
  335. if (info) {
  336. return 'Unmerge cells';
  337. }
  338. return 'Merge cells';
  339. },
  340. callback: function callback() {
  341. this.mergeCells.mergeOrUnmergeSelection(this.getSelectedRange());
  342. this.render();
  343. },
  344. disabled: function disabled() {
  345. return this.selection.selectedHeader.corner;
  346. }
  347. });
  348. };
  349. var afterRenderer = function afterRenderer(TD, row, col, prop, value, cellProperties) {
  350. if (this.mergeCells) {
  351. this.mergeCells.applySpanProperties(TD, row, col);
  352. }
  353. };
  354. var modifyTransformFactory = function modifyTransformFactory(hook) {
  355. return function (delta) {
  356. var mergeCellsSetting = this.getSettings().mergeCells;
  357. if (mergeCellsSetting) {
  358. var currentSelectedRange = this.getSelectedRange();
  359. this.mergeCells.modifyTransform(hook, currentSelectedRange, delta);
  360. if (hook === 'modifyTransformEnd') {
  361. // sanitize "from" (core.js will sanitize to)
  362. var totalRows = this.countRows();
  363. var totalCols = this.countCols();
  364. if (currentSelectedRange.from.row < 0) {
  365. currentSelectedRange.from.row = 0;
  366. } else if (currentSelectedRange.from.row > 0 && currentSelectedRange.from.row >= totalRows) {
  367. currentSelectedRange.from.row = currentSelectedRange.from - 1;
  368. }
  369. if (currentSelectedRange.from.col < 0) {
  370. currentSelectedRange.from.col = 0;
  371. } else if (currentSelectedRange.from.col > 0 && currentSelectedRange.from.col >= totalCols) {
  372. currentSelectedRange.from.col = totalCols - 1;
  373. }
  374. }
  375. }
  376. };
  377. };
  378. /**
  379. * While selecting cells with keyboard or mouse, make sure that rectangular area is expanded to the extent of the merged cell
  380. * @param coords
  381. */
  382. var beforeSetRangeEnd = function beforeSetRangeEnd(coords) {
  383. this.lastDesiredCoords = null; // unset lastDesiredCoords when selection is changed with mouse
  384. var mergeCellsSetting = this.getSettings().mergeCells;
  385. if (mergeCellsSetting) {
  386. var selRange = this.getSelectedRange();
  387. selRange.highlight = new _src.CellCoords(selRange.highlight.row, selRange.highlight.col); // clone in case we will modify its reference
  388. selRange.to = coords;
  389. var rangeExpanded = false;
  390. do {
  391. rangeExpanded = false;
  392. for (var i = 0, ilen = this.mergeCells.mergedCellInfoCollection.length; i < ilen; i++) {
  393. var cellInfo = this.mergeCells.mergedCellInfoCollection[i];
  394. var mergedCellTopLeft = new _src.CellCoords(cellInfo.row, cellInfo.col);
  395. var mergedCellBottomRight = new _src.CellCoords(cellInfo.row + cellInfo.rowspan - 1, cellInfo.col + cellInfo.colspan - 1);
  396. var mergedCellRange = new _src.CellRange(mergedCellTopLeft, mergedCellTopLeft, mergedCellBottomRight);
  397. if (selRange.expandByRange(mergedCellRange)) {
  398. coords.row = selRange.to.row;
  399. coords.col = selRange.to.col;
  400. rangeExpanded = true;
  401. }
  402. }
  403. } while (rangeExpanded);
  404. }
  405. };
  406. /**
  407. * Returns correct coordinates for merged start / end cells in selection for area borders
  408. * @param corners
  409. * @param className
  410. */
  411. var beforeDrawAreaBorders = function beforeDrawAreaBorders(corners, className) {
  412. if (className && className == 'area') {
  413. var mergeCellsSetting = this.getSettings().mergeCells;
  414. if (mergeCellsSetting) {
  415. var selRange = this.getSelectedRange();
  416. var startRange = new _src.CellRange(selRange.from, selRange.from, selRange.from);
  417. var stopRange = new _src.CellRange(selRange.to, selRange.to, selRange.to);
  418. for (var i = 0, ilen = this.mergeCells.mergedCellInfoCollection.length; i < ilen; i++) {
  419. var cellInfo = this.mergeCells.mergedCellInfoCollection[i];
  420. var mergedCellTopLeft = new _src.CellCoords(cellInfo.row, cellInfo.col);
  421. var mergedCellBottomRight = new _src.CellCoords(cellInfo.row + cellInfo.rowspan - 1, cellInfo.col + cellInfo.colspan - 1);
  422. var mergedCellRange = new _src.CellRange(mergedCellTopLeft, mergedCellTopLeft, mergedCellBottomRight);
  423. if (startRange.expandByRange(mergedCellRange)) {
  424. corners[0] = startRange.from.row;
  425. corners[1] = startRange.from.col;
  426. }
  427. if (stopRange.expandByRange(mergedCellRange)) {
  428. corners[2] = stopRange.from.row;
  429. corners[3] = stopRange.from.col;
  430. }
  431. }
  432. }
  433. }
  434. };
  435. var afterGetCellMeta = function afterGetCellMeta(row, col, cellProperties) {
  436. var mergeCellsSetting = this.getSettings().mergeCells;
  437. if (mergeCellsSetting) {
  438. var mergeParent = this.mergeCells.mergedCellInfoCollection.getInfo(row, col);
  439. if (mergeParent && (mergeParent.row != row || mergeParent.col != col)) {
  440. cellProperties.copyable = false;
  441. }
  442. }
  443. };
  444. var afterViewportRowCalculatorOverride = function afterViewportRowCalculatorOverride(calc) {
  445. var mergeCellsSetting = this.getSettings().mergeCells;
  446. if (mergeCellsSetting) {
  447. var colCount = this.countCols();
  448. var mergeParent;
  449. for (var c = 0; c < colCount; c++) {
  450. mergeParent = this.mergeCells.mergedCellInfoCollection.getInfo(calc.startRow, c);
  451. if (mergeParent) {
  452. if (mergeParent.row < calc.startRow) {
  453. calc.startRow = mergeParent.row;
  454. return afterViewportRowCalculatorOverride.call(this, calc); // recursively search upwards
  455. }
  456. }
  457. mergeParent = this.mergeCells.mergedCellInfoCollection.getInfo(calc.endRow, c);
  458. if (mergeParent) {
  459. var mergeEnd = mergeParent.row + mergeParent.rowspan - 1;
  460. if (mergeEnd > calc.endRow) {
  461. calc.endRow = mergeEnd;
  462. return afterViewportRowCalculatorOverride.call(this, calc); // recursively search upwards
  463. }
  464. }
  465. }
  466. }
  467. };
  468. var afterViewportColumnCalculatorOverride = function afterViewportColumnCalculatorOverride(calc) {
  469. var mergeCellsSetting = this.getSettings().mergeCells;
  470. if (mergeCellsSetting) {
  471. var rowCount = this.countRows();
  472. var mergeParent;
  473. for (var r = 0; r < rowCount; r++) {
  474. mergeParent = this.mergeCells.mergedCellInfoCollection.getInfo(r, calc.startColumn);
  475. if (mergeParent) {
  476. if (mergeParent.col < calc.startColumn) {
  477. calc.startColumn = mergeParent.col;
  478. return afterViewportColumnCalculatorOverride.call(this, calc); // recursively search upwards
  479. }
  480. }
  481. mergeParent = this.mergeCells.mergedCellInfoCollection.getInfo(r, calc.endColumn);
  482. if (mergeParent) {
  483. var mergeEnd = mergeParent.col + mergeParent.colspan - 1;
  484. if (mergeEnd > calc.endColumn) {
  485. calc.endColumn = mergeEnd;
  486. return afterViewportColumnCalculatorOverride.call(this, calc); // recursively search upwards
  487. }
  488. }
  489. }
  490. }
  491. };
  492. var isMultipleSelection = function isMultipleSelection(isMultiple) {
  493. if (isMultiple && this.mergeCells) {
  494. var mergedCells = this.mergeCells.mergedCellInfoCollection,
  495. selectionRange = this.getSelectedRange();
  496. for (var group in mergedCells) {
  497. if (selectionRange.highlight.row == mergedCells[group].row && selectionRange.highlight.col == mergedCells[group].col && selectionRange.to.row == mergedCells[group].row + mergedCells[group].rowspan - 1 && selectionRange.to.col == mergedCells[group].col + mergedCells[group].colspan - 1) {
  498. return false;
  499. }
  500. }
  501. }
  502. return isMultiple;
  503. };
  504. function modifyAutofillRange(select, drag) {
  505. var mergeCellsSetting = this.getSettings().mergeCells;
  506. if (!mergeCellsSetting || this.selection.isMultiple()) {
  507. return;
  508. }
  509. var info = this.mergeCells.mergedCellInfoCollection.getInfo(select[0], select[1]);
  510. if (info) {
  511. select[0] = info.row;
  512. select[1] = info.col;
  513. select[2] = info.row + info.rowspan - 1;
  514. select[3] = info.col + info.colspan - 1;
  515. }
  516. }
  517. function onAfterCreateCol(col, count) {
  518. if (this.mergeCells) {
  519. this.mergeCells.shiftCollection('right', col, count);
  520. }
  521. }
  522. function onAfterRemoveCol(col, count) {
  523. if (this.mergeCells) {
  524. this.mergeCells.shiftCollection('left', col, count);
  525. }
  526. }
  527. function onAfterCreateRow(row, count) {
  528. if (this.mergeCells) {
  529. this.mergeCells.shiftCollection('down', row, count);
  530. }
  531. }
  532. function onAfterRemoveRow(row, count) {
  533. if (this.mergeCells) {
  534. this.mergeCells.shiftCollection('up', row, count);
  535. }
  536. }
  537. var hook = _pluginHooks2.default.getSingleton();
  538. hook.add('beforeInit', beforeInit);
  539. hook.add('afterInit', afterInit);
  540. hook.add('afterUpdateSettings', afterUpdateSettings);
  541. hook.add('beforeKeyDown', onBeforeKeyDown);
  542. hook.add('modifyTransformStart', modifyTransformFactory('modifyTransformStart'));
  543. hook.add('modifyTransformEnd', modifyTransformFactory('modifyTransformEnd'));
  544. hook.add('beforeSetRangeEnd', beforeSetRangeEnd);
  545. hook.add('beforeDrawBorders', beforeDrawAreaBorders);
  546. hook.add('afterIsMultipleSelection', isMultipleSelection);
  547. hook.add('afterRenderer', afterRenderer);
  548. hook.add('afterContextMenuDefaultOptions', addMergeActionsToContextMenu);
  549. hook.add('afterGetCellMeta', afterGetCellMeta);
  550. hook.add('afterViewportRowCalculatorOverride', afterViewportRowCalculatorOverride);
  551. hook.add('afterViewportColumnCalculatorOverride', afterViewportColumnCalculatorOverride);
  552. hook.add('modifyAutofillRange', modifyAutofillRange);
  553. hook.add('afterCreateCol', onAfterCreateCol);
  554. hook.add('afterRemoveCol', onAfterRemoveCol);
  555. hook.add('afterCreateRow', onAfterCreateRow);
  556. hook.add('afterRemoveRow', onAfterRemoveRow);
  557. exports.default = MergeCells;