Changeset 7243 for CKEditor/trunk


Ignore:
Timestamp:
08/30/2011 06:45:14 PM (3 years ago)
Author:
garry.yao
Message:

#7645: Remove the entire list/table when deletion with entire list selected.

Location:
CKEditor/trunk
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • CKEditor/trunk/CHANGES.html

    r7242 r7243  
    7979                <li><a href="http://dev.ckeditor.com/ticket/8246">#8246</a> : Bad editing performance on certain document content.</li> 
    8080                <li><a href="http://dev.ckeditor.com/ticket/7912">#7912</a> : Cursor trapped in invisible element after enter key.</li> 
     81                <li><a href="http://dev.ckeditor.com/ticket/7645">#7645</a> : Full list/table deletion with backspace/delete key.</li> 
    8182                <li>Updated the following language files:<ul> 
    8283                        <li><a href="http://dev.ckeditor.com/ticket/8128">#8128</a> : Italian;</li> 
  • CKEditor/trunk/_source/plugins/selection/plugin.js

    r7235 r7243  
    464464                                                doc.on( 'mouseup', checkSelectionChangeTimeout, editor ); 
    465465                                                doc.on( 'keyup', checkSelectionChangeTimeout, editor ); 
     466                                                doc.on( 'selectionchange', checkSelectionChangeTimeout, editor ); 
    466467                                        } 
    467468                                }); 
     
    11461147                                        return self.getNative().createRange().item( 0 ); 
    11471148                                }, 
     1149                                // If a table or list is fully selected. 
     1150                                function() 
     1151                                { 
     1152                                        var root, 
     1153                                                retval, 
     1154                                                range  = self.getRanges()[ 0 ], 
     1155                                                ancestor = range.getCommonAncestor( 1, 1 ), 
     1156                                                tags = { table:1,ul:1,ol:1,dl:1 }; 
     1157 
     1158                                        for ( var t in tags ) 
     1159                                        { 
     1160                                                if ( root = ancestor.getAscendant( t, 1 ) ) 
     1161                                                        break; 
     1162                                        } 
     1163 
     1164                                        if ( root ) 
     1165                                        { 
     1166                                                // Enlarging the start boundary. 
     1167                                                var testRange = new CKEDITOR.dom.range( this.document ); 
     1168                                                testRange.setStartAt( root, CKEDITOR.POSITION_AFTER_START ); 
     1169                                                testRange.setEnd( range.startContainer, range.startOffset ); 
     1170 
     1171                                                var enlargeables = CKEDITOR.tools.extend( tags, CKEDITOR.dtd.$listItem, CKEDITOR.dtd.$tableContent ), 
     1172                                                        walker = new CKEDITOR.dom.walker( testRange ), 
     1173                                                        // Check the range is at the inner boundary of the structural element. 
     1174                                                        guard = function( walker, isEnd ) 
     1175                                                        { 
     1176                                                                return function( node, isWalkOut ) 
     1177                                                                { 
     1178                                                                        if ( node.type == CKEDITOR.NODE_TEXT && ( !CKEDITOR.tools.trim( node.getText() ) || node.getParent().data( 'cke-bookmark' ) ) ) 
     1179                                                                                return true; 
     1180 
     1181                                                                        var tag; 
     1182                                                                        if ( node.type == CKEDITOR.NODE_ELEMENT ) 
     1183                                                                        { 
     1184                                                                                tag = node.getName(); 
     1185 
     1186                                                                                // Bypass bogus br at the end of block. 
     1187                                                                                if ( tag == 'br' && isEnd && node.equals( node.getParent().getBogus() ) ) 
     1188                                                                                        return true; 
     1189 
     1190                                                                                if ( isWalkOut && tag in enlargeables || tag in CKEDITOR.dtd.$removeEmpty ) 
     1191                                                                                        return true; 
     1192                                                                        } 
     1193 
     1194                                                                        walker.halted = 1; 
     1195                                                                        return false; 
     1196                                                                }; 
     1197                                                        }; 
     1198 
     1199                                                walker.guard = guard( walker ); 
     1200 
     1201                                                if ( walker.checkBackward() && !walker.halted ) 
     1202                                                { 
     1203                                                        walker = new CKEDITOR.dom.walker( testRange ); 
     1204                                                        testRange.setStart( range.endContainer, range.endOffset ); 
     1205                                                        testRange.setEndAt( root, CKEDITOR.POSITION_BEFORE_END ); 
     1206                                                        walker.guard = guard( walker, 1 ); 
     1207                                                        if ( walker.checkForward() && !walker.halted ) 
     1208                                                                retval = root.$; 
     1209                                                } 
     1210                                        } 
     1211 
     1212                                        if ( !retval ) 
     1213                                                throw 0; 
     1214 
     1215                                        return retval; 
     1216                                }, 
    11481217                                // Figure it out by checking if there's a single enclosed 
    11491218                                // node of the range. 
     
    14451514                                } 
    14461515 
     1516                                // Don't miss selection change event for non-IEs. 
     1517                                this.document.fire( 'selectionchange' ); 
    14471518                                this.reset(); 
    14481519                        } 
  • CKEditor/trunk/_source/plugins/wysiwygarea/plugin.js

    r7239 r7243  
    746746                                                keystrokeHandler.attach( domDocument ); 
    747747 
    748                                                 if ( CKEDITOR.env.ie ) 
    749                                                 { 
    750                                                         domDocument.getDocumentElement().addClass( domDocument.$.compatMode ); 
    751                                                         // Override keystrokes which should have deletion behavior 
    752                                                         //  on control types in IE . (#4047) 
    753                                                         editable && domDocument.on( 'keydown', function( evt ) 
    754                                                         { 
    755                                                                 var keyCode = evt.data.getKeystroke(); 
    756  
    757                                                                 // Backspace OR Delete. 
    758                                                                 if ( keyCode in { 8 : 1, 46 : 1 } ) 
    759                                                                 { 
    760                                                                         var sel = editor.getSelection(), 
    761                                                                                 control = sel.getSelectedElement(); 
    762  
    763                                                                         if ( control ) 
     748                                                domDocument.getDocumentElement().addClass( domDocument.$.compatMode ); 
     749                                                // Override keystroke behaviors. 
     750                                                editable && domDocument.on( 'keydown', function( evt ) 
     751                                                { 
     752                                                        var keyCode = evt.data.getKeystroke(); 
     753 
     754                                                        // Backspace OR Delete. 
     755                                                        if ( keyCode in { 8 : 1, 46 : 1 } ) 
     756                                                        { 
     757                                                                var sel = editor.getSelection(), 
     758                                                                        selected = sel.getSelectedElement(), 
     759                                                                        range  = sel.getRanges()[ 0 ]; 
     760 
     761                                                                // Override keystrokes which should have deletion behavior 
     762                                                                //  on fully selected element . (#4047) (#7645) 
     763                                                                if ( selected ) 
     764                                                                { 
     765                                                                        // Make undo snapshot. 
     766                                                                        editor.fire( 'saveSnapshot' ); 
     767 
     768                                                                        // Delete any element that 'hasLayout' (e.g. hr,table) in IE8 will 
     769                                                                        // break up the selection, safely manage it here. (#4795) 
     770                                                                        range.moveToPosition( selected, CKEDITOR.POSITION_BEFORE_START ); 
     771                                                                        // Remove the control manually. 
     772                                                                        selected.remove(); 
     773                                                                        range.select(); 
     774 
     775                                                                        editor.fire( 'saveSnapshot' ); 
     776 
     777                                                                        evt.data.preventDefault(); 
     778                                                                        return; 
     779                                                                } 
     780                                                        } 
     781                                                } ); 
     782 
     783                                                // PageUp/PageDown scrolling is broken in document 
     784                                                // with standard doctype, manually fix it. (#4736) 
     785                                                if ( CKEDITOR.env.ie && domDocument.$.compatMode == 'CSS1Compat' ) 
     786                                                { 
     787                                                        var pageUpDownKeys = { 33 : 1, 34 : 1 }; 
     788                                                        domDocument.on( 'keydown', function( evt ) 
     789                                                        { 
     790                                                                if ( evt.data.getKeystroke() in pageUpDownKeys ) 
     791                                                                { 
     792                                                                        setTimeout( function () 
    764793                                                                        { 
    765                                                                                 // Make undo snapshot. 
    766                                                                                 editor.fire( 'saveSnapshot' ); 
    767  
    768                                                                                 // Delete any element that 'hasLayout' (e.g. hr,table) in IE8 will 
    769                                                                                 // break up the selection, safely manage it here. (#4795) 
    770                                                                                 var bookmark = sel.getRanges()[ 0 ].createBookmark(); 
    771                                                                                 // Remove the control manually. 
    772                                                                                 control.remove(); 
    773                                                                                 sel.selectBookmarks( [ bookmark ] ); 
    774  
    775                                                                                 editor.fire( 'saveSnapshot' ); 
    776  
    777                                                                                 evt.data.preventDefault(); 
    778                                                                         } 
     794                                                                                editor.getSelection().scrollIntoView(); 
     795                                                                        }, 0 ); 
    779796                                                                } 
    780797                                                        } ); 
    781  
    782                                                         // PageUp/PageDown scrolling is broken in document 
    783                                                         // with standard doctype, manually fix it. (#4736) 
    784                                                         if ( domDocument.$.compatMode == 'CSS1Compat' ) 
    785                                                         { 
    786                                                                 var pageUpDownKeys = { 33 : 1, 34 : 1 }; 
    787                                                                 domDocument.on( 'keydown', function( evt ) 
    788                                                                 { 
    789                                                                         if ( evt.data.getKeystroke() in pageUpDownKeys ) 
     798                                                } 
     799 
     800                                                // Prevent IE from leaving new paragraph after deleting all contents in body. (#6966) 
     801                                                if ( CKEDITOR.env.ie && editor.config.enterMode != CKEDITOR.ENTER_P ) 
     802                                                { 
     803                                                        domDocument.on( 'selectionchange', function() 
     804                                                        { 
     805                                                                var body = domDocument.getBody(), 
     806                                                                        range = editor.getSelection().getRanges()[ 0 ]; 
     807 
     808                                                                if ( body.getHtml().match( /^<p>&nbsp;<\/p>$/i ) 
     809                                                                        && range.startContainer.equals( body ) ) 
     810                                                                { 
     811                                                                        // Avoid the ambiguity from a real user cursor position. 
     812                                                                        setTimeout( function () 
    790813                                                                        { 
    791                                                                                 setTimeout( function () 
     814                                                                                range = editor.getSelection().getRanges()[ 0 ]; 
     815                                                                                if ( !range.startContainer.equals ( 'body' ) ) 
    792816                                                                                { 
    793                                                                                         editor.getSelection().scrollIntoView(); 
    794                                                                                 }, 0 ); 
    795                                                                         } 
    796                                                                 } ); 
    797                                                         } 
    798  
    799                                                         // Prevent IE from leaving new paragraph after deleting all contents in body. (#6966) 
    800                                                         editor.config.enterMode != CKEDITOR.ENTER_P 
    801                                                                 && domDocument.on( 'selectionchange', function() 
    802                                                                 { 
    803                                                                         var body = domDocument.getBody(), 
    804                                                                                 range = editor.getSelection().getRanges()[ 0 ]; 
    805  
    806                                                                         if ( body.getHtml().match( /^<p>&nbsp;<\/p>$/i ) 
    807                                                                                 && range.startContainer.equals( body ) ) 
    808                                                                         { 
    809                                                                                 // Avoid the ambiguity from a real user cursor position. 
    810                                                                                 setTimeout( function () 
    811                                                                                 { 
    812                                                                                         range = editor.getSelection().getRanges()[ 0 ]; 
    813                                                                                         if ( !range.startContainer.equals ( 'body' ) ) 
    814                                                                                         { 
    815                                                                                                 body.getFirst().remove( 1 ); 
    816                                                                                                 range.moveToElementEditEnd( body ); 
    817                                                                                                 range.select( 1 ); 
    818                                                                                         } 
    819                                                                                 }, 0 ); 
    820                                                                         } 
    821                                                                 }); 
     817                                                                                        body.getFirst().remove( 1 ); 
     818                                                                                        range.moveToElementEditEnd( body ); 
     819                                                                                        range.select( 1 ); 
     820                                                                                } 
     821                                                                        }, 0 ); 
     822                                                                } 
     823                                                        }); 
    822824                                                } 
    823825 
Note: See TracChangeset for help on using the changeset viewer.
© 2003 – 2012 CKSource – Frederico Knabben. All rights reserved. | Terms of use | Privacy policy