X-Git-Url: https://scm.cri.ensmp.fr/git/ckeditor.git/blobdiff_plain/256592bf803e851aa7fc953e08a6e9e58d970f8c..871bad8291b6dbc29d489d95d185458caab25158:/skins/ckeditor/_source/plugins/iframedialog/plugin.js diff --git a/skins/ckeditor/_source/plugins/iframedialog/plugin.js b/skins/ckeditor/_source/plugins/iframedialog/plugin.js new file mode 100644 index 0000000..870ec1c --- /dev/null +++ b/skins/ckeditor/_source/plugins/iframedialog/plugin.js @@ -0,0 +1,188 @@ +/* +Copyright (c) 2003-2011, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.html or http://ckeditor.com/license +*/ + +/** + * @fileOverview Plugin for making iframe based dialogs. + */ + +CKEDITOR.plugins.add( 'iframedialog', +{ + requires : [ 'dialog' ], + onLoad : function() + { + /** + * An iframe base dialog. + * @param {String} name Name of the dialog + * @param {String} title Title of the dialog + * @param {Number} minWidth Minimum width of the dialog + * @param {Number} minHeight Minimum height of the dialog + * @param {Function} [onContentLoad] Function called when the iframe has been loaded. + * If it isn't specified, the inner frame is notified of the dialog events ('load', + * 'resize', 'ok' and 'cancel') on a function called 'onDialogEvent' + * @param {Object} [userDefinition] Additional properties for the dialog definition + * @example + */ + CKEDITOR.dialog.addIframe = function( name, title, src, minWidth, minHeight, onContentLoad, userDefinition ) + { + var element = + { + type : 'iframe', + src : src, + width : '100%', + height : '100%' + }; + + if ( typeof( onContentLoad ) == 'function' ) + element.onContentLoad = onContentLoad; + else + element.onContentLoad = function() + { + var element = this.getElement(), + childWindow = element.$.contentWindow; + + // If the inner frame has defined a "onDialogEvent" function, setup listeners + if ( childWindow.onDialogEvent ) + { + var dialog = this.getDialog(), + notifyEvent = function(e) + { + return childWindow.onDialogEvent(e); + }; + + dialog.on( 'ok', notifyEvent ); + dialog.on( 'cancel', notifyEvent ); + dialog.on( 'resize', notifyEvent ); + + // Clear listeners + dialog.on( 'hide', function(e) + { + dialog.removeListener( 'ok', notifyEvent ); + dialog.removeListener( 'cancel', notifyEvent ); + dialog.removeListener( 'resize', notifyEvent ); + + e.removeListener(); + } ); + + // Notify child iframe of load: + childWindow.onDialogEvent( { + name : 'load', + sender : this, + editor : dialog._.editor + } ); + } + }; + + var definition = + { + title : title, + minWidth : minWidth, + minHeight : minHeight, + contents : + [ + { + id : 'iframe', + label : title, + expand : true, + elements : [ element ] + } + ] + }; + + for ( var i in userDefinition ) + definition[i] = userDefinition[i]; + + this.add( name, function(){ return definition; } ); + }; + + (function() + { + /** + * An iframe element. + * @extends CKEDITOR.ui.dialog.uiElement + * @example + * @constructor + * @param {CKEDITOR.dialog} dialog + * Parent dialog object. + * @param {CKEDITOR.dialog.definition.uiElement} elementDefinition + * The element definition. Accepted fields: + * + * @param {Array} htmlList + * List of HTML code to output to. + */ + var iframeElement = function( dialog, elementDefinition, htmlList ) + { + if ( arguments.length < 3 ) + return; + + var _ = ( this._ || ( this._ = {} ) ), + contentLoad = elementDefinition.onContentLoad && CKEDITOR.tools.bind( elementDefinition.onContentLoad, this ), + cssWidth = CKEDITOR.tools.cssLength( elementDefinition.width ), + cssHeight = CKEDITOR.tools.cssLength( elementDefinition.height ); + _.frameId = CKEDITOR.tools.getNextId() + '_iframe'; + + // IE BUG: Parent container does not resize to contain the iframe automatically. + dialog.on( 'load', function() + { + var iframe = CKEDITOR.document.getById( _.frameId ), + parentContainer = iframe.getParent(); + + parentContainer.setStyles( + { + width : cssWidth, + height : cssHeight + } ); + } ); + + var attributes = + { + src : '%2', + id : _.frameId, + frameborder : 0, + allowtransparency : true + }; + var myHtml = []; + + if ( typeof( elementDefinition.onContentLoad ) == 'function' ) + attributes.onload = 'CKEDITOR.tools.callFunction(%1);'; + + CKEDITOR.ui.dialog.uiElement.call( this, dialog, elementDefinition, myHtml, 'iframe', + { + width : cssWidth, + height : cssHeight + }, attributes, '' ); + + // Put a placeholder for the first time. + htmlList.push( '
' ); + + // Iframe elements should be refreshed whenever it is shown. + myHtml = myHtml.join( '' ); + dialog.on( 'show', function() + { + var iframe = CKEDITOR.document.getById( _.frameId ), + parentContainer = iframe.getParent(), + callIndex = CKEDITOR.tools.addFunction( contentLoad ), + html = myHtml.replace( '%1', callIndex ).replace( '%2', CKEDITOR.tools.htmlEncode( elementDefinition.src ) ); + parentContainer.setHtml( html ); + } ); + }; + + iframeElement.prototype = new CKEDITOR.ui.dialog.uiElement; + + CKEDITOR.dialog.addUIElement( 'iframe', + { + build : function( dialog, elementDefinition, output ) + { + return new iframeElement( dialog, elementDefinition, output ); + } + } ); + })(); + } +} );