Ticket #2656: 2656.patch

File 2656.patch, 8.2 KB (added by Koen Willems, 12 years ago)
  • commandclasses/fcktablecommand.js

     
    8181        {
    8282                switch ( this.Name )
    8383                {
     84                        case 'TableInsertRowAfter' :
     85                                return FCKTableHandler.checkFlatRow( false ) ? FCK_TRISTATE_OFF : FCK_TRISTATE_DISABLED ;
     86                        case 'TableInsertRowBefore' :
     87                                return FCKTableHandler.checkFlatRow( true ) ? FCK_TRISTATE_OFF : FCK_TRISTATE_DISABLED ;
     88                        case 'TableInsertColumnAfter' :
     89                                return FCKTableHandler.checkFlatColumn( false ) ? FCK_TRISTATE_OFF : FCK_TRISTATE_DISABLED ;
     90                        case 'TableInsertColumnBefore' :
     91                                return FCKTableHandler.checkFlatColumn( true ) ? FCK_TRISTATE_OFF : FCK_TRISTATE_DISABLED ;
    8492                        case 'TableHorizontalSplitCell' :
    8593                        case 'TableVerticalSplitCell' :
    8694                                if ( FCKTableHandler.GetSelectedCells().length == 1 )
  • internals/fck_contextmenu.js

     
    9393
    9494                                        menu.AddSeparator() ;
    9595                                        oItem = menu.AddItem( 'Row'                     , FCKLang.RowCM ) ;
    96                                         oItem.AddItem( 'TableInsertRowBefore'           , FCKLang.InsertRowBefore, 70 ) ;
    97                                         oItem.AddItem( 'TableInsertRowAfter'            , FCKLang.InsertRowAfter, 62 ) ;
     96                                        oItem.AddItem( 'TableInsertRowBefore'           , FCKLang.InsertRowBefore, 70,
     97                                                FCKCommands.GetCommand( 'TableInsertRowBefore' ).GetState() == FCK_TRISTATE_DISABLED) ;
     98                                        oItem.AddItem( 'TableInsertRowAfter'            , FCKLang.InsertRowAfter, 62,
     99                                                FCKCommands.GetCommand( 'TableInsertRowAfter' ).GetState() == FCK_TRISTATE_DISABLED) ;
    98100                                        oItem.AddItem( 'TableDeleteRows'        , FCKLang.DeleteRows, 63 ) ;
    99101
    100102                                        menu.AddSeparator() ;
    101103                                        oItem = menu.AddItem( 'Column'          , FCKLang.ColumnCM ) ;
    102                                         oItem.AddItem( 'TableInsertColumnBefore', FCKLang.InsertColumnBefore, 71 ) ;
    103                                         oItem.AddItem( 'TableInsertColumnAfter' , FCKLang.InsertColumnAfter, 64 ) ;
     104                                        oItem.AddItem( 'TableInsertColumnBefore', FCKLang.InsertColumnBefore, 71,
     105                                                FCKCommands.GetCommand( 'TableInsertColumnBefore' ).GetState() == FCK_TRISTATE_DISABLED) ;
     106                                        oItem.AddItem( 'TableInsertColumnAfter' , FCKLang.InsertColumnAfter, 64,
     107                                                FCKCommands.GetCommand( 'TableInsertColumnAfter' ).GetState() == FCK_TRISTATE_DISABLED) ;
    104108                                        oItem.AddItem( 'TableDeleteColumns'     , FCKLang.DeleteColumns, 65 ) ;
    105109                                }
    106110
  • internals/fcktablehandler.js

     
    2525
    2626FCKTableHandler.InsertRow = function( insertBefore )
    2727{
    28         // Get the row where the selection is placed in.
    29         var oRow = FCKSelection.MoveToAncestorNode( 'TR' ) ;
    30         if ( !oRow ) return ;
     28        // Get all selected cells.
     29        var cells = this.GetSelectedCells() ;
     30        if ( cells.length < 1 )
     31                return ;
    3132
    32         // Create a clone of the row.
    33         var oNewRow = oRow.cloneNode( true ) ;
     33        var refCell = cells[0] ;
     34        var rowSpan = isNaN( refCell.rowSpan ) ? 1 : refCell.rowSpan ;
     35        var rowIdx = refCell.parentNode.rowIndex ;
     36        if( !insertBefore && rowSpan > 1)
     37                rowIdx = rowIdx + rowSpan - 1 ;
     38        var oRow = refCell.parentNode.parentNode.parentNode.rows[rowIdx] ;
    3439
    35         // Insert the new row (copy) before of it.
    36         oRow.parentNode.insertBefore( oNewRow, oRow ) ;
     40        // Count the number of columns of the table via the tablemap.
     41        var tableMap = this._CreateTableMap( refCell ) ;
     42        var maxCol = 0 ;
     43        for ( var i = 0 ; i < tableMap.length ; i++ )
     44        {
     45                for ( var j = 0 ; j < tableMap[i].length ; j++ )
     46                {
     47                        if ( j > maxCol )
     48                                maxCol = j ;
     49                }
     50        }
    3751
    38         // Clean one of the rows to produce the illusion of inserting an empty row before or after.
    39         FCKTableHandler.ClearRow( insertBefore ? oNewRow : oRow ) ;
     52        // Build the new row.
     53        var oNewRow = FCK.EditorDocument.createElement( 'tr' ) ;
     54        for ( i = 0; i <= maxCol; i++ )
     55        {
     56                var newCell = FCK.EditorDocument.createElement( refCell.nodeName ) ;
     57                if ( FCKBrowserInfo.IsGeckoLike )
     58                        FCKTools.AppendBogusBr( newCell ) ;
     59
     60                oNewRow.appendChild( newCell ) ;
     61        }
     62
     63        // Insert the new row.
     64        if( insertBefore )
     65                oRow.parentNode.insertBefore( oNewRow, oRow ) ;
     66        else
     67                FCKDomTools.InsertAfterNode ( oRow, oNewRow ) ;
    4068}
    4169
     70FCKTableHandler.checkFlatRow = function( insertBefore )
     71{
     72        // Get all selected cells.
     73        var cells = this.GetSelectedCells() ;
     74        if ( cells.length < 1 )
     75                return ;
     76
     77        var refCell = cells[0] ;
     78        var tableMap = this._CreateTableMap( refCell ) ;
     79        var rowStep = ( insertBefore ) ? -1 : 1 ;
     80
     81        var rowIdx = refCell.parentNode.rowIndex ;
     82        var rowSpan = isNaN( refCell.rowSpan ) ? 1 : refCell.rowSpan ;
     83        if( !insertBefore && rowSpan > 1)
     84                rowIdx = rowIdx + rowSpan - 1 ;
     85
     86        for ( var i = 0 ; i < tableMap.length ; i++ )
     87        {
     88                for ( var j = 0; j < tableMap[i].length ; j++ )
     89                {
     90                        if ( tableMap[rowIdx+rowStep] && tableMap[rowIdx+rowStep][j] == tableMap[rowIdx][j] )
     91                                return false ;
     92                }
     93        }
     94        return true ;
     95}
     96
    4297FCKTableHandler.DeleteRows = function( row )
    4398{
    4499        // If no row has been passed as a parameter,
     
    103158
    104159FCKTableHandler.InsertColumn = function( insertBefore )
    105160{
    106         // Get the cell where the selection is placed in.
    107         var oCell = null ;
    108         var nodes = this.GetSelectedCells() ;
    109 
    110         if ( nodes && nodes.length )
    111                 oCell = nodes[ insertBefore ? 0 : ( nodes.length - 1 ) ] ;
    112 
    113         if ( ! oCell )
     161        // Get all selected cells.
     162        var cells = this.GetSelectedCells() ;
     163        if ( cells.length < 1 )
    114164                return ;
    115165
    116         // Get the cell's table.
    117         var oTable = FCKTools.GetElementAscensor( oCell, 'TABLE' ) ;
     166        var oCell = cells[0] ;
     167        var tableMap = this._CreateTableMap( oCell ) ;
     168        var rowIdx = oCell.parentNode.rowIndex ;
     169        var colIdx = FCKTableHandler._GetCellIndexSpan( tableMap, rowIdx, oCell ) ;
    118170
    119         var iIndex = oCell.cellIndex ;
     171        var colSpan = isNaN( oCell.colSpan ) ? 1 : oCell.colSpan ;
     172        if( !insertBefore && colSpan > 1 )
     173                colIdx = colIdx + colSpan - 1 ;
    120174
    121         // Loop through all rows available in the table.
    122         for ( var i = 0 ; i < oTable.rows.length ; i++ )
     175        // Build newTableMap.
     176        var newTableMap = new Array() ;
     177        for ( var i = 0 ; i < tableMap.length ; i++ )
    123178        {
    124                 // Get the row.
    125                 var oRow = oTable.rows[i] ;
     179                var newRow = new Array() ;
     180                for ( var j = 0; j < tableMap[i].length ; j++ )
     181                {
     182                        var newCell = FCK.EditorDocument.createElement( tableMap[i][j].nodeName ) ;
     183                        if ( FCKBrowserInfo.IsGeckoLike )
     184                                FCKTools.AppendBogusBr( newCell ) ;
    126185
    127                 // If the row doesn't have enough cells, ignore it.
    128                 if ( oRow.cells.length < ( iIndex + 1 ) )
    129                         continue ;
     186                        if( insertBefore && j == colIdx )
     187                                newRow.push( newCell ) ;
    130188
    131                 oCell = oRow.cells[iIndex].cloneNode(false) ;
     189                        newRow.push( tableMap[i][j] ) ;
    132190
    133                 if ( FCKBrowserInfo.IsGeckoLike )
    134                         FCKTools.AppendBogusBr( oCell ) ;
     191                        if( !insertBefore && j == colIdx )
     192                                newRow.push( newCell ) ;
     193                }
     194                newTableMap.push( newRow ) ;
     195        }
    135196
    136                 // Get back the currently selected cell.
    137                 var oBaseCell = oRow.cells[iIndex] ;
     197        this._InstallTableMap( newTableMap, oCell.parentNode.parentNode.parentNode ) ;
     198}
    138199
    139                 oRow.insertBefore( oCell, ( insertBefore ? oBaseCell : oBaseCell.nextSibling ) ) ;
     200FCKTableHandler.checkFlatColumn = function( insertBefore )
     201{
     202        // Get all selected cells.
     203        var cells = this.GetSelectedCells() ;
     204        if ( cells.length < 1 )
     205                return ;
     206
     207        var refCell = cells[0] ;
     208        var tableMap = this._CreateTableMap( refCell ) ;
     209        var colStep = ( insertBefore ) ? -1 : 1 ;
     210        var rowIdx = refCell.parentNode.rowIndex ;
     211
     212        var colIdx = this._GetCellIndexSpan( tableMap, rowIdx, cells[0] ) ;
     213        var colSpan = isNaN( refCell.colSpan ) ? 1 : refCell.colSpan ;
     214        if( !insertBefore && colSpan > 1)
     215                colIdx = colIdx + colSpan - 1 ;
     216
     217        for ( var i = 0 ; i < tableMap.length ; i++ )
     218        {
     219                for ( var j = 0; j < tableMap[i].length ; j++ )
     220                {
     221                        if ( tableMap[i][colIdx+colStep] && tableMap[i][colIdx+colStep] == tableMap[i][colIdx] )
     222                                return false ;
     223                }
    140224        }
     225        return true ;
    141226}
    142227
    143228FCKTableHandler.DeleteColumns = function( oCell )
© 2003 – 2021 CKSource – Frederico Knabben. All rights reserved. | Terms of use | Privacy policy