Ticket #8050: 8050_5.patch

File 8050_5.patch, 4.8 KB (added by Dinu, 9 years ago)
  • _source/plugins/autogrow/plugin.js

     
    66/**
    77 * @file AutoGrow plugin
    88 */
     9
    910(function(){
    1011
    11         var parts = [ "margin-top","margin-bottom","border-top-width", "border-bottom-width", "padding-top",  "padding-bottom" ];
    12 
    13         function nonContentHeight( element )
    14         {
    15                 var adjustment = 0;
    16                 for ( var i = 0, len = parts.length; i < len; i++ )
    17                         adjustment += parseInt( element.getComputedStyle( parts[ i ] ) || 0, 10 ) || 0;
    18                 return adjustment;
    19         }
    20 
    21         // Count for spaces outside of  the actual content.
    22         function extra( element )
    23         {
    24                 var margin = 0;
    25                 margin += nonContentHeight( element);
    26                 if ( element.is( 'html' ) )
    27                         margin += nonContentHeight( element.getDocument().getBody() );
    28                 return margin;
    29         }
    30 
    3112        // Actual content height, figured out by simply check the last element's document position.
    32         function docContentHeight( doc )
     13        function docContentHeight( doc, scrollable )
    3314        {
    34                 var last = doc.getBody().getLast();
    35 
    36                 // Last node is not measurable,  create a temporary marker element.
    37                 if ( !last || last.type != CKEDITOR.NODE_ELEMENT || last.is( 'br' ) )
    38                 {
    39                         last = CKEDITOR.dom.element.createFromHtml( '<span>' + ( CKEDITOR.env.webkit ? '&nbsp;' : '' ) + '</span>', doc );
    40                         doc.getBody().append( last );
    41                         last.isMarker = 1;
    42                 }
    43 
    44                 var height = last.getDocumentPosition( doc ).y + last.$.offsetHeight + parseInt( last.getComputedStyle( 'margin-bottom' ) || 0, 10 );
    45                 last.isMarker && last.remove();
     15                // Always create marker, to account for margin
     16                // ??? Any reason to use <SPAN> here? it doesn't account for floated elements (old problem with autogrow...)
     17                // !!! Please check IE6 and quirks
     18                // TODO: div style can be affected by document stylesheets. Needs complete reset (display:block, reset width, left, top, bottom, what else???) and !important
     19                last = CKEDITOR.dom.element.createFromHtml( '<div style="clear:both; height:1px; line-height:1px"></div>', doc );
     20                doc.getBody().append( last );
     21                var height = last.getDocumentPosition( doc ).y;
     22                last.remove();
     23                // Depending on browser, and whether body has margin, largest of these is valid in
     24                if(CKEDITOR.env.webkit)
     25                        return Math.max( scrollable.$.scrollHeight, height );
    4626                return height;
    4727        }
    4828
     
    5030        {
    5131                init : function( editor )
    5232                {
     33                        // The offset size between content height and editor size.
    5334                        var contentMargin = 0;
    5435                        var resizeEditor = function( editor )
    5536                        {
     
    5738                                        return;
    5839
    5940                                var doc = editor.document,
    60                                         resizeable = editor.getResizable( 1 ),
    61                                         body = doc.getBody(),
     41                                        resizeable = editor.getResizable( 1 );
     42                                var     body = doc.getBody(),
    6243                                        htmlElement = doc.getDocumentElement(),
    6344                                        currentHeight = resizeable.$.offsetHeight,
    6445                                        newHeight;
    6546
    6647                                // Quirks mode overflows body except for IE9, standards overflows document element.
    67                                 var scrollable = !CKEDITOR.env.ie9Compat && doc.$.compatMode == 'BackCompat' ? body : htmlElement,
    68                                         contentHeight = docContentHeight( doc ),
    69                                         delta = contentHeight - scrollable.$.clientHeight + extra( scrollable );
     48                                var scrollable = !CKEDITOR.env.ie9Compat && doc.$.compatMode == 'BackCompat' ? body : htmlElement;
    7049
    71                                 // Delta height from either increasing or decreasing.
    72                                 if ( delta )
    73                                 {
    74                                         newHeight = currentHeight + delta;
     50                                // Get maximum possible height
     51                                newHeight = docContentHeight( doc, scrollable );
     52                                if ( newHeight != currentHeight ) {
     53                                        // And resize to it
     54                                        resizeable.setStyle( 'height', newHeight + 'px' );
     55                                        // If vertical scrollbar disappeared
     56                                        if ( scrollable.$.clientWidth >= scrollable.$.scrollWidth )
     57                                                if ( newHeight > currentHeight )
     58                                                        // Resize down to size gained by removal of vertical and horizontal scrollbar
     59                                                        newHeight = docContentHeight( doc, scrollable );
     60                                                else;
     61                                        else
     62                                                // Otherwise add height of scrollbar
     63                                                newHeight += scrollable.$.offsetHeight - scrollable.$.clientHeight;
     64
    7565                                        var min = editor.config.autoGrow_minHeight,
    7666                                                max = editor.config.autoGrow_maxHeight;
    7767
     
    8474                                        if ( newHeight != currentHeight )
    8575                                        {
    8676                                                newHeight = editor.fire( 'autoGrow', { currentHeight : currentHeight, newHeight : newHeight } ).newHeight;
    87                                                 resizeable.setStyle( 'height', newHeight + 'px' );
    8877                                                editor.fire( 'resize' );
    89                                                 // Calculate and record now the margin between the actual content size and page size.
    90                                                 setTimeout( function() { contentMargin = scrollable.scrollHeight - body.offsetHeight; }, 0 );
    91 
    9278                                        }
     79                                        resizeable.setStyle( 'height', newHeight + 'px' );
    9380                                }
    9481                        };
    9582
© 2003 – 2019 CKSource – Frederico Knabben. All rights reserved. | Terms of use | Privacy policy