Changeset 692

Show
Ignore:
Timestamp:
2007-08-20 19:20:39 (17 months ago)
Author:
martinkou
Message:

"Merge Right" command should be disabled when the vertical positions of the cells are different.
Fix for #1076 : "Merge Right" command merges the wrong cells in some circumstances, due to inaccurate table position calculations.
"Merge Right" and "Merge Down" should be used instead of "Merge Cells" in Safari and Opera due to the browsers' inability to select a rectangular area in a table.

Location:
FCKeditor/trunk/editor/_source
Files:
3 modified

Legend:

Unmodified
Added
Removed
  • FCKeditor/trunk/editor/_source/commandclasses/fcktablecommand.js

    r691 r692  
    3232        FCKUndo.SaveUndoStep() ; 
    3333 
    34         if ( FCKBrowserInfo.IsIE ) 
     34        if ( ! FCKBrowserInfo.IsGecko ) 
    3535        { 
    3636                switch ( this.Name ) 
     
    9797                        case 'TableHorizontalSplitCell' : 
    9898                        case 'TableVerticalSplitCell' : 
    99                         case 'TableMergeRight' : 
    10099                        case 'TableMergeDown' : 
    101100                                if ( FCKTableHandler.GetSelectedCells().length == 1 ) 
     
    103102                                else 
    104103                                        return FCK_TRISTATE_DISABLED ; 
    105                                 break ; 
    106104                        case 'TableMergeCells' : 
    107105                                if ( FCKTableHandler.CheckIsSelectionRectangular()  
     
    110108                                else 
    111109                                        return FCK_TRISTATE_DISABLED ; 
     110                        case 'TableMergeRight' : 
     111                                return FCKTableHandler.GetMergeRightTarget() ? FCK_TRISTATE_OFF : FCK_TRISTATE_DISABLED ; 
    112112                        default : 
    113113                                return FCK_TRISTATE_OFF ; 
  • FCKeditor/trunk/editor/_source/internals/fck_contextmenu.js

    r691 r692  
    7474                                        oItem.AddItem( 'TableInsertCellAfter'   , FCKLang.InsertCellAfter, 58 ) ; 
    7575                                        oItem.AddItem( 'TableDeleteCells'       , FCKLang.DeleteCells, 59 ) ; 
    76                                         if ( FCKBrowserInfo.IsIE ) 
     76                                        if ( FCKBrowserInfo.IsGecko ) 
     77                                                oItem.AddItem( 'TableMergeCells'        , FCKLang.MergeCells, 60, 
     78                                                        FCKCommands.GetCommand( 'TableMergeCells' ).GetState() == FCK_TRISTATE_DISABLED ) ; 
     79                                        else 
    7780                                        { 
    7881                                                oItem.AddItem( 'TableMergeRight'        , FCKLang.MergeRight, 60,  
     
    8184                                                        FCKCommands.GetCommand( 'TableMergeDown' ).GetState() == FCK_TRISTATE_DISABLED ) ; 
    8285                                        } 
    83                                         else 
    84                                                 oItem.AddItem( 'TableMergeCells'        , FCKLang.MergeCells, 60, 
    85                                                         FCKCommands.GetCommand( 'TableMergeCells' ).GetState() == FCK_TRISTATE_DISABLED ) ; 
    8686                                        oItem.AddItem( 'TableHorizontalSplitCell'       , FCKLang.HorizontalSplitCell, 61, 
    8787                                                FCKCommands.GetCommand( 'TableHorizontalSplitCell' ).GetState() == FCK_TRISTATE_DISABLED ) ; 
  • FCKeditor/trunk/editor/_source/internals/fcktablehandler.js

    r691 r692  
    255255} 
    256256 
     257FCKTableHandler._ReplaceCellsByMarker = function( tableMap, marker, substitute ) 
     258{ 
     259        for ( var i = 0 ; i < tableMap.length ; i++ ) 
     260        { 
     261                for ( var j = 0 ; j < tableMap[i].length ; j++ ) 
     262                { 
     263                        if ( tableMap[i][j][marker] ) 
     264                                tableMap[i][j] = substitute ; 
     265                } 
     266        } 
     267} 
     268 
    257269FCKTableHandler._GetMarkerGeometry = function( tableMap, rowIdx, colIdx, markerName ) 
    258270{ 
     
    352364FCKTableHandler.MergeRight = function() 
    353365{ 
    354         if ( ! FCKBrowserInfo.IsIE ) 
    355         { 
    356                 alert( 'This method should be called in IE only.' ) ; 
     366        var target = this.GetMergeRightTarget() ; 
     367        if ( target == null ) 
    357368                return ; 
    358         } 
    359         var cells = FCKTableHandler.GetSelectedCells() ; 
    360         if ( cells.length != 1 ) 
    361                 return ; 
    362          
    363         var currentCell = cells[0] ; 
    364         var nextCell = currentCell.parentNode.cells[currentCell.cellIndex + 1] ; 
    365         var nextColSpan = nextCell.colSpan ; 
    366         if ( isNaN( nextColSpan ) ) 
    367                 nextColSpan = 1 ; 
    368  
    369         if ( ! nextCell ) 
    370                 return ; 
     369        var refCell = target.refCell ; 
     370        var tableMap = target.tableMap ; 
     371        var nextCell = target.nextCell ;  
    371372 
    372373        var cellContents = FCK.EditorDocument.createDocumentFragment() ; 
     
    375376 
    376377        nextCell.parentNode.removeChild( nextCell ) ; 
    377         if ( isNaN( currentCell.colSpan ) ) 
    378                 currentCell.colSpan = 1 ; 
    379         currentCell.colSpan += nextColSpan ; 
    380  
    381         currentCell.appendChild( cellContents ) ; 
     378        refCell.appendChild( cellContents ) ; 
     379        this._MarkCells( [nextCell], '_Replace' ) ; 
     380        this._ReplaceCellsByMarker( tableMap, '_Replace', refCell ) ; 
     381        this._InstallTableMap( tableMap, refCell.parentNode.parentNode ) ; 
    382382} 
    383383 
    384384FCKTableHandler.MergeDown = function() 
    385385{ 
    386         if ( ! FCKBrowserInfo.IsIE ) 
    387         { 
    388                 alert( 'This method should be called in IE only.' ) ; 
    389                 return ; 
    390         } 
    391386        var cells = FCKTableHandler.GetSelectedCells() ; 
    392387        if ( cells.length != 1 ) 
     
    686681                { 
    687682                        var cell = tableMap[i][j] ; 
    688                         if ( FCKBrowser.IsIE ) 
     683                        if ( FCKBrowserInfo.IsIE ) 
    689684                        { 
    690685                                cell.removeAttribute( '_colScanned' ) ; 
     
    744739                return FCK_TRISTATE_DISABLED ; 
    745740} 
     741 
     742FCKTableHandler.GetMergeRightTarget = function() 
     743{ 
     744        var cells = this.GetSelectedCells() ; 
     745        if ( cells.length != 1 ) 
     746                return null ; 
     747 
     748        var refCell = cells[0] ; 
     749        var tableMap = this._CreateTableMap( refCell.parentNode.parentNode ) ; 
     750        var rowIdx = refCell.parentNode.rowIndex ; 
     751        var colIdx = this._GetCellIndexSpan( tableMap, rowIdx, refCell ) ; 
     752        var nextColIdx = colIdx + ( isNaN( refCell.colSpan ) ? 1 : refCell.colSpan ) ; 
     753        var nextCell = tableMap[rowIdx][nextColIdx] ; 
     754 
     755        if ( ! nextCell ) 
     756                return null ; 
     757 
     758        // The two cells must have the same vertical geometry, otherwise merging does not make sense. 
     759        this._MarkCells( [refCell, nextCell], '_SizeTest' ) ; 
     760        var refGeometry = this._GetMarkerGeometry( tableMap, rowIdx, colIdx, '_SizeTest' ) ; 
     761        var nextGeometry = this._GetMarkerGeometry( tableMap, rowIdx, nextColIdx, '_SizeTest' ) ; 
     762        this._UnmarkCells( [refCell, nextCell], '_SizeTest' ) ; 
     763 
     764        if ( refGeometry.height != nextGeometry.height || refGeometry.y != nextGeometry.y ) 
     765                return null ; 
     766 
     767        return { refCell : refCell, nextCell : nextCell, tableMap : tableMap } ; 
     768}