Changeset 7537


Ignore:
Timestamp:
07/04/2012 01:12:42 PM (2 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 – 2012 CKSource – Frederico Knabben. All rights reserved. | Terms of use | Privacy policy