/*\r
-Copyright (c) 2003-2011, CKSource - Frederico Knabben. All rights reserved.\r
+Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.\r
For licensing, see LICENSE.html or http://ckeditor.com/license\r
*/\r
\r
\r
function getSelectedCells( selection )\r
{\r
- // Walker will try to split text nodes, which will make the current selection\r
- // invalid. So save bookmarks before doing anything.\r
- var bookmarks = selection.createBookmarks();\r
-\r
var ranges = selection.getRanges();\r
var retval = [];\r
var database = {};\r
// So we have to take care to include a td we've entered only when we've\r
// walked into its children.\r
\r
- var parent = node.getParent();\r
- if ( parent && cellNodeRegex.test( parent.getName() ) && !parent.getCustomData( 'selected_cell' ) )\r
+ var parent = node.getAscendant( 'td' ) || node.getAscendant( 'th' );\r
+ if ( parent && !parent.getCustomData( 'selected_cell' ) )\r
{\r
CKEDITOR.dom.element.setMarker( database, parent, 'selected_cell', true );\r
retval.push( parent );\r
\r
CKEDITOR.dom.element.clearAllMarkers( database );\r
\r
- // Restore selection position.\r
- selection.selectBookmarks( bookmarks );\r
-\r
return retval;\r
}\r
\r
width = map[0].length;\r
\r
var newRow = doc.createElement( 'tr' );\r
- for ( var i = 0; i < width; i++ )\r
+ for ( var i = 0; cloneRow[ i ] && i < width; i++ )\r
{\r
var cell;\r
// Check whether there's a spanning row here, do not break it.\r
// 1. Into next sibling row if any;\r
// 2. Into previous sibling row if any;\r
// 3. Into table's parent element if it's the very last row.\r
- var cursorPosition = new CKEDITOR.dom.element( rows[ startRowIndex ] || rows[ startRowIndex - 1 ] || table.$.parentNode );\r
+ var cursorPosition = new CKEDITOR.dom.element( rows[ endRowIndex + 1 ] || ( startRowIndex > 0 ? rows[ startRowIndex - 1 ] : null ) || table.$.parentNode );\r
\r
for ( i = rowsToDelete.length ; i >= 0 ; i-- )\r
deleteRows( rowsToDelete[ i ] );\r
{\r
cloneCol.push( map[ i ][ colIndex ] );\r
var nextCell = insertBefore ? map[ i ][ colIndex - 1 ] : map[ i ][ colIndex + 1 ];\r
- nextCell && nextCol.push( nextCell );\r
+ nextCol.push( nextCell );\r
}\r
\r
for ( i = 0; i < height; i++ )\r
{\r
var cell;\r
+\r
+ if ( !cloneCol[ i ] )\r
+ continue;\r
+\r
// Check whether there's a spanning column here, do not break it.\r
if ( cloneCol[ i ].colSpan > 1\r
- && nextCol.length\r
&& nextCol[ i ] == cloneCol[ i ] )\r
{\r
cell = cloneCol[ i ];\r
row = new CKEDITOR.dom.element( table.$.rows[ j ] ),\r
cell = new CKEDITOR.dom.element( mapRow[ i ] );\r
\r
- if ( cell.$.colSpan == 1 )\r
- cell.remove();\r
- // Reduce the col spans.\r
- else\r
- cell.$.colSpan -= 1;\r
+ if ( cell.$ )\r
+ {\r
+ if ( cell.$.colSpan == 1 )\r
+ cell.remove();\r
+ // Reduce the col spans.\r
+ else\r
+ cell.$.colSpan -= 1;\r
\r
- j += cell.$.rowSpan - 1;\r
+ j += cell.$.rowSpan - 1;\r
\r
- if ( !row.$.cells.length )\r
- rowsToDelete.push( row );\r
+ if ( !row.$.cells.length )\r
+ rowsToDelete.push( row );\r
+ }\r
}\r
}\r
\r
return cell.is ? -1 : null;\r
}\r
\r
- function cellInCol( tableMap, colIndex, cell )\r
+ function cellInCol( tableMap, colIndex )\r
{\r
var oCol = [];\r
for ( var r = 0; r < tableMap.length; r++ )\r
{\r
var row = tableMap[ r ];\r
- if ( typeof cell == 'undefined' )\r
- oCol.push( row[ colIndex ] );\r
- else if ( cell.is && row[ colIndex ] == cell.$ )\r
- return r;\r
- else if ( r == cell )\r
- return new CKEDITOR.dom.element( row[ colIndex ] );\r
- }\r
+ oCol.push( row[ colIndex ] );\r
\r
- return ( typeof cell == 'undefined' )? oCol : cell.is ? -1 : null;\r
+ // Avoid adding duplicate cells.\r
+ if ( row[ colIndex ].rowSpan > 1 )\r
+ r += row[ colIndex ].rowSpan - 1;\r
+ }\r
+ return oCol;\r
}\r
\r
function mergeCells( selection, mergeDirection, isDetect )\r
\r
CKEDITOR.plugins.tabletools =\r
{\r
+ requires : [ 'table', 'dialog' ],\r
+\r
init : function( editor )\r
{\r
var lang = editor.lang.table;\r
if ( !table )\r
return;\r
\r
- // Maintain the selection point at where the table was deleted.\r
- selection.selectElement( table );\r
- var range = selection.getRanges()[0];\r
- range.collapse();\r
- selection.selectRanges( [ range ] );\r
-\r
// If the table's parent has only one child remove it as well (unless it's the body or a table cell) (#5416, #6289)\r
var parent = table.getParent();\r
if ( parent.getChildCount() == 1 && !parent.is( 'body', 'td', 'th' ) )\r
- parent.remove();\r
- else\r
- table.remove();\r
+ table = parent;\r
+\r
+ var range = new CKEDITOR.dom.range( editor.document );\r
+ range.moveToPosition( table, CKEDITOR.POSITION_BEFORE_START );\r
+ table.remove();\r
+ range.select();\r
}\r
} );\r
\r