X-Git-Url: https://jasonwoof.com/gitweb/?a=blobdiff_plain;f=_source%2Fplugins%2Fautogrow%2Fplugin.js;h=253cb57732771655adf6782a77bf84875981d57e;hb=3fe9cac293e090ea459a3ee10d78cbe9e1dd0e03;hp=f31e9c692be9b64a3d2b15497be3f51ba306cd37;hpb=039a051ccf3901311661022a30afd60fc38130c9;p=ckeditor.git diff --git a/_source/plugins/autogrow/plugin.js b/_source/plugins/autogrow/plugin.js index f31e9c6..253cb57 100644 --- a/_source/plugins/autogrow/plugin.js +++ b/_source/plugins/autogrow/plugin.js @@ -1,5 +1,5 @@ /* -Copyright (c) 2003-2010, CKSource - Frederico Knabben. All rights reserved. +Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. For licensing, see LICENSE.html or http://ckeditor.com/license */ @@ -7,39 +7,74 @@ For licensing, see LICENSE.html or http://ckeditor.com/license * @file AutoGrow plugin */ (function(){ - var resizeEditor = function( editor ) + + // 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; + } + + function getScrollable( editor ) { var doc = editor.document, + body = doc.getBody(), + htmlElement = doc.getDocumentElement(); + + // Quirks mode overflows body, standards overflows document element + return doc.$.compatMode == 'BackCompat' ? body : htmlElement; + } + + var resizeEditor = function( editor ) + { + if ( !editor.window ) + return; + + var scrollable = getScrollable( editor ), currentHeight = editor.window.getViewPaneSize().height, - newHeight; + 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, mode:1 }; + editor.config.autoGrow_onStartup && ( eventsList[ 'instanceReady' ] = 1 ); + for ( var eventName in eventsList ) { editor.on( eventName, function( evt ) { @@ -49,38 +84,78 @@ 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 ); } }); } + + // Coordinate with the "maximize" plugin. (#9311) + editor.on( 'beforeCommandExec', function( evt ) + { + if ( evt.data.name == 'maximize' && evt.editor.mode == 'wysiwyg' ) + { + if ( evt.data.command.state == CKEDITOR.TRISTATE_OFF ) + { + var scrollable = getScrollable( editor ); + scrollable.removeStyle( 'overflow' ); + } + else + resizeEditor( editor ); + } + }); } }); })(); /** - * 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#autogrow + * @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 */