Ticket #3650: 3650.patch

File 3650.patch, 2.5 KB (added by Martin Kou, 11 years ago)
  • _source/plugins/tabletools/plugin.js

     
    1717
    1818        function getSelectedCells( selection )
    1919        {
     20                // Walker will try to split text nodes, which will make the current selection
     21                // invalid. So save bookmarks before doing anything.
     22                var bookmarks = selection.createBookmarks();
     23
    2024                var ranges = selection.getRanges();
    2125                var retval = [];
    2226                var database = {};
     
    4044                for ( var i = 0 ; i < ranges.length ; i++ )
    4145                {
    4246                        var range = ranges[ i ];
    43                         var walker = new CKEDITOR.dom.walker( range );
    44                         walker.guard = moveOutOfCellGuard;
    4547
    46                         while ( ( node = walker.next() ) )
     48                        if ( range.collapsed )
    4749                        {
    48                                 // If may be possible for us to have a range like this:
    49                                 // <td>^1</td><td>^2</td>
    50                                 // The 2nd td shouldn't be included.
    51                                 //
    52                                 // So we have to take care to include a td we've entered only when we've
    53                                 // walked into its children.
     50                                // Walker does not handle collapsed ranges yet - fall back to old API.
     51                                var startNode = range.getBoundaryNodes().startNode;
     52                                var nearestCell = startNode.getAscendant( 'td', true ) || startNode.getAscendant( 'th', true );
     53                                if ( nearestCell )
     54                                        retval.push( nearestCell );
     55                        }
     56                        else
     57                        {
     58                                var walker = new CKEDITOR.dom.walker( range );
     59                                var node;
     60                                walker.guard = moveOutOfCellGuard;
    5461
    55                                 var parent = node.getParent();
    56                                 if ( parent && cellNodeRegex.test( parent.getName() ) && !parent.getCustomData( 'selected_cell' ) )
     62                                while ( ( node = walker.next() ) )
    5763                                {
    58                                         CKEDITOR.dom.element.setMarker( database, parent, 'selected_cell', true );
    59                                         retval.push( parent );
     64                                        // If may be possible for us to have a range like this:
     65                                        // <td>^1</td><td>^2</td>
     66                                        // The 2nd td shouldn't be included.
     67                                        //
     68                                        // So we have to take care to include a td we've entered only when we've
     69                                        // walked into its children.
     70
     71                                        var parent = node.getParent();
     72                                        if ( parent && cellNodeRegex.test( parent.getName() ) && !parent.getCustomData( 'selected_cell' ) )
     73                                        {
     74                                                CKEDITOR.dom.element.setMarker( database, parent, 'selected_cell', true );
     75                                                retval.push( parent );
     76                                        }
    6077                                }
    6178                        }
    6279                }
    6380
    6481                CKEDITOR.dom.element.clearAllMarkers( database );
    6582
     83                // Restore selection position.
     84                selection.selectBookmarks( bookmarks );
     85
    6686                return retval;
    6787        }
© 2003 – 2019 CKSource – Frederico Knabben. All rights reserved. | Terms of use | Privacy policy