delete.js 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248
  1. /*jslint nomen: false*/
  2. /*global Trex, $tom, $tx, _FALSE, _NULL, _TRUE */
  3. Trex.Table.Delete = Trex.Class.create({
  4. initialize: function (editor/*, config*/) {
  5. var canvas;
  6. canvas = editor.getCanvas();
  7. this.wysiwygPanel = canvas.getPanel(Trex.Canvas.__WYSIWYG_MODE);
  8. },
  9. /**
  10. * deleteRow
  11. * @param {Trex.Table.Selector} tableSelector
  12. */
  13. deleteRow: function (tableSelector) {
  14. var boundary;
  15. boundary = tableSelector.getSelected();
  16. if (boundary.isValid()) {
  17. this.deleteRowOneByOne(tableSelector);
  18. tableSelector.reset();
  19. this.deleteEmptyTableByTableSelector(tableSelector);
  20. }
  21. },
  22. /**
  23. * @private
  24. * @param {Trex.Table.Selector} tableSelector
  25. */
  26. deleteRowOneByOne: function (tableSelector) {
  27. var deleteStartIndex, count, boundary, indexer;
  28. boundary = tableSelector.getSelected();
  29. deleteStartIndex = boundary.top;
  30. count = boundary.bottom - boundary.top + 1;
  31. while (0 < count) {
  32. tableSelector.reloadIndexer();
  33. indexer = tableSelector.getIndexer();
  34. this.deleteRowByIndex(indexer, deleteStartIndex);
  35. count -= 1;
  36. }
  37. if (deleteStartIndex === 0) {
  38. this.drawTopBorder(tableSelector);
  39. }
  40. },
  41. drawTopBorder: function (tableSelector) {
  42. var indexer, tdArr, len, i, td;
  43. tableSelector.reloadIndexer();
  44. indexer = tableSelector.getIndexer();
  45. tdArr = indexer.getTdArrHasTop(0);
  46. len = tdArr.length;
  47. for (i = 0; i < len; i += 1) {
  48. td = tdArr[i];
  49. if (td.style.borderTop === "" && td.style.borderBottom !== "") {
  50. td.style.borderTop = td.style.borderBottom;
  51. }
  52. }
  53. },
  54. /**
  55. * @private
  56. * @param {Trex.TableUtil.Indexer} indexer
  57. * @param {number} index
  58. */
  59. deleteRowByIndex: function (indexer, index) {
  60. var tdArr, hasTopTdArr, len, tr;
  61. tdArr = this.getTdArrByRowIndex(indexer, index);
  62. hasTopTdArr = this.getTdArrByHasTop(indexer, index);
  63. len = tdArr.length;
  64. if (0 < len) {
  65. tr = $tom.parent(tdArr[0]);
  66. this.deleteTdInDeleteRow(tdArr, hasTopTdArr, tr, indexer);
  67. $tom.remove(tr);
  68. }
  69. },
  70. /**
  71. * @private
  72. * @param {Trex.TableUtil.Indexer} indexer
  73. * @param {number} index
  74. */
  75. getTdArrByRowIndex: function (indexer, index) {
  76. return indexer.getTdArr(new Trex.TableUtil.Boundary({
  77. top: index,
  78. right: indexer.getColSize() - 1,
  79. bottom: index,
  80. left: 0
  81. }));
  82. },
  83. /**
  84. * @private
  85. * @param {Trex.TableUtil.Indexer} indexer
  86. * @param {number} index
  87. */
  88. getTdArrByHasTop: function (indexer, index) {
  89. return indexer.getTdArrHasTop(index);
  90. },
  91. /**
  92. *
  93. * @param {Array} tdArr
  94. * @param {Array} hasTopTdArr
  95. * @param {Element} tr
  96. * @param {Trex.TableUtil.Indexer} indexer
  97. */
  98. deleteTdInDeleteRow: function (tdArr, hasTopTdArr, tr, indexer) {
  99. var len, i, td;
  100. len = tdArr.length;
  101. for (i = 0; i < len; i += 1) {
  102. td = tdArr[i];
  103. if (1 < td.rowSpan) {
  104. td.rowSpan -= 1;
  105. this.reduceHeightAsRow(td, tr);
  106. if (hasTopTdArr.contains(td)) {
  107. this.shiftRowOfTd(td, indexer);
  108. }
  109. } else {
  110. $tom.remove(td);
  111. }
  112. }
  113. },
  114. reduceHeightAsRow: function (td, tr) {
  115. var styleHeight, newHeight;
  116. if (td.style.height) {
  117. styleHeight = parseInt(td.style.height, 10);
  118. newHeight = styleHeight - tr.offsetHeight;
  119. if (0 < newHeight) {
  120. $tom.setStyles(td, {
  121. height: newHeight + "px"
  122. }, _TRUE);
  123. }
  124. }
  125. },
  126. /**
  127. * @private
  128. * @param {Eelement} td
  129. * @param {Trex.TableUtil.Indexer} indexer
  130. */
  131. shiftRowOfTd: function (td, indexer) {
  132. var tr, trForInsert, tdForInsert;
  133. tr = $tom.parent(td);
  134. trForInsert = $tom.next(tr, "tr");
  135. tdForInsert = this.getTdForInsert(td, trForInsert, indexer);
  136. if (tdForInsert) {
  137. $tom.insertAt(td, tdForInsert);
  138. } else {
  139. $tom.append(trForInsert, td);
  140. }
  141. },
  142. /**
  143. * @private
  144. * @param {Element} td
  145. * @param {Element} trForInsert
  146. * @param {Trex.TableUtil.Indexer} indexer
  147. */
  148. getTdForInsert: function (td, trForInsert, indexer) {
  149. var currentBoundary, colForInsert, cells, len, i, cell, cellBoundary;
  150. currentBoundary = indexer.getBoundary(td);
  151. colForInsert = currentBoundary.left;
  152. cells = trForInsert.cells;
  153. len = cells.length;
  154. for (i = 0; i < len; i += 1) {
  155. cell = cells[i];
  156. cellBoundary = indexer.getBoundary(cell);
  157. if (colForInsert <= cellBoundary.left) {
  158. return cell;
  159. }
  160. }
  161. return _NULL;
  162. },
  163. /**
  164. * @private
  165. * @param {Trex.Table.Selector} tableSelector
  166. */
  167. deleteEmptyTableByTableSelector: function (tableSelector) {
  168. var indexer, table;
  169. indexer = tableSelector.getIndexer();
  170. table = indexer.table;
  171. if (table.rows.length === 0) {
  172. $tom.remove(table);
  173. }
  174. },
  175. /**
  176. * deleteCol
  177. * @param {Trex.Table.Selector} tableSelector
  178. */
  179. deleteCol: function (tableSelector) {
  180. var boundary;
  181. boundary = tableSelector.getSelected();
  182. if (boundary.isValid()) {
  183. this.deleteColOneByOne(tableSelector);
  184. tableSelector.reset();
  185. this.deleteEmptyTableByTableSelector(tableSelector);
  186. }
  187. },
  188. /**
  189. * @private
  190. * @param {Trex.Table.Selector} tableSelector
  191. */
  192. deleteColOneByOne: function (tableSelector) {
  193. var deleteStartIndex, count, boundary, indexer;
  194. boundary = tableSelector.getSelected();
  195. deleteStartIndex = boundary.left;
  196. count = boundary.right - boundary.left + 1;
  197. while (0 < count) {
  198. tableSelector.reloadIndexer();
  199. indexer = tableSelector.getIndexer();
  200. this.deleteColByIndex(indexer, deleteStartIndex);
  201. count -= 1;
  202. }
  203. if (deleteStartIndex === 0) {
  204. this.drawLeftBorder(tableSelector);
  205. }
  206. },
  207. drawLeftBorder: function (tableSelector) {
  208. var indexer, tdArr, len, i, td;
  209. tableSelector.reloadIndexer();
  210. indexer = tableSelector.getIndexer();
  211. tdArr = indexer.getTdArrHasLeft(0);
  212. len = tdArr.length;
  213. for (i = 0; i < len; i += 1) {
  214. td = tdArr[i];
  215. if (td.style.borderLeft === "" && td.style.borderRight !== "") {
  216. td.style.borderLeft = td.style.borderRight;
  217. }
  218. }
  219. },
  220. /**
  221. * @private
  222. * @param {Trex.TableUtil.Indexer} indexer
  223. * @param {number} index
  224. */
  225. deleteColByIndex: function (indexer, index) {
  226. var tdArr, len, i, td;
  227. tdArr = this.getTdArrByColIndex(indexer, index);
  228. len = tdArr.length;
  229. for (i = 0; i < len; i += 1) {
  230. td = tdArr[i];
  231. if (1 < td.colSpan) {
  232. td.colSpan -= 1;
  233. //TODO.azki width 조절..?
  234. } else {
  235. $tom.remove(td);
  236. }
  237. }
  238. },
  239. getTdArrByColIndex: function (indexer, index) {
  240. return indexer.getTdArr(new Trex.TableUtil.Boundary({
  241. top: 0,
  242. right: index,
  243. bottom: indexer.getRowSize() - 1,
  244. left: index
  245. }));
  246. }
  247. });