Ticket #2859: 2859_2.patch

File 2859_2.patch, 7.3 KB (added by Martin Kou, 10 years ago)
  • editor/_source/internals/fcktablehandler.js

     
    4141
    4242FCKTableHandler.DeleteRows = function( row )
    4343{
    44         // If no row has been passed as a parameter,
    45         // then get the row( s ) containing the cells where the selection is placed in.
    46         // If user selected multiple rows ( by selecting multiple cells ), walk
    47         // the selected cell list and delete the rows containing the selected cells
    48         if ( ! row )
     44        // Get a list of selected cells.
     45        var cells ;
     46        if ( !row )
    4947        {
    50                 var aCells = FCKTableHandler.GetSelectedCells() ;
    51                 var aRowsToDelete = new Array() ;
    52                 //queue up the rows -- it's possible ( and likely ) that we may get duplicates
    53                 for ( var i = 0; i < aCells.length; i++ )
    54                 {
    55                         var oRow = aCells[i].parentNode ;
    56                         aRowsToDelete[oRow.rowIndex] = oRow ;
    57                 }
    58                 for ( var i = aRowsToDelete.length; i >= 0; i-- )
    59                 {
    60                         if ( aRowsToDelete[i] )
    61                                 FCKTableHandler.DeleteRows( aRowsToDelete[i] );
    62                 }
    63                 return ;
     48                cells = this.GetSelectedCells() ;
     49                if ( cells.length < 1 )
     50                        return ;
    6451        }
     52        else
     53                cells = [ row.cells[ 0 ] ] ;
    6554
    66         // Get the row's table.
    67         var oTable = FCKTools.GetElementAscensor( row, 'TABLE' ) ;
     55        var database = {} ;
     56        for ( var i = 0 ; i < cells.length ; i++ )
     57                FCKDomTools.SetElementMarker( database, cells[ i ], '_fck_remove', true ) ;
    6858
    69         // If just one row is available then delete the entire table.
    70         if ( oTable.rows.length == 1 )
     59        var table = FCKTools.GetElementAscensor( cells[ 0 ], 'table' ) ;
     60
     61        // Convert the current table to table map.
     62        var tableMap = this._CreateTableMap( table ) ;
     63        var processedTableMap = [] ;
     64       
     65        // Re-create the table map with selected rows removed.
     66        for ( var i = 0 ; i < tableMap.length ; i++ )
    7167        {
    72                 FCKTableHandler.DeleteTable( oTable ) ;
    73                 return ;
     68                var currentRow = tableMap[ i ] ;
     69                var removeCellFound = false ;
     70                for ( var j = 0 ; j < currentRow.length ; j++ )
     71                {
     72                        if ( currentRow[ j ][ '_fck_remove' ] )
     73                                removeCellFound = true ;
     74                }
     75
     76                if ( !removeCellFound )
     77                        processedTableMap.push( currentRow ) ;
    7478        }
    7579
    76         // Delete the row.
    77         row.parentNode.removeChild( row ) ;
     80        FCKDomTools.ClearAllMarkers( database ) ;
     81       
     82        // Install the table map, or delete the table if there're no rows left.
     83        if ( processedTableMap.length > 0 )
     84                this._InstallTableMap( processedTableMap, table ) ;
     85        else
     86                this.DeleteTable( table ) ;
    7887}
    7988
    8089FCKTableHandler.DeleteTable = function( table )
     
    627636//              Cell6, Cell2, Cell2, Cell7
    628637FCKTableHandler._CreateTableMap = function( refCell )
    629638{
    630         var table = (refCell.nodeName == 'TABLE' ? refCell : refCell.parentNode.parentNode.parentNode ) ;
     639        var table = ( refCell.nodeName == 'TABLE' ? refCell : FCKTools.GetElementAscensor( refCell, 'table' ) ) ;
    631640
    632641        var aRows = table.rows ;
    633642
    634643        // Row and Column counters.
    635644        var r = -1 ;
    636645
    637         var aMap = new Array() ;
     646        var aMap = [] ;
    638647
    639648        for ( var i = 0 ; i < aRows.length ; i++ )
    640649        {
    641650                r++ ;
    642651                if ( !aMap[r] )
    643                         aMap[r] = new Array() ;
     652                        aMap[r] = [] ;
    644653
    645654                var c = -1 ;
    646655
     
    658667                        for ( var rs = 0 ; rs < iRowSpan ; rs++ )
    659668                        {
    660669                                if ( !aMap[r + rs] )
    661                                         aMap[r + rs] = new Array() ;
     670                                        aMap[r + rs] = [] ;
    662671
    663672                                for ( var cs = 0 ; cs < iColSpan ; cs++ )
    664673                                {
     
    680689        // for storing the calculated rowSpan in IE.
    681690        var rowSpanAttr = FCKBrowserInfo.IsIE ? "_fckrowspan" : "rowSpan" ;
    682691
    683         // Disconnect all the cells in tableMap from their parents, set all colSpan and rowSpan attributes to 1.
    684         for ( var i = 0 ; i < tableMap.length ; i++ )
     692        // Remove duplicate rows in the model and correct excessive rowspans.
     693        for ( var i = tableMap.length - 1 ; i > 0 ; i-- )
    685694        {
    686                 for ( var j = 0 ; j < tableMap[i].length ; j++ )
     695                var currentRow = tableMap[ i ] ;
     696                var previousRow = tableMap[ i - 1 ] ;
     697
     698                if ( currentRow.length != previousRow.length )
     699                        continue ;
     700
     701                var isIdentical = true ;
     702                for ( var j = 0 ; j < currentRow.length ; j++ )
    687703                {
    688                         var cell = tableMap[i][j] ;
    689                         if ( cell.parentNode )
    690                                 cell.parentNode.removeChild( cell ) ;
     704                        if ( currentRow[ j ] != previousRow[ j ] )
     705                        {
     706                                isIdentical = false ;
     707                                break ;
     708                        }
     709                }
     710
     711                if ( isIdentical )
     712                        tableMap.splice( i, 1 ) ;
     713        }
     714
     715        // Disconnect all the cells in the table from their parents, set all colSpan and rowSpan attributes to 1.
     716        for ( var i = 0 ; i < table.rows.length ; i++ )
     717        {
     718                var currentRow = table.rows[ i ];
     719                for ( var j = currentRow.cells.length - 1 ; j >= 0 ; j-- )
     720                {
     721                        var cell = currentRow.cells[ j ] ;
     722                        cell.parentNode.removeChild( cell ) ;
    691723                        cell.colSpan = cell[rowSpanAttr] = 1 ;
    692724                }
    693725        }
     
    735767                for ( var j = 0 ; j < tableMap[i].length ; j++)
    736768                {
    737769                        var cell = tableMap[i][j] ;
    738                         FCKDomTools.ClearElementJSProperty(cell, '_colScanned' ) ;
    739                         FCKDomTools.ClearElementJSProperty(cell, '_rowScanned' ) ;
     770                        FCKDomTools.ClearElementJSProperty( cell, '_colScanned' ) ;
     771                        FCKDomTools.ClearElementJSProperty( cell, '_rowScanned' ) ;
    740772                }
    741773        }
    742774
     
    760792                        }
    761793                        j += cell.colSpan ;
    762794                        if ( cell.colSpan == 1 )
    763                                 cell.removeAttribute( 'colspan' ) ;
     795                                cell.removeAttribute( 'colSpan' ) ;
    764796                        if ( cell.rowSpan == 1 )
    765                                 cell.removeAttribute( 'rowspan' ) ;
     797                                cell.removeAttribute( 'rowSpan' ) ;
    766798                }
    767799                if ( FCKBrowserInfo.IsIE )
    768800                {
     
    774806                        FCKDomTools.MoveChildren( rowObj, table.rows[i] ) ;
    775807                }
    776808        }
     809
     810        // Remove excess rows.
     811        for ( var i = table.rows.length - 1 ; i >= tableMap.length ; i-- )
     812        {
     813                var row = table.rows[ i ] ;
     814                var rowParent = row.parentNode ;
     815
     816                rowParent.removeChild( row ) ;
     817                if ( rowParent.rows.length < 1 )
     818                        rowParent.parentNode.removeChild( rowParent ) ;
     819        }
    777820}
    778821
    779822FCKTableHandler._MoveCaretToCell = function ( refCell, toStart )
  • editor/_source/internals/fckdomtools.js

     
    722722                        delete element[attrName] ;
    723723        },
    724724
    725         SetElementMarker : function ( markerObj, element, attrName, value)
     725        SetElementMarker : function ( markerObj, element, attrName, value )
    726726        {
    727727                var id = String( parseInt( Math.random() * 0xffffffff, 10 ) ) ;
    728728                element._FCKMarkerId = id ;
  • _whatsnew.html

     
    7979                        of caption tag in tables with table headers.</li>
    8080                <li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/3818">#3818</a>] Fixed layout error
    8181                        in text and background color popups when more colors button is disabled.</li>
     82                <li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/2813">#2813</a>] Deleting a row
     83                        does not correct the rowSpan of merged cells.</li>
     84                <li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/2859">#2859</a>] Fixed empty rows
     85                        and excessive rowSpan values after merging down rowSpanned cells.</li>
    8286        </ul>
    8387        <p>
    8488                <a href="_whatsnew_history.html">See previous versions history</a></p>
© 2003 – 2019 CKSource – Frederico Knabben. All rights reserved. | Terms of use | Privacy policy