[239] | 1 | /*
|
---|
| 2 | Copyright (c) 2003-2011, CKSource - Frederico Knabben. All rights reserved.
|
---|
| 3 | For licensing, see LICENSE.html or http://ckeditor.com/license
|
---|
| 4 | */
|
---|
| 5 |
|
---|
| 6 | /**
|
---|
| 7 | * @file AutoGrow plugin
|
---|
| 8 | */
|
---|
| 9 | (function(){
|
---|
| 10 |
|
---|
| 11 | // Actual content height, figured out by appending check the last element's document position.
|
---|
| 12 | function contentHeight( scrollable )
|
---|
| 13 | {
|
---|
| 14 | var overflowY = scrollable.getStyle( 'overflow-y' );
|
---|
| 15 |
|
---|
| 16 | var doc = scrollable.getDocument();
|
---|
| 17 | // Create a temporary marker element.
|
---|
| 18 | var marker = CKEDITOR.dom.element.createFromHtml( '<span style="margin:0;padding:0;border:0;clear:both;width:1px;height:1px;display:block;">' + ( CKEDITOR.env.webkit ? ' ' : '' ) + '</span>', doc );
|
---|
| 19 | doc[ CKEDITOR.env.ie? 'getBody' : 'getDocumentElement']().append( marker );
|
---|
| 20 |
|
---|
| 21 | var height = marker.getDocumentPosition( doc ).y + marker.$.offsetHeight;
|
---|
| 22 | marker.remove();
|
---|
| 23 | scrollable.setStyle( 'overflow-y', overflowY );
|
---|
| 24 | return height;
|
---|
| 25 | }
|
---|
| 26 |
|
---|
| 27 | var resizeEditor = function( editor )
|
---|
| 28 | {
|
---|
| 29 | if ( !editor.window )
|
---|
| 30 | return;
|
---|
| 31 |
|
---|
| 32 | var doc = editor.document,
|
---|
| 33 | iframe = new CKEDITOR.dom.element( doc.getWindow().$.frameElement ),
|
---|
| 34 | body = doc.getBody(),
|
---|
| 35 | htmlElement = doc.getDocumentElement(),
|
---|
| 36 | currentHeight = editor.window.getViewPaneSize().height,
|
---|
| 37 | // Quirks mode overflows body, standards overflows document element
|
---|
| 38 | scrollable = doc.$.compatMode == 'BackCompat' ? body : htmlElement,
|
---|
| 39 | newHeight = contentHeight( scrollable );
|
---|
| 40 |
|
---|
| 41 | // Additional space specified by user.
|
---|
| 42 | newHeight += ( editor.config.autoGrow_bottomSpace || 0 );
|
---|
| 43 |
|
---|
| 44 | var min = editor.config.autoGrow_minHeight != undefined ? editor.config.autoGrow_minHeight : 200,
|
---|
| 45 | max = editor.config.autoGrow_maxHeight || Infinity;
|
---|
| 46 |
|
---|
| 47 | newHeight = Math.max( newHeight, min );
|
---|
| 48 | newHeight = Math.min( newHeight, max );
|
---|
| 49 |
|
---|
| 50 | if ( newHeight != currentHeight )
|
---|
| 51 | {
|
---|
| 52 | newHeight = editor.fire( 'autoGrow', { currentHeight : currentHeight, newHeight : newHeight } ).newHeight;
|
---|
| 53 | editor.resize( editor.container.getStyle( 'width' ), newHeight, true );
|
---|
| 54 | }
|
---|
| 55 |
|
---|
| 56 | if ( scrollable.$.scrollHeight > scrollable.$.clientHeight && newHeight < max )
|
---|
| 57 | scrollable.setStyle( 'overflow-y', 'hidden' );
|
---|
| 58 | else
|
---|
| 59 | scrollable.removeStyle( 'overflow-y' );
|
---|
| 60 |
|
---|
| 61 |
|
---|
| 62 | };
|
---|
| 63 |
|
---|
| 64 | CKEDITOR.plugins.add( 'autogrow',
|
---|
| 65 | {
|
---|
| 66 | init : function( editor )
|
---|
| 67 | {
|
---|
| 68 | editor.addCommand( 'autogrow', { exec : resizeEditor, modes : { wysiwyg:1 }, readOnly: 1, canUndo: false, editorFocus: false } );
|
---|
| 69 |
|
---|
| 70 | var eventsList = { contentDom:1, key:1, selectionChange:1, insertElement:1 };
|
---|
| 71 | editor.config.autoGrow_onStartup && ( eventsList[ 'instanceReady' ] = 1 );
|
---|
| 72 | for ( var eventName in eventsList )
|
---|
| 73 | {
|
---|
| 74 | editor.on( eventName, function( evt )
|
---|
| 75 | {
|
---|
| 76 | var maximize = editor.getCommand( 'maximize' );
|
---|
| 77 | // Some time is required for insertHtml, and it gives other events better performance as well.
|
---|
| 78 | if ( evt.editor.mode == 'wysiwyg' &&
|
---|
| 79 | // Disable autogrow when the editor is maximized .(#6339)
|
---|
| 80 | ( !maximize || maximize.state != CKEDITOR.TRISTATE_ON ) )
|
---|
| 81 | {
|
---|
| 82 | setTimeout( function()
|
---|
| 83 | {
|
---|
| 84 | resizeEditor( evt.editor );
|
---|
| 85 | // Second pass to make correction upon
|
---|
| 86 | // the first resize, e.g. scrollbar.
|
---|
| 87 | resizeEditor( evt.editor );
|
---|
| 88 | }, 100 );
|
---|
| 89 | }
|
---|
| 90 | });
|
---|
| 91 | }
|
---|
| 92 | }
|
---|
| 93 | });
|
---|
| 94 | })();
|
---|
| 95 | /**
|
---|
| 96 | * The minimum height that the editor can reach using the AutoGrow feature.
|
---|
| 97 | * @name CKEDITOR.config.autoGrow_minHeight
|
---|
| 98 | * @type Number
|
---|
| 99 | * @default <code>200</code>
|
---|
| 100 | * @since 3.4
|
---|
| 101 | * @example
|
---|
| 102 | * config.autoGrow_minHeight = 300;
|
---|
| 103 | */
|
---|
| 104 |
|
---|
| 105 | /**
|
---|
| 106 | * The maximum height that the editor can reach using the AutoGrow feature. Zero means unlimited.
|
---|
| 107 | * @name CKEDITOR.config.autoGrow_maxHeight
|
---|
| 108 | * @type Number
|
---|
| 109 | * @default <code>0</code>
|
---|
| 110 | * @since 3.4
|
---|
| 111 | * @example
|
---|
| 112 | * config.autoGrow_maxHeight = 400;
|
---|
| 113 | */
|
---|
| 114 |
|
---|
| 115 | /**
|
---|
| 116 | * Whether to have the auto grow happen on editor creation.
|
---|
| 117 | * @name CKEDITOR.config.autoGrow_onStartup
|
---|
| 118 | * @type Boolean
|
---|
| 119 | * @default false
|
---|
| 120 | * @since 3.6.2
|
---|
| 121 | * @example
|
---|
| 122 | * config.autoGrow_onStartup = true;
|
---|
| 123 | */
|
---|
| 124 |
|
---|
| 125 | /**
|
---|
| 126 | * Fired when the AutoGrow plugin is about to change the size of the editor.
|
---|
| 127 | * @name CKEDITOR.editor#autogrow
|
---|
| 128 | * @event
|
---|
| 129 | * @param {Number} data.currentHeight The current height of the editor (before resizing).
|
---|
| 130 | * @param {Number} data.newHeight The new height of the editor (after resizing). It can be changed
|
---|
| 131 | * to determine a different height value to be used instead.
|
---|
| 132 | */
|
---|
| 133 |
|
---|
| 134 |
|
---|
| 135 | /**
|
---|
| 136 | * Extra height in pixel to leave between the bottom boundary of content with document size when auto resizing.
|
---|
| 137 | * @name CKEDITOR.config.autoGrow_bottomSpace
|
---|
| 138 | * @type Number
|
---|
| 139 | * @default 0
|
---|
| 140 | * @since 3.6.2
|
---|
| 141 | */
|
---|