Changeset 435
- Timestamp:
- 2007-07-11 11:48:06 (17 months ago)
- Location:
- FCKeditor/trunk/editor
- Files:
-
- 11 modified
-
lang/en-au.js (modified) (1 diff)
-
lang/en-ca.js (modified) (1 diff)
-
lang/en.js (modified) (1 diff)
-
lang/en-uk.js (modified) (1 diff)
-
lang/zh-cn.js (modified) (1 diff)
-
lang/zh.js (modified) (1 diff)
-
_source/classes/fckdomrange_gecko.js (modified) (1 diff)
-
_source/commandclasses/fcktablecommand.js (modified) (1 diff)
-
_source/internals/fckcommands.js (modified) (1 diff)
-
_source/internals/fck_contextmenu.js (modified) (2 diffs)
-
_source/internals/fcktablehandler.js (modified) (8 diffs)
Legend:
- Unmodified
- Added
- Removed
-
FCKeditor/trunk/editor/lang/en-au.js
r215 r435 110 110 RowCM : "Row", 111 111 ColumnCM : "Column", 112 InsertRow : "Insert Row", 112 InsertRowAfter : "Insert Row After", 113 InsertRowBefore : "Insert Row Before", 113 114 DeleteRows : "Delete Rows", 114 InsertColumn : "Insert Column", 115 InsertColumnAfter : "Insert Column After", 116 InsertColumnBefore : "Insert Column Before", 115 117 DeleteColumns : "Delete Columns", 116 InsertCell : "Insert Cell", 118 InsertCellAfter : "Insert Cell After", 119 InsertCellBefore : "Insert Cell Before", 117 120 DeleteCells : "Delete Cells", 118 121 MergeCells : "Merge Cells", -
FCKeditor/trunk/editor/lang/en-ca.js
r215 r435 110 110 RowCM : "Row", 111 111 ColumnCM : "Column", 112 InsertRow : "Insert Row", 112 InsertRowAfter : "Insert Row After", 113 InsertRowBefore : "Insert Row Before", 113 114 DeleteRows : "Delete Rows", 114 InsertColumn : "Insert Column", 115 InsertColumnAfter : "Insert Column After", 116 InsertColumnBefore : "Insert Column Before", 115 117 DeleteColumns : "Delete Columns", 116 InsertCell : "Insert Cell", 118 InsertCellAfter : "Insert Cell After", 119 InsertCellBefore : "Insert Cell Before", 117 120 DeleteCells : "Delete Cells", 118 121 MergeCells : "Merge Cells", -
FCKeditor/trunk/editor/lang/en.js
r174 r435 110 110 RowCM : "Row", 111 111 ColumnCM : "Column", 112 InsertRow : "Insert Row", 112 InsertRowAfter : "Insert Row After", 113 InsertRowBefore : "Insert Row Before", 113 114 DeleteRows : "Delete Rows", 114 InsertColumn : "Insert Column", 115 InsertColumnAfter : "Insert Column After", 116 InsertColumnBefore : "Insert Column Before", 115 117 DeleteColumns : "Delete Columns", 116 InsertCell : "Insert Cell", 118 InsertCellAfter : "Insert Cell After", 119 InsertCellBefore : "Insert Cell Before", 117 120 DeleteCells : "Delete Cells", 118 121 MergeCells : "Merge Cells", -
FCKeditor/trunk/editor/lang/en-uk.js
r215 r435 110 110 RowCM : "Row", 111 111 ColumnCM : "Column", 112 InsertRow : "Insert Row", 112 InsertRowAfter : "Insert Row After", 113 InsertRowBefore : "Insert Row Before", 113 114 DeleteRows : "Delete Rows", 114 InsertColumn : "Insert Column", 115 InsertColumnAfter : "Insert Column After", 116 InsertColumnBefore : "Insert Column Before", 115 117 DeleteColumns : "Delete Columns", 116 InsertCell : "Insert Cell", 118 InsertCellAfter : "Insert Cell After", 119 InsertCellBefore : "Insert Cell Before", 117 120 DeleteCells : "Delete Cells", 118 121 MergeCells : "Merge Cells", -
FCKeditor/trunk/editor/lang/zh-cn.js
r174 r435 110 110 RowCM : "行", 111 111 ColumnCM : "列", 112 InsertRow : "插入行", 112 InsertRowBefore : "上插入行", 113 InsertRowAfter : "下插入行", 113 114 DeleteRows : "删除行", 114 InsertColumn : "插入列", 115 DeleteColumns : "删除列", 116 InsertCell : "插入单元格", 115 InsertColumnBefore : "左插入列", 116 InsertColumnAfter : "右插入列", 117 DeleteColumns : "删除列", 118 InsertCellBefore : "左插入单元格", 119 InsertCellAfter : "右插入单元格", 117 120 DeleteCells : "删除单元格", 118 121 MergeCells : "合并单元格", -
FCKeditor/trunk/editor/lang/zh.js
r174 r435 110 110 RowCM : "列", 111 111 ColumnCM : "欄", 112 InsertRow : "插入列", 112 InsertRowBefore : "向上插入列", 113 InsertRowAfter : "向下插入列", 113 114 DeleteRows : "刪除列", 114 InsertColumn : "插入欄", 115 InsertColumnBefore : "向左插入欄", 116 InsertColumnAfter : "向右插入欄", 115 117 DeleteColumns : "刪除欄", 116 InsertCell : "插入儲存格", 118 InsertCellBefore : "向左插入儲存格", 119 InsertCellAfter : "向右插入儲存格", 117 120 DeleteCells : "刪除儲存格", 118 121 MergeCells : "合併儲存格", -
FCKeditor/trunk/editor/_source/classes/fckdomrange_gecko.js
r132 r435 30 30 var oSel = this.Window.getSelection() ; 31 31 32 if ( oSel.rangeCount == 1)32 if ( oSel.rangeCount > 0 ) 33 33 { 34 34 this._Range = FCKW3CRange.CreateFromRange( this.Window.document, oSel.getRangeAt(0) ) ; -
FCKeditor/trunk/editor/_source/commandclasses/fcktablecommand.js
r132 r435 34 34 switch ( this.Name ) 35 35 { 36 case 'TableInsertRow' : 37 FCKTableHandler.InsertRow() ; 36 case 'TableInsertRowAfter' : 37 FCKTableHandler.InsertRow( false ) ; 38 break ; 39 case 'TableInsertRowBefore' : 40 FCKTableHandler.InsertRow( true ) ; 38 41 break ; 39 42 case 'TableDeleteRows' : 40 43 FCKTableHandler.DeleteRows() ; 41 44 break ; 42 case 'TableInsertColumn' : 43 FCKTableHandler.InsertColumn() ; 45 case 'TableInsertColumnAfter' : 46 FCKTableHandler.InsertColumn( false ) ; 47 break ; 48 case 'TableInsertColumnBefore' : 49 FCKTableHandler.InsertColumn( true ) ; 44 50 break ; 45 51 case 'TableDeleteColumns' : 46 52 FCKTableHandler.DeleteColumns() ; 47 53 break ; 48 case 'TableInsertCell' : 49 FCKTableHandler.InsertCell() ; 54 case 'TableInsertCellAfter' : 55 FCKTableHandler.InsertCell( null, false ) ; 56 break ; 57 case 'TableInsertCellBefore' : 58 FCKTableHandler.InsertCell( null, true ) ; 50 59 break ; 51 60 case 'TableDeleteCells' : -
FCKeditor/trunk/editor/_source/internals/fckcommands.js
r396 r435 79 79 case 'PasteWord' : oCommand = new FCKPasteWordCommand() ; break ; 80 80 81 case 'TableInsertRow' : oCommand = new FCKTableCommand('TableInsertRow') ; break ; 81 case 'TableInsertRowAfter' : oCommand = new FCKTableCommand('TableInsertRowAfter') ; break ; 82 case 'TableInsertRowBefore' : oCommand = new FCKTableCommand('TableInsertRowBefore') ; break ; 82 83 case 'TableDeleteRows' : oCommand = new FCKTableCommand('TableDeleteRows') ; break ; 83 case 'TableInsertColumn' : oCommand = new FCKTableCommand('TableInsertColumn') ; break ; 84 case 'TableInsertColumnAfter' : oCommand = new FCKTableCommand('TableInsertColumnAfter') ; break ; 85 case 'TableInsertColumnBefore' : oCommand = new FCKTableCommand('TableInsertColumnBefore') ; break ; 84 86 case 'TableDeleteColumns' : oCommand = new FCKTableCommand('TableDeleteColumns') ; break ; 85 case 'TableInsertCell' : oCommand = new FCKTableCommand('TableInsertCell') ; break ; 87 case 'TableInsertCellAfter' : oCommand = new FCKTableCommand('TableInsertCellAfter') ; break ; 88 case 'TableInsertCellBefore' : oCommand = new FCKTableCommand('TableInsertCellBefore') ; break ; 86 89 case 'TableDeleteCells' : oCommand = new FCKTableCommand('TableDeleteCells') ; break ; 87 90 case 'TableMergeCells' : oCommand = new FCKTableCommand('TableMergeCells') ; break ; -
FCKeditor/trunk/editor/_source/internals/fck_contextmenu.js
r343 r435 71 71 menu.AddSeparator() ; 72 72 var oItem = menu.AddItem( 'Cell' , FCKLang.CellCM ) ; 73 oItem.AddItem( 'TableInsertCell' , FCKLang.InsertCell, 58 ) ; 73 oItem.AddItem( 'TableInsertCellBefore' , FCKLang.InsertCellBefore, 58 ) ; 74 oItem.AddItem( 'TableInsertCellAfter' , FCKLang.InsertCellAfter, 58 ) ; 74 75 oItem.AddItem( 'TableDeleteCells' , FCKLang.DeleteCells, 59 ) ; 75 76 oItem.AddItem( 'TableMergeCells' , FCKLang.MergeCells, 60 ) ; … … 80 81 menu.AddSeparator() ; 81 82 oItem = menu.AddItem( 'Row' , FCKLang.RowCM ) ; 82 oItem.AddItem( 'TableInsertRow' , FCKLang.InsertRow, 62 ) ; 83 oItem.AddItem( 'TableInsertRowBefore' , FCKLang.InsertRowBefore, 62 ) ; 84 oItem.AddItem( 'TableInsertRowAfter' , FCKLang.InsertRowAfter, 62 ) ; 83 85 oItem.AddItem( 'TableDeleteRows' , FCKLang.DeleteRows, 63 ) ; 84 86 85 87 menu.AddSeparator() ; 86 88 oItem = menu.AddItem( 'Column' , FCKLang.ColumnCM ) ; 87 oItem.AddItem( 'TableInsertColumn' , FCKLang.InsertColumn, 64 ) ; 89 oItem.AddItem( 'TableInsertColumnBefore', FCKLang.InsertColumnBefore, 64 ) ; 90 oItem.AddItem( 'TableInsertColumnAfter' , FCKLang.InsertColumnAfter, 64 ) ; 88 91 oItem.AddItem( 'TableDeleteColumns' , FCKLang.DeleteColumns, 65 ) ; 89 92 } -
FCKeditor/trunk/editor/_source/internals/fcktablehandler.js
r132 r435 24 24 var FCKTableHandler = new Object() ; 25 25 26 FCKTableHandler.InsertRow = function( )26 FCKTableHandler.InsertRow = function( insertBefore ) 27 27 { 28 28 // Get the row where the selection is placed in. … … 36 36 oRow.parentNode.insertBefore( oNewRow, oRow ) ; 37 37 38 // Clean the row (it seems that the new row has been added after it).39 FCKTableHandler.ClearRow( oRow ) ;38 // Clean one of the rows to produce the illusion of inserting an empty row before or after. 39 FCKTableHandler.ClearRow( insertBefore ? oNewRow : oRow ) ; 40 40 } 41 41 … … 80 80 } 81 81 82 FCKTableHandler.InsertColumn = function( )82 FCKTableHandler.InsertColumn = function( insertBefore ) 83 83 { 84 84 // Get the cell where the selection is placed in. 85 85 var oCell = FCKSelection.MoveToAncestorNode('TD') || FCKSelection.MoveToAncestorNode('TH') ; 86 86 87 if ( !oCell ) return ; 87 if ( !oCell ) 88 { 89 // oCell not fouund could be due to multiple selection ranges on tables in Gecko. 90 // We have another function to find the table cell for this special case. 91 if ( ! FCKBrowserInfo.IsIE ) 92 { 93 var node = this._GetSelectedCellFromGecko( true ) ; 94 if ( node ) 95 oCell = node ; 96 else 97 return null ; 98 } 99 else 100 return null ; 101 } 88 102 89 103 // Get the cell's table. 90 104 var oTable = FCKTools.GetElementAscensor( oCell, 'TABLE' ) ; 91 105 92 // Get the index of the column to be created (based on the cell). 93 var iIndex = oCell.cellIndex + 1 ; 106 var iIndex = oCell.cellIndex ; 94 107 95 108 // Loop throw all rows available in the table. … … 100 113 101 114 // If the row doens't have enought cells, ignore it. 102 if ( oRow.cells.length < iIndex)115 if ( oRow.cells.length < ( iIndex + 1 ) ) 103 116 continue ; 104 117 105 oCell = oRow.cells[iIndex -1].cloneNode(false) ;118 oCell = oRow.cells[iIndex].cloneNode(false) ; 106 119 107 120 if ( FCKBrowserInfo.IsGecko ) 108 121 oCell.innerHTML = GECKO_BOGUS ; 109 122 110 // Get the cell that is placed in the new cell place.123 // Get back the currently selected cell. 111 124 var oBaseCell = oRow.cells[iIndex] ; 112 125 113 // If the cell is available (we are not in the last cell of the row). 114 if ( oBaseCell ) 115 oRow.insertBefore( oCell, oBaseCell ) ; // Insert the new cell just before of it. 126 if ( insertBefore ) 127 oRow.insertBefore( oCell, oBaseCell ) ; 128 else if ( oBaseCell.nextSibling ) 129 oRow.insertBefore( oCell, oBaseCell.nextSibling ) ; 116 130 else 117 oRow.appendChild( oCell ) ; // Append the cell at the end of the row.131 oRow.appendChild( oCell ) ; 118 132 } 119 133 } … … 153 167 } 154 168 155 FCKTableHandler.InsertCell = function( cell )169 FCKTableHandler.InsertCell = function( cell, insertBefore ) 156 170 { 157 171 // Get the cell where the selection is placed in. 158 172 var oCell = cell ? cell : FCKSelection.MoveToAncestorNode( 'TD' ) ; 159 if ( !oCell ) return null ; 173 if ( !oCell ) 174 { 175 // oCell not fouund could be due to multiple selection ranges on tables in Gecko. 176 // We have another function to find the table cell for this special case. 177 if ( ! FCKBrowserInfo.IsIE ) 178 { 179 var node = this._GetSelectedCellFromGecko( true ) ; 180 if ( node ) 181 oCell = node ; 182 else 183 return null ; 184 } 185 else 186 return null ; 187 } 160 188 161 189 // Create the new cell element to be added. … … 165 193 // oNewCell.innerHTML = " " ; 166 194 167 // If it is the last cell in the row. 168 if ( oCell.cellIndex == oCell.parentNode.cells.length - 1 ) 169 { 170 // Add the new cell at the end of the row. 195 if ( !insertBefore && oCell.cellIndex == oCell.parentNode.cells.length - 1 ) 171 196 oCell.parentNode.appendChild( oNewCell ) ; 172 }173 197 else 174 { 175 // Add the new cell before the next cell (after the active one). 176 oCell.parentNode.insertBefore( oNewCell, oCell.nextSibling ) ; 177 } 198 oCell.parentNode.insertBefore( oNewCell, insertBefore ? oCell : oCell.nextSibling ) ; 178 199 179 200 return oNewCell ; … … 273 294 if ( aCollCells[i] == aCells[0] ) 274 295 { 275 var oNewCell = this.InsertCell( aCells[0] ) ;296 var oNewCell = this.InsertCell( aCells[0], false ) ; 276 297 if ( !isNaN( aCells[0].rowSpan ) && aCells[0].rowSpan > 1 ) 277 298 oNewCell.rowSpan = aCells[0].rowSpan ; … … 384 405 } 385 406 } 407 408 FCKTableHandler._GetSelectedCellFromGecko = function( getLastCell ) 409 { 410 var sel = FCK.EditorWindow.getSelection() ; 411 if ( sel.rangeCount < 1 ) 412 return null ; 413 var range = getLastCell ? sel.getRangeAt( sel.rangeCount - 1 ) : sel.getRangeAt( 0 ) ; 414 var node = getLastCell ? range.endContainer : range.startContainer ; 415 416 // Gecko returns a <TR> as startContainer and endContainer when cells are selected. 417 // We need to find back the final <TD|TH> that's being selected. 418 if ( node.nodeType == 1 && node.tagName.toLowerCase() == 'tr' ) 419 { 420 for ( var i = range.startOffset ; i <= range.endOffset ; i++ ) 421 { 422 var candidate = node.childNodes[i] ; 423 var tag = candidate.tagName.toLowerCase() ; 424 if ( candidate.nodeType == 1 && ( tag == 'td' || tag == 'th' ) ) 425 { 426 node = node.childNodes[i] ; 427 break ; 428 } 429 } 430 } 431 // For safety, we have to be ready for the 'usual' case as well. 432 else 433 { 434 while ( node && node.tagName.toLowerCase() != 'td' && node.tagName.toLowerCase() != 'th' ) 435 node = node.parentNode ; 436 } 437 438 // Have we found the <TD|TH> node we wanted, finally? If yes, return the found node. If not, abort. 439 if ( node.tagName.toLowerCase() != 'td' && node.tagName.toLowerCase() != 'th' ) 440 return null ; 441 else 442 return node ; 443 }