Changeset 800


Ignore:
Timestamp:
03/28/07 00:47:11 (12 years ago)
Author:
wymsy
Message:

Fixes for TableOperations?, tickets #82, #908, #912 and #947

Location:
trunk/plugins/TableOperations
Files:
1 added
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/plugins/TableOperations/table-operations.js

    r719 r800  
    461461        } 
    462462 
     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 
    463509        switch (button_id) { 
    464510                // ROWS 
     
    596642                break; 
    597643            case "TO-cell-merge": 
    598                 // !! FIXME: Mozilla specific !! 
     644                //Mozilla, as opposed to IE, allows the selection of several cells, which is fine :) 
    599645                var sel = editor._getSelection(); 
    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                                        } 
    609672                                } 
    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);  
    621676                } else { 
    622                         // Internet Explorer "browser" 
     677                        // Internet Explorer "browser" or not more than one cell selected in Moz 
    623678                        var td = this.getClosest("td"); 
    624679                        if (!td) { 
     
    626681                                break; 
    627682                        } 
    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; 
    649686                                } 
    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 += "&nbsp;"); 
    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                } 
    675696                break; 
    676697 
Note: See TracChangeset for help on using the changeset viewer.