Ticket #3488: 3488.patch

File 3488.patch, 2.3 KB (added by Martin Kou, 15 years ago)
  • _source/plugins/tabletools/plugin.js

     
    1414        }
    1515
    1616        var cellNodeRegex = /^(?:td|th)$/;
     17
    1718        function getSelectedCells( selection )
    1819        {
    1920                var ranges = selection.getRanges();
    2021                var retval = [];
     22                var database = {};
    2123
     24                function moveOutOfCellGuard( node )
     25                {
     26                        // Apply to the first cell only.
     27                        if ( retval.length > 0 )
     28                                return;
     29
     30                        // If we are exiting from the first </td>, then the td should definitely be
     31                        // included.
     32                        if ( node.type == CKEDITOR.NODE_ELEMENT && cellNodeRegex.test( node.getName() )
     33                                        && !node.getCustomData( 'selected_cell' ) )
     34                        {
     35                                CKEDITOR.dom.element.setMarker( database, node, 'selected_cell', true );
     36                                retval.push( node );
     37                        }
     38                }
     39
    2240                for ( var i = 0 ; i < ranges.length ; i++ )
    2341                {
    2442                        var range = ranges[ i ];
    25                         var boundaryNodes = range.getBoundaryNodes();
    26                         var currentNode = boundaryNodes.startNode;
    27                         var endNode = boundaryNodes.endNode;
    28                         var startCell = currentNode.getAscendant( 'td', true ) || currentNode.getAscendant( 'th', true );
     43                        var walker = new CKEDITOR.dom.walker( range );
     44                        walker.guard = moveOutOfCellGuard;
    2945
    30                         if ( startCell )
    31                                 retval.push( startCell );
     46                        while ( ( node = walker.next() ) )
     47                        {
     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.
    3254
    33                         if ( range.collapsed || currentNode.equals( endNode ) )
    34                                 continue;
    35 
    36                         while ( !( currentNode = currentNode.getNextSourceNode() ).equals( endNode ) )
    37                         {
    38                                 if ( currentNode.type == CKEDITOR.NODE_ELEMENT && cellNodeRegex.test( currentNode.getName() ) )
    39                                         retval.push( currentNode );
     55                                var parent = node.getParent();
     56                                if ( parent && cellNodeRegex.test( parent.getName() ) && !parent.getCustomData( 'selected_cell' ) )
     57                                {
     58                                        CKEDITOR.dom.element.setMarker( database, parent, 'selected_cell', true );
     59                                        retval.push( parent );
     60                                }
    4061                        }
    4162                }
    4263
     64                CKEDITOR.dom.element.clearAllMarkers( database );
     65
    4366                return retval;
    4467        }
    4568
© 2003 – 2022, CKSource sp. z o.o. sp.k. All rights reserved. | Terms of use | Privacy policy