Changeset 870

Show
Ignore:
Timestamp:
2007-09-24 16:13:40 (14 months ago)
Author:
martinkou
Message:

Fix for #1178 and #1267 : Fixed the issue where sometimes it is not possible to cancel lists due to leftover marker attributes.
Fixed the issue where sometimes it is not possible to outdent lists due to leftover marker attributes.

Location:
FCKeditor/trunk/editor/_source
Files:
3 modified

Legend:

Unmodified
Added
Removed
  • FCKeditor/trunk/editor/_source/commandclasses/fckindentcommands.js

    r869 r870  
    272272 
    273273                // Clean up the markers. 
    274                 FCKDomTools.ClearElementMarkers( markerObj ) ; 
     274                FCKDomTools.ClearAllMarkers( markerObj ) ; 
    275275        } 
    276276} ; 
  • FCKeditor/trunk/editor/_source/commandclasses/fcklistcommands.js

    r869 r870  
    156156 
    157157                // For all new lists created, merge adjacent, same type lists. 
    158                 while ( listsCreated.length > 0 ) 
    159                 { 
    160                         var listNode = listsCreated.shift() ; 
     158                for ( var i = 0 ; i < listsCreated.length ; i++ ) 
     159                { 
     160                        var listNode = listsCreated[i] ; 
    161161                        var stopFlag = false ; 
    162162                        var currentNode = listNode ; 
     
    164164                        { 
    165165                                currentNode = currentNode.nextSibling ; 
    166                                 if ( currentNode && currentNode.nodeType == 3 && currentNode.nodeValue.search( /^[\n\r\t ]*$/ ) == 0  ) 
     166                                if ( currentNode && currentNode.nodeType == 3 && currentNode.nodeValue.search( /^[\n\r\t ]*$/ ) == 0 ) 
    167167                                        continue ; 
    168168                                stopFlag = true ; 
     
    175175                                        listNode.appendChild( currentNode.removeChild( currentNode.firstChild ) ) ; 
    176176                        } 
     177 
     178                        stopFlag = false ; 
     179                        currentNode = listNode ; 
     180                        while ( ! stopFlag ) 
     181                        { 
     182                                currentNode = currentNode.previousSibling ; 
     183                                if ( currentNode && currentNode.nodeType == 3 && currentNode.nodeValue.search( /^[\n\r\t ]*$/ ) == 0 ) 
     184                                        continue ; 
     185                                stopFlag = true ; 
     186                        } 
     187                        if ( currentNode && currentNode.nodeName.IEquals( this.TagName ) ) 
     188                        { 
     189                                currentNode.parentNode.removeChild( currentNode ) ; 
     190                                while ( currentNode.lastChild ) 
     191                                        listNode.insertBefore( currentNode.removeChild( currentNode.lastChild ), 
     192                                                       listNode.firstChild ) ; 
     193                        } 
    177194                } 
    178195 
    179196                // Clean up, restore selection and update toolbar button states. 
    180                 FCKDomTools.ClearElementMarkers( markerObj ) ; 
     197                FCKDomTools.ClearAllMarkers( markerObj ) ; 
    181198                range.MoveToBookmark( bookmark ) ; 
    182199                range.Select() ; 
     
    208225                        listArray[listIndex].parent = fakeParent ; 
    209226                } 
    210                 var newList = FCKDomTools.ArrayToList( listArray ) ; 
     227                var newList = FCKDomTools.ArrayToList( listArray, markerObj ) ; 
    211228                if ( newList.listNode.lastChild.nodeName.IEquals( this.TagName) ) 
    212229                        listsCreated.push( newList.listNode.lastChild ) ; 
     
    316333                } 
    317334 
    318                 var newList = FCKDomTools.ArrayToList( listArray ) ; 
     335                var newList = FCKDomTools.ArrayToList( listArray, markerObj ) ; 
    319336                // If groupObj.root is the last element in its parent, or its nextSibling is a <br>, then we should  
    320337                // not add a <br> after the final item. So, check for the cases and trim the <br>. 
  • FCKeditor/trunk/editor/_source/internals/fckdomtools.js

    r869 r870  
    585585        }, 
    586586 
    587         SetElementMarker : function ( markObj, element, attrName, value) 
     587        SetElementMarker : function ( markerObj, element, attrName, value) 
    588588        { 
    589589                var id = String( parseInt( Math.random() * 0xfffffff, 10 ) ) ; 
    590590                element._FCKMarkerId = id ; 
    591591                element[attrName] = value ; 
    592                 if ( ! markObj[id] ) 
    593                         markObj[id] = { 'element' : element, 'markers' : {} } ; 
    594                 markObj[id]['markers'][attrName] = value ; 
    595         }, 
    596  
    597         ClearElementMarkers : function( markObj ) 
    598         { 
    599                 for ( var i in markObj ) 
    600                 { 
    601                         var element = markObj[i]['element'] ; 
    602                         this.ClearElementJSProperty( element, '_FCKMarkerId' ) ; 
    603                         for ( var j in markObj[i]['markers'] ) 
    604                                 this.ClearElementJSProperty( element, j ) ; 
    605                         delete markObj[i] ; 
    606                 } 
     592                if ( ! markerObj[id] ) 
     593                        markerObj[id] = { 'element' : element, 'markers' : {} } ; 
     594                markerObj[id]['markers'][attrName] = value ; 
     595        }, 
     596 
     597        ClearElementMarkers : function( markerObj, element, clearMarkerObj ) 
     598        { 
     599                var id = element._FCKMarkerId ; 
     600                if ( ! id ) 
     601                        return ; 
     602                this.ClearElementJSProperty( element, '_FCKMarkerId' ) ; 
     603                for ( var j in markerObj[id]['markers'] ) 
     604                        this.ClearElementJSProperty( element, j ) ; 
     605                if ( clearMarkerObj ) 
     606                        delete markerObj[id] ; 
     607        }, 
     608 
     609        ClearAllMarkers : function( markerObj ) 
     610        { 
     611                for ( var i in markerObj ) 
     612                        this.ClearElementMarkers( markerObj, markerObj[i]['element'], true ) ; 
    607613        }, 
    608614 
     
    652658 
    653659        // Convert our internal representation of a list back to a DOM forest. 
    654         ArrayToList : function( listArray, baseIndex ) 
     660        ArrayToList : function( listArray, markerObj, baseIndex ) 
    655661        { 
    656662                if ( baseIndex == undefined ) 
     
    682688                        else if ( item.indent == Math.max( indentLevel, 0 ) + 1 ) 
    683689                        { 
    684                                 var listData = this.ArrayToList( listArray, currentIndex ) ; 
     690                                var listData = this.ArrayToList( listArray, null, currentIndex ) ; 
    685691                                currentListItem.appendChild( listData.listNode ) ; 
    686692                                currentIndex = listData.nextIndex ; 
     
    715721                        } 
    716722                } 
     723 
     724                // Clear marker attributes for the new list tree made of cloned nodes, if any. 
     725                if ( markerObj ) 
     726                { 
     727                        var currentNode = retval.firstChild ; 
     728                        while ( currentNode ) 
     729                        { 
     730                                if ( currentNode.nodeType == 1 ) 
     731                                        this.ClearElementMarkers( markerObj, currentNode ) ; 
     732                                currentNode = this.GetNextSourceNode( currentNode ) ; 
     733                        } 
     734                } 
     735 
    717736                return { 'listNode' : retval, 'nextIndex' : currentIndex } ; 
    718737        },