Ticket #3790: 3790_4.patch

File 3790_4.patch, 7.7 KB (added by Garry Yao, 13 years ago)
  • _source/plugins/find/dialogs/find.js

     
    214214                        setMatched : function()
    215215                        {
    216216                                this._.isMatched = true;
    217                                 this.highlight();
    218217                        },
    219218
    220219                        clearMatched : function()
    221220                        {
    222221                                this._.isMatched = false;
    223                                 this.removeHighlight();
    224222                        },
    225223
    226224                        isMatched : function()
     
    427425                var finder = {
    428426                        searchRange : null,
    429427                        matchRange : null,
    430                         find : function( pattern, matchCase, matchWord, matchCyclic )
     428                        find : function( pattern, matchCase, matchWord, matchCyclic, highlightMatched )
    431429                        {
    432430                                if( !this.matchRange )
    433431                                        this.matchRange =
     
    471469                                                                                && isWordSeparator( tailWalker.next().character ) ) )
    472470                                                                continue;
    473471                                                }
    474 
    475472                                                this.matchRange.setMatched();
     473                                                if ( highlightMatched !== false )
     474                                                        this.matchRange.highlight();
    476475                                                return true;
    477476                                        }
    478477                                }
     
    496495                        replaceCounter : 0,
    497496
    498497                        replace : function( dialog, pattern, newString, matchCase, matchWord,
    499                                 matchCyclic, matchReplaceAll )
     498                                matchCyclic , isReplaceAll )
    500499                        {
    501500                                // Successiveness of current replace/find.
    502501                                var result = false;
     
    510509                                        this.matchRange.removeHighlight();
    511510                                        var domRange = this.matchRange.toDomRange();
    512511                                        var text = editor.document.createText( newString );
    513 
    514                                         // Save undo snaps before and after the replacement.
    515                                         var selection = editor.getSelection();
    516                                         selection.selectRanges( [ domRange ] );
    517                                         editor.fire( 'saveSnapshot' );
    518 
     512                                        if ( !isReplaceAll )
     513                                        {
     514                                                // Save undo snaps before and after the replacement.
     515                                                var selection = editor.getSelection();
     516                                                selection.selectRanges( [ domRange ] );
     517                                                editor.fire( 'saveSnapshot' );
     518                                        }
    519519                                        domRange.deleteContents();
    520520                                        domRange.insertNode( text );
    521 
    522                                         selection.selectRanges( [ domRange ] );
    523                                         editor.fire( 'saveSnapshot' );
    524 
     521                                        if ( !isReplaceAll )
     522                                        {
     523                                                selection.selectRanges( [ domRange ] );
     524                                                editor.fire( 'saveSnapshot' );
     525                                        }
    525526                                        this.matchRange.updateFromDomRange( domRange );
    526                                         this.matchRange.highlight();
     527                                        if ( !isReplaceAll )
     528                                                this.matchRange.highlight();
    527529                                        this.matchRange._.isReplaced = true;
    528530                                        this.replaceCounter++;
    529531                                        result = true;
    530532                                }
    531533                                else
    532                                         result = this.find( pattern, matchCase, matchWord, matchCyclic );
     534                                        result = this.find( pattern, matchCase, matchWord, matchCyclic, !isReplaceAll );
    533535
    534                                 // Recusively replace all matches.
    535                                 if ( matchReplaceAll && result )
    536                                         this.replace.apply( this, Array.prototype.slice.call( arguments ) );
    537 
    538                                 return matchReplaceAll ?
    539                                         this.replaceCounter : result;
     536                                return result;
    540537                        }
    541538                };
    542539
     
    702699
    703700                                                                                // Scope to full document.
    704701                                                                                finder.searchRange = getSearchRange( true );
    705                                                                                 finder.matchRange = null;
    706                                                                                 if ( ( replaceNums = finder.replace( dialog,
     702                                                                                if ( finder.matchRange )
     703                                                                                {
     704                                                                                        finder.matchRange.removeHighlight();
     705                                                                                        finder.matchRange = null;
     706                                                                                }
     707                                                                                editor.fire( 'saveSnapshot' );
     708                                                                                while( finder.replace( dialog,
    707709                                                                                        dialog.getValueOf( 'replace', 'txtFindReplace' ),
    708710                                                                                        dialog.getValueOf( 'replace', 'txtReplace' ),
    709711                                                                                        dialog.getValueOf( 'replace', 'txtReplaceCaseChk' ),
    710712                                                                                        dialog.getValueOf( 'replace', 'txtReplaceWordChk' ),
    711                                                                                         false, true ) ) )
    712                                                                                         alert( editor.lang.findAndReplace.replaceSuccessMsg.replace( /%1/, replaceNums ) );
     713                                                                                        false, true ) )
     714                                                                                ;
     715
     716                                                                                if ( finder.replaceCounter )
     717                                                                                {
     718                                                                                        alert( editor.lang.findAndReplace.replaceSuccessMsg.replace( /%1/, finder.replaceCounter ) );
     719                                                                                        editor.fire( 'saveSnapshot' );
     720                                                                                }
    713721                                                                                else
    714722                                                                                        alert( editor.lang.findAndReplace.notFoundMsg );
    715723                                                                        }
  • _source/tests/core/dom/range.html

     
    21882188                        assert.areEqual( range.endOffset, 2 );
    21892189                },
    21902190
     2191                /**
     2192                 * Trim range which collapsed at text node boundary.
     2193                 */
     2194                test_trim_3790 : function()
     2195                {
     2196
     2197                        var ct = doc.getById( '_trim_ct');
     2198                        ct.setHtml( '<span id="_SPAN1">text</span>' );
     2199                        var text = doc.getById( '_trim_ct').getFirst();
     2200
     2201                        // <span id="_SPAN1">text^</span>
     2202                        var range = new CKEDITOR.dom.range();
     2203                        range.setStartAt( doc.getById( '_SPAN1' ).getFirst(), CKEDITOR.POSITION_BEFORE_END );
     2204                        range.collapse( true );
     2205                        range.trim( true );
     2206
     2207                        // <span id="_SPAN1">text^</span>
     2208                        assert.isTrue( range.collapsed );
     2209                        assert.areEqual( doc.getById( '_SPAN1').$, range.startContainer.$ );
     2210                        assert.areEqual( range.startOffset, 1 );
     2211                },
     2212
     2213                /**
     2214                 * Trim range which collapsed inside text node.
     2215                 */
     2216                test_trim_3790_2 : function()
     2217                {
     2218
     2219                        var ct = doc.getById( '_trim_ct');
     2220                        ct.setHtml( '<span id="_SPAN1">text</span>' );
     2221                        var text = doc.getById( '_trim_ct').getFirst();
     2222
     2223                        // <span id="_SPAN1">te^xt</span>
     2224                        var range = new CKEDITOR.dom.range();
     2225                        range.setStart( doc.getById( '_SPAN1' ).getFirst(), 2 );
     2226                        range.collapse( true );
     2227                        range.trim( true );
     2228
     2229                        // <span id="_SPAN1">te^xt</span>
     2230                        assert.isTrue( range.collapsed );
     2231                        assert.areEqual( doc.getById( '_SPAN1').$, range.startContainer.$ );
     2232                        assert.areEqual( range.startOffset, 1 );
     2233                },
    21912234                /////////////
    21922235
    21932236                setUp : function()
     
    22002243        };
    22012244})() );
    22022245
    2203 //window.onload = function()
    2204 //{
    2205 //      tests.test_createBookmark2_3();
    2206 //}
    2207 
     2246//window.onload = tests.test_trim;
    22082247        //]]>
    22092248        </script>
    22102249</head>
  • _source/core/dom/range.js

     
    703703
    704704                trim : function( ignoreStart, ignoreEnd )
    705705                {
    706                         var startContainer = this.startContainer;
    707                         var startOffset = this.startOffset;
    708 
    709                         if ( !ignoreStart && startContainer && startContainer.type == CKEDITOR.NODE_TEXT )
     706                        var startContainer = this.startContainer,
     707                                startOffset = this.startOffset,
     708                                collapsed = this.collapsed;
     709                        if ( ( !ignoreStart || collapsed )
     710                                 && startContainer && startContainer.type == CKEDITOR.NODE_TEXT )
    710711                        {
    711712                                // If the offset is zero, we just insert the new node before
    712713                                // the start.
     
    730731
    731732                                        startOffset = startContainer.getIndex() + 1;
    732733                                        startContainer = startContainer.getParent();
    733 
    734734                                        // Check if it is necessary to update the end boundary.
    735                                         if ( this.collapsed )
    736                                                 this.setEnd( startContainer, startOffset );
    737                                         else if ( this.startContainer.equals( this.endContainer ) )
     735                                        if ( !collapsed && this.startContainer.equals( this.endContainer ) )
    738736                                                this.setEnd( nextText, this.endOffset - this.startOffset );
    739737                                }
    740738
    741739                                this.setStart( startContainer, startOffset );
     740
     741                                if ( collapsed )
     742                                        this.collapse( true );
    742743                        }
    743744
    744745                        var endContainer = this.endContainer;
    745746                        var endOffset = this.endOffset;
    746747
    747                         if ( !ignoreEnd && endContainer && !this.collapsed && endContainer.type == CKEDITOR.NODE_TEXT )
     748                        if ( ! ( ignoreEnd || this.collapsed )
     749                                 && endContainer && endContainer.type == CKEDITOR.NODE_TEXT )
    748750                        {
    749751                                // If the offset is zero, we just insert the new node before
    750752                                // the start.
© 2003 – 2022, CKSource sp. z o.o. sp.k. All rights reserved. | Terms of use | Privacy policy