Changeset 7537


Ignore:
Timestamp:
07/04/12 13:12:42 (3 years ago)
Author:
garry.yao
Message:

#6217: Fixed cursor position when backspace/del key used at the boundary of a table.

Location:
CKEditor/trunk/_source
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • CKEditor/trunk/_source/core/dom/range.js

    r7477 r7537  
    350350        function getCheckStartEndBlockEvalFunction( isStart )
    351351        {
    352                 var hadBr = false, bookmarkEvaluator = CKEDITOR.dom.walker.bookmark( true );
     352                var skipBogus = false,
     353                        bookmarkEvaluator = CKEDITOR.dom.walker.bookmark( true ),
     354                        nbspRegExp = /^[\t\r\n ]*(?: |\xa0)$/;
     355
    353356                return function( node )
    354357                {
     
    359362                        if ( node.type == CKEDITOR.NODE_TEXT )
    360363                        {
     364                                // Skip the block filler NBSP.
     365                                if ( CKEDITOR.env.ie &&
     366                                         nbspRegExp.test( node.getText() ) &&
     367                                         !skipBogus &&
     368                                         !( isStart && node.getNext() ) )
     369                                {
     370                                        skipBogus = true;
     371                                }
    361372                                // If there's any visible text, then we're not at the start.
    362                                 if ( node.hasAscendant( 'pre' ) || CKEDITOR.tools.trim( node.getText() ).length )
     373                                else if ( node.hasAscendant( 'pre' ) || CKEDITOR.tools.trim( node.getText() ).length )
    363374                                        return false;
    364375                        }
     
    369380                                if ( !inlineChildReqElements[ node.getName() ] )
    370381                                {
    371                                         // If we're working at the end-of-block, forgive the first <br /> in non-IE
    372                                         // browsers.
    373                                         if ( !isStart && !CKEDITOR.env.ie && node.getName() == 'br' && !hadBr )
    374                                                 hadBr = true;
     382                                        // Skip the padding block br.
     383                                        if ( !CKEDITOR.env.ie &&
     384                                                 node.is( 'br' ) &&
     385                                                 !skipBogus &&
     386                                                 !( isStart && node.getNext() ) )
     387                                        {
     388                                                skipBogus = true;
     389                                        }
    375390                                        else
    376391                                                return false;
     
    19351950                moveToElementEditablePosition : function( el, isMoveToEnd )
    19361951                {
     1952                        var nbspRegExp = /^[\t\r\n ]*(?:&nbsp;|\xa0)$/;
     1953
    19371954                        function nextDFS( node, childOnly )
    19381955                        {
     
    19591976                                if ( el.type == CKEDITOR.NODE_TEXT )
    19601977                                {
    1961                                         this.moveToPosition( el, isMoveToEnd ?
     1978                                        // Put cursor before block filler.
     1979                                        if ( isMoveToEnd && this.checkEndOfBlock() && nbspRegExp.test( el.getText() ) )
     1980                                                this.moveToPosition( el, CKEDITOR.POSITION_BEFORE_START );
     1981                                        else
     1982                                                this.moveToPosition( el, isMoveToEnd ?
    19621983                                                                 CKEDITOR.POSITION_AFTER_END :
    19631984                                                                 CKEDITOR.POSITION_BEFORE_START );
     
    19761997                                                found = 1;
    19771998                                        }
     1999                                        // Put cursor before padding block br.
     2000                                        else if ( isMoveToEnd && el.is( 'br' ) && this.checkEndOfBlock() )
     2001                                                this.moveToPosition( el, CKEDITOR.POSITION_BEFORE_START );
    19782002                                }
    19792003
  • CKEditor/trunk/_source/plugins/wysiwygarea/plugin.js

    r7528 r7537  
    768768                                                                var sel = editor.getSelection(),
    769769                                                                        selected = sel.getSelectedElement(),
    770                                                                         range  = sel.getRanges()[ 0 ];
     770                                                                        range = sel.getRanges()[ 0 ],
     771                                                                        path = new CKEDITOR.dom.elementPath( range.startContainer ),
     772                                                                        block,
     773                                                                        parent,
     774                                                                        next,
     775                                                                        rtl = keyCode == 8;
    771776
    772777                                                                // Override keystrokes which should have deletion behavior
     
    787792
    788793                                                                        evt.data.preventDefault();
    789                                                                         return;
     794                                                                }
     795                                                                else
     796                                                                {
     797                                                                        // Handle the following special cases: (#6217)
     798                                                                        // 1. Del/Backspace key before/after table;
     799                                                                        // 2. Backspace Key after start of table.
     800                                                                        if ( ( block = path.block ) &&
     801                                                                                 range[ rtl ? 'checkStartOfBlock' : 'checkEndOfBlock' ]() &&
     802                                                                                 ( next = block[ rtl ? 'getPrevious' : 'getNext' ]( notWhitespaceEval ) ) &&
     803                                                                                 next.is( 'table' ) )
     804                                                                        {
     805                                                                                editor.fire( 'saveSnapshot' );
     806
     807                                                                                // Remove the current empty block.
     808                                                                                if ( range[ rtl ? 'checkEndOfBlock' : 'checkStartOfBlock' ]() )
     809                                                                                        block.remove();
     810
     811                                                                                // Move cursor to the beginning/end of table cell.
     812                                                                                range[ 'moveToElementEdit' + ( rtl ? 'End' : 'Start' ) ]( next );
     813                                                                                range.select();
     814
     815                                                                                editor.fire( 'saveSnapshot' );
     816
     817                                                                                evt.data.preventDefault();
     818                                                                        }
     819                                                                        else if ( path.blockLimit.is( 'td' ) &&
     820                                                                                          ( parent = path.blockLimit.getAscendant( 'table' ) ) &&
     821                                                                                          range.checkBoundaryOfElement( parent, rtl ? CKEDITOR.START : CKEDITOR.END ) &&
     822                                                                                          ( next = parent[ rtl ? 'getPrevious' : 'getNext' ]( notWhitespaceEval ) ) )
     823                                                                        {
     824                                                                                editor.fire( 'saveSnapshot' );
     825
     826                                                                                // Move cursor to the end of previous block.
     827                                                                                range[ 'moveToElementEdit' + ( rtl ? 'End' : 'Start' ) ]( next );
     828
     829                                                                                // Remove any previous empty block.
     830                                                                                if ( range.checkStartOfBlock() && range.checkEndOfBlock() )
     831                                                                                        next.remove();
     832                                                                                else
     833                                                                                        range.select();
     834
     835                                                                                editor.fire( 'saveSnapshot' );
     836
     837                                                                                evt.data.preventDefault();
     838                                                                        }
     839
    790840                                                                }
    791841                                                        }
Note: See TracChangeset for help on using the changeset viewer.
© 2003 – 2015 CKSource – Frederico Knabben. All rights reserved. | Terms of use | Privacy policy