X-Git-Url: https://jasonwoof.com/gitweb/?p=ckeditor.git;a=blobdiff_plain;f=_source%2Fplugins%2Fautogrow%2Fplugin.js;h=c8c668eb834aa158316dcff8d6e0c83b6fc4ddcc;hp=d6c4697a96de384e77dbdc8bda9cb7f5ca248b45;hb=e73319a12b56100b29ef456fd74114fe5519e01c;hpb=f0610347140239143439a511ee2bd48cb784f470 diff --git a/_source/plugins/autogrow/plugin.js b/_source/plugins/autogrow/plugin.js index d6c4697..c8c668e 100644 --- a/_source/plugins/autogrow/plugin.js +++ b/_source/plugins/autogrow/plugin.js @@ -7,41 +7,69 @@ For licensing, see LICENSE.html or http://ckeditor.com/license * @file AutoGrow plugin */ (function(){ + + // Actual content height, figured out by appending check the last element's document position. + function contentHeight( scrollable ) + { + var overflowY = scrollable.getStyle( 'overflow-y' ); + + var doc = scrollable.getDocument(); + // Create a temporary marker element. + var marker = CKEDITOR.dom.element.createFromHtml( '' + ( CKEDITOR.env.webkit ? ' ' : '' ) + '', doc ); + doc[ CKEDITOR.env.ie? 'getBody' : 'getDocumentElement']().append( marker ); + + var height = marker.getDocumentPosition( doc ).y + marker.$.offsetHeight; + marker.remove(); + scrollable.setStyle( 'overflow-y', overflowY ); + return height; + } + var resizeEditor = function( editor ) { if ( !editor.window ) return; + var doc = editor.document, + iframe = new CKEDITOR.dom.element( doc.getWindow().$.frameElement ), + body = doc.getBody(), + htmlElement = doc.getDocumentElement(), currentHeight = editor.window.getViewPaneSize().height, - newHeight; + // Quirks mode overflows body, standards overflows document element + scrollable = doc.$.compatMode == 'BackCompat' ? body : htmlElement, + newHeight = contentHeight( scrollable ); - // We can not use documentElement to calculate the height for IE (#6061). - // It is not good for IE Quirks, yet using offsetHeight would also not work as expected (#6408). - // We do the same for FF because of the html height workaround (#6341). - if ( CKEDITOR.env.ie || CKEDITOR.env.gecko ) - newHeight = doc.getBody().$.scrollHeight + ( CKEDITOR.env.ie && CKEDITOR.env.quirks ? 0 : 24 ); - else - newHeight = doc.getDocumentElement().$.offsetHeight; + // Additional space specified by user. + newHeight += ( editor.config.autoGrow_bottomSpace || 0 ); + + var min = editor.config.autoGrow_minHeight != undefined ? editor.config.autoGrow_minHeight : 200, + max = editor.config.autoGrow_maxHeight || Infinity; - var min = editor.config.autoGrow_minHeight, - max = editor.config.autoGrow_maxHeight; - ( min == undefined ) && ( editor.config.autoGrow_minHeight = min = 200 ); - if ( min ) - newHeight = Math.max( newHeight, min ); - if ( max ) - newHeight = Math.min( newHeight, max ); + newHeight = Math.max( newHeight, min ); + newHeight = Math.min( newHeight, max ); if ( newHeight != currentHeight ) { newHeight = editor.fire( 'autoGrow', { currentHeight : currentHeight, newHeight : newHeight } ).newHeight; editor.resize( editor.container.getStyle( 'width' ), newHeight, true ); } + + if ( scrollable.$.scrollHeight > scrollable.$.clientHeight && newHeight < max ) + scrollable.setStyle( 'overflow-y', 'hidden' ); + else + scrollable.removeStyle( 'overflow-y' ); + + }; + CKEDITOR.plugins.add( 'autogrow', { init : function( editor ) { - for ( var eventName in { contentDom:1, key:1, selectionChange:1, insertElement:1 } ) + editor.addCommand( 'autogrow', { exec : resizeEditor, modes : { wysiwyg:1 }, readOnly: 1, canUndo: false, editorFocus: false } ); + + var eventsList = { contentDom:1, key:1, selectionChange:1, insertElement:1 }; + editor.config.autoGrow_onStartup && ( eventsList[ 'instanceReady' ] = 1 ); + for ( var eventName in eventsList ) { editor.on( eventName, function( evt ) { @@ -51,7 +79,13 @@ For licensing, see LICENSE.html or http://ckeditor.com/license // Disable autogrow when the editor is maximized .(#6339) ( !maximize || maximize.state != CKEDITOR.TRISTATE_ON ) ) { - setTimeout( function(){ resizeEditor( evt.editor ); }, 100 ); + setTimeout( function() + { + resizeEditor( evt.editor ); + // Second pass to make correction upon + // the first resize, e.g. scrollbar. + resizeEditor( evt.editor ); + }, 100 ); } }); } @@ -59,30 +93,49 @@ For licensing, see LICENSE.html or http://ckeditor.com/license }); })(); /** - * The minimum height to which the editor can reach using AutoGrow. + * The minimum height that the editor can reach using the AutoGrow feature. * @name CKEDITOR.config.autoGrow_minHeight * @type Number - * @default 200 + * @default 200 * @since 3.4 * @example * config.autoGrow_minHeight = 300; */ /** - * The maximum height to which the editor can reach using AutoGrow. Zero means unlimited. + * The maximum height that the editor can reach using the AutoGrow feature. Zero means unlimited. * @name CKEDITOR.config.autoGrow_maxHeight * @type Number - * @default 0 + * @default 0 * @since 3.4 * @example * config.autoGrow_maxHeight = 400; */ + /** + * Whether to have the auto grow happen on editor creation. + * @name CKEDITOR.config.autoGrow_onStartup + * @type Boolean + * @default false + * @since 3.6.2 + * @example + * config.autoGrow_onStartup = true; + */ + /** * Fired when the AutoGrow plugin is about to change the size of the editor. * @name CKEDITOR.editor#autogrow * @event - * @param {Number} data.currentHeight The current height of the editor (before the resizing). - * @param {Number} data.newHeight The new height of the editor (after the resizing). It can be changed - * to determine another height to be used instead. + * @param {Number} data.currentHeight The current height of the editor (before resizing). + * @param {Number} data.newHeight The new height of the editor (after resizing). It can be changed + * to determine a different height value to be used instead. + */ + + +/** + * Extra height in pixel to leave between the bottom boundary of content with document size when auto resizing. + * @name CKEDITOR.config.autoGrow_bottomSpace + * @type Number + * @default 0 + * @since 3.6.2 */