Ticket #2656: 2656.patch
File 2656.patch, 8.2 KB (added by , 15 years ago) |
---|
-
commandclasses/fcktablecommand.js
81 81 { 82 82 switch ( this.Name ) 83 83 { 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 ; 84 92 case 'TableHorizontalSplitCell' : 85 93 case 'TableVerticalSplitCell' : 86 94 if ( FCKTableHandler.GetSelectedCells().length == 1 ) -
internals/fck_contextmenu.js
93 93 94 94 menu.AddSeparator() ; 95 95 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) ; 98 100 oItem.AddItem( 'TableDeleteRows' , FCKLang.DeleteRows, 63 ) ; 99 101 100 102 menu.AddSeparator() ; 101 103 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) ; 104 108 oItem.AddItem( 'TableDeleteColumns' , FCKLang.DeleteColumns, 65 ) ; 105 109 } 106 110 -
internals/fcktablehandler.js
25 25 26 26 FCKTableHandler.InsertRow = function( insertBefore ) 27 27 { 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 ; 31 32 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] ; 34 39 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 } 37 51 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 ) ; 40 68 } 41 69 70 FCKTableHandler.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 42 97 FCKTableHandler.DeleteRows = function( row ) 43 98 { 44 99 // If no row has been passed as a parameter, … … 103 158 104 159 FCKTableHandler.InsertColumn = function( insertBefore ) 105 160 { 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 ) 114 164 return ; 115 165 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 ) ; 118 170 119 var iIndex = oCell.cellIndex ; 171 var colSpan = isNaN( oCell.colSpan ) ? 1 : oCell.colSpan ; 172 if( !insertBefore && colSpan > 1 ) 173 colIdx = colIdx + colSpan - 1 ; 120 174 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++ ) 123 178 { 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 ) ; 126 185 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 ) ; 130 188 131 oCell = oRow.cells[iIndex].cloneNode(false) ;189 newRow.push( tableMap[i][j] ) ; 132 190 133 if ( FCKBrowserInfo.IsGeckoLike ) 134 FCKTools.AppendBogusBr( oCell ) ; 191 if( !insertBefore && j == colIdx ) 192 newRow.push( newCell ) ; 193 } 194 newTableMap.push( newRow ) ; 195 } 135 196 136 // Get back the currently selected cell.137 var oBaseCell = oRow.cells[iIndex] ; 197 this._InstallTableMap( newTableMap, oCell.parentNode.parentNode.parentNode ) ; 198 } 138 199 139 oRow.insertBefore( oCell, ( insertBefore ? oBaseCell : oBaseCell.nextSibling ) ) ; 200 FCKTableHandler.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 } 140 224 } 225 return true ; 141 226 } 142 227 143 228 FCKTableHandler.DeleteColumns = function( oCell )