| | 463 | function cellMerge(table, cell_index, row_index, no_cols, no_rows) { |
| | 464 | var rows = []; |
| | 465 | var cells = []; |
| | 466 | try { |
| | 467 | for (i=row_index; i<row_index+no_rows; i++) { |
| | 468 | var row = table.rows[i]; |
| | 469 | for (j=cell_index; j<cell_index+no_cols; j++) { |
| | 470 | if (row.cells[j].colSpan > 1 || row.cells[j].rowSpan > 1) { |
| | 471 | splitCell(row.cells[j]); |
| | 472 | } |
| | 473 | cells.push(row.cells[j]); |
| | 474 | } |
| | 475 | if (cells.length > 0) { |
| | 476 | rows.push(cells); |
| | 477 | cells = []; |
| | 478 | } |
| | 479 | } |
| | 480 | } catch(e) { |
| | 481 | alert("Invalid selection"); |
| | 482 | return false; |
| | 483 | } |
| | 484 | var row_index1 = rows[0][0].parentNode.rowIndex; |
| | 485 | var row_index2 = rows[rows.length-1][0].parentNode.rowIndex; |
| | 486 | var row_span2 = rows[rows.length-1][0].rowSpan; |
| | 487 | var HTML = ""; |
| | 488 | for (i = 0; i < rows.length; ++i) { |
| | 489 | var cells = rows[i]; |
| | 490 | for (var j = 0; j < cells.length; ++j) { |
| | 491 | var cell = cells[j]; |
| | 492 | HTML += cell.innerHTML; |
| | 493 | (i || j) && (cell.parentNode.removeChild(cell)); |
| | 494 | } |
| | 495 | } |
| | 496 | var td = rows[0][0]; |
| | 497 | td.innerHTML = HTML; |
| | 498 | td.rowSpan = row_index2 - row_index1 + row_span2; |
| | 499 | var col_span = 0; |
| | 500 | for(j=0; j<rows[0].length; j++) { |
| | 501 | col_span += rows[0][j].colSpan; |
| | 502 | } |
| | 503 | td.colSpan = col_span; |
| | 504 | editor.selectNodeContents(td); |
| | 505 | editor.forceRedraw(); |
| | 506 | editor.focusEditor(); |
| | 507 | } |
| | 508 | |
| 600 | | var range, i = 0; |
| 601 | | var rows = []; |
| 602 | | var row = null; |
| 603 | | var cells = null; |
| 604 | | if (!HTMLArea.is_ie) { |
| 605 | | try { |
| 606 | | if (sel.rangeCount < 2) { |
| 607 | | alert(HTMLArea._lc("Please select the cells you want to merge.", "TableOperations")); |
| 608 | | break; |
| | 646 | if (!HTMLArea.is_ie && sel.rangeCount > 1) { |
| | 647 | var range = sel.getRangeAt(0); |
| | 648 | var td = range.startContainer.childNodes[range.startOffset]; |
| | 649 | var tr = td.parentNode; |
| | 650 | var cell_index = td.cellIndex; |
| | 651 | var row_index = tr.rowIndex; |
| | 652 | var row_index2 = 0; |
| | 653 | var rownum = row_index; |
| | 654 | var no_cols = 0; |
| | 655 | var row_colspan = 0; |
| | 656 | var td2, tr2; |
| | 657 | for(i=0; i<sel.rangeCount; i++) { |
| | 658 | range = sel.getRangeAt(i); |
| | 659 | td2 = range.startContainer.childNodes[range.startOffset]; |
| | 660 | tr2 = td2.parentNode; |
| | 661 | if(tr2.rowIndex != rownum) { |
| | 662 | rownum = tr2.rowIndex; |
| | 663 | row_colspan = 0; |
| | 664 | } |
| | 665 | row_colspan += td2.colSpan; |
| | 666 | if(row_colspan > no_cols) { |
| | 667 | no_cols = row_colspan; |
| | 668 | } |
| | 669 | if(tr2.rowIndex + td2.rowSpan - 1 > row_index2) { |
| | 670 | row_index2 = tr2.rowIndex + td2.rowSpan - 1; |
| | 671 | } |
| 610 | | while (range = sel.getRangeAt(i++)) { |
| 611 | | var td = range.startContainer.childNodes[range.startOffset]; |
| 612 | | if (td.parentNode != row) { |
| 613 | | row = td.parentNode; |
| 614 | | (cells) && rows.push(cells); |
| 615 | | cells = []; |
| 616 | | } |
| 617 | | cells.push(td); |
| 618 | | } |
| 619 | | } catch(e) {/* finished walking through selection */} |
| 620 | | rows.push(cells); |
| | 673 | var no_rows = row_index2 - row_index + 1; |
| | 674 | var table = tr.parentNode; |
| | 675 | cellMerge(table, cell_index, row_index, no_cols, no_rows); |
| 628 | | var tr = td.parentElement; |
| 629 | | var no_cols = prompt(HTMLArea._lc("How many columns would you like to merge?", "TableOperations"), 2); |
| 630 | | if (!no_cols) { |
| 631 | | // cancelled |
| 632 | | break; |
| 633 | | } |
| 634 | | var no_rows = prompt(HTMLArea._lc("How many rows would you like to merge?", "TableOperations"), 2); |
| 635 | | if (!no_rows) { |
| 636 | | // cancelled |
| 637 | | break; |
| 638 | | } |
| 639 | | var cell_index = td.cellIndex; |
| 640 | | while (no_rows-- > 0) { |
| 641 | | td = tr.cells[cell_index]; |
| 642 | | cells = [td]; |
| 643 | | for (var i = 1; i < no_cols; ++i) { |
| 644 | | td = td.nextSibling; |
| 645 | | if (!td) { |
| 646 | | break; |
| 647 | | } |
| 648 | | cells.push(td); |
| | 683 | editor._popupDialog("plugin://TableOperations/merge_cells.html", function(param) { |
| | 684 | if (!param) { // user pressed Cancel |
| | 685 | return false; |
| 650 | | rows.push(cells); |
| 651 | | tr = tr.nextSibling; |
| 652 | | if (!tr) { |
| 653 | | break; |
| 654 | | } |
| 655 | | } |
| 656 | | } |
| 657 | | var HTML = ""; |
| 658 | | for (i = 0; i < rows.length; ++i) { |
| 659 | | // i && (HTML += "<br />"); |
| 660 | | var cells = rows[i]; |
| 661 | | for (var j = 0; j < cells.length; ++j) { |
| 662 | | // j && (HTML += " "); |
| 663 | | var cell = cells[j]; |
| 664 | | HTML += cell.innerHTML; |
| 665 | | (i || j) && (cell.parentNode.removeChild(cell)); |
| 666 | | } |
| 667 | | } |
| 668 | | var td = rows[0][0]; |
| 669 | | td.innerHTML = HTML; |
| 670 | | td.rowSpan = rows.length; |
| 671 | | td.colSpan = rows[0].length; |
| 672 | | editor.selectNodeContents(td); |
| 673 | | editor.forceRedraw(); |
| 674 | | editor.focusEditor(); |
| | 687 | no_cols = parseInt(param['f_cols'],10) + 1; |
| | 688 | no_rows = parseInt(param['f_rows'],10) + 1; |
| | 689 | var tr = td.parentNode; |
| | 690 | var cell_index = td.cellIndex; |
| | 691 | var row_index = tr.rowIndex; |
| | 692 | var table = tr.parentNode; |
| | 693 | cellMerge(table, cell_index, row_index, no_cols, no_rows); |
| | 694 | }, null); |
| | 695 | } |