Ticket #3026: 3026_2.patch

File 3026_2.patch, 7.6 KB (added by Martin Kou, 12 years ago)
  • _source/plugins/iframedialog/plugin.js

     
     1/*
     2Copyright (c) 2003-2009, CKSource - Frederico Knabben. All rights reserved.
     3For licensing, see LICENSE.html or http://ckeditor.com/license
     4*/
     5
     6/**
     7 * @fileOverview Plugin for making iframe based dialogs.
     8 */
     9
     10CKEDITOR.plugins.add( 'iframedialog',
     11{
     12        requires : [ 'dialog' ],
     13        onLoad : function()
     14        {
     15                CKEDITOR.dialog.addIframe = function( name, title, src, width, height, onContentLoad )
     16                {
     17                        var element =
     18                        {
     19                                type : 'iframe',
     20                                src : src,
     21                                width : '100%',
     22                                height : '100%'
     23                        }
     24                        if ( typeof( onContentLoad ) == 'function' )
     25                                element.onContentLoad = onContentLoad;
     26
     27                        var definition =
     28                        {
     29                                title : title,
     30                                minWidth : width,
     31                                minHeight : height,
     32                                contents :
     33                                [
     34                                        {
     35                                                id : 'iframe',
     36                                                label : title,
     37                                                expand : true,
     38                                                elements : [ element ]
     39                                        }
     40                                ]
     41                        };
     42
     43                        return this.add( name, function(){ return definition; } );
     44                };
     45
     46                (function()
     47                {
     48                        /**
     49                         * An iframe element.
     50                         * @extends CKEDITOR.ui.dialog.uiElement
     51                         * @example
     52                         * @constructor
     53                         * @param {CKEDITOR.dialog} dialog
     54                         * Parent dialog object.
     55                         * @param {CKEDITOR.dialog.uiElementDefinition} elementDefinition
     56                         * The element definition. Accepted fields:
     57                         * <ul>
     58                         *      <li><strong>src</strong> (Required) The src field of the iframe. </li>
     59                         *      <li><strong>width</strong> (Required) The iframe's width.</li>
     60                         *      <li><strong>height</strong> (Required) The iframe's height.</li>
     61                         *      <li><strong>onContentLoad</strong> (Optional) A function to be executed
     62                         *      after the iframe's contents has finished loading.</li>
     63                         * </ul>
     64                         * @param {Array} htmlList
     65                         * List of HTML code to output to.
     66                         */
     67                        var iframeElement = function( dialog, elementDefinition, htmlList )
     68                        {
     69                                if ( arguments.length < 3 )
     70                                        return;
     71
     72                                var _ = ( this._ || ( this._ = {} ) ),
     73                                        contentLoad = elementDefinition.onContentLoad && CKEDITOR.tools.bind( elementDefinition.onContentLoad, this ),
     74                                        cssWidth = CKEDITOR.tools.cssLength( elementDefinition.width ),
     75                                        cssHeight = CKEDITOR.tools.cssLength( elementDefinition.height );
     76                                _.frameId = CKEDITOR.tools.getNextNumber() + '_iframe';
     77
     78                                // IE BUG: Parent container does not resize to contain the iframe automatically.
     79                                dialog.on( 'load', function()
     80                                        {
     81                                                var iframe = CKEDITOR.document.getById( _.frameId ),
     82                                                        parentContainer = iframe.getParent();
     83
     84                                                parentContainer.setStyles(
     85                                                        {
     86                                                                width : cssWidth,
     87                                                                height : cssHeight
     88                                                        } );
     89                                        } );
     90
     91                                var attributes =
     92                                {
     93                                        src : '%2',
     94                                        id : _.frameId,
     95                                        frameborder : 0,
     96                                        allowtransparency : true
     97                                };
     98                                var myHtml = [];
     99
     100                                if ( typeof( elementDefinition.onContentLoad ) == 'function' )
     101                                        attributes.onload = 'CKEDITOR.tools.callFunction(%1);';
     102
     103                                CKEDITOR.ui.dialog.uiElement.call( this, dialog, elementDefinition, myHtml, 'iframe',
     104                                                {
     105                                                        width : cssWidth,
     106                                                        height : cssHeight
     107                                                }, attributes, '' );
     108
     109                                // Put a placeholder for the first time.
     110                                htmlList.push( '<div style="width:' + cssWidth + ';height:' + cssHeight + ';" id="' + this.domId + '"></div>' );
     111
     112                                // Iframe elements should be refreshed whenever it is shown.
     113                                myHtml = myHtml.join( '' );
     114                                dialog.on( 'show', function()
     115                                        {
     116                                                var iframe = CKEDITOR.document.getById( _.frameId ),
     117                                                        parentContainer = iframe.getParent(),
     118                                                        callIndex = CKEDITOR.tools.addFunction( contentLoad ),
     119                                                        html = myHtml.replace( '%1', callIndex ).replace( '%2', CKEDITOR.tools.htmlEncode( elementDefinition.src ) );
     120                                                parentContainer.setHtml( html );
     121                                        } );
     122                        };
     123
     124                        iframeElement.prototype = new CKEDITOR.ui.dialog.uiElement;
     125
     126                        CKEDITOR.dialog.addUIElement( 'iframe',
     127                                {
     128                                        build : function( dialog, elementDefinition, output )
     129                                        {
     130                                                return new iframeElement( dialog, elementDefinition, output );
     131                                        }
     132                                } );
     133                })();
     134        }
     135} );
  • _source/plugins/dialog/plugin.js

     
    16201620
    16211621        (function()
    16221622        {
    1623                 var decimalRegex = /^\d+(?:\.\d+)?$/,
    1624                         fixLength = function( length )
    1625                         {
    1626                                 return length + ( decimalRegex.test( length ) ? 'px' : '' );
    1627                         };
    1628 
    16291623                CKEDITOR.ui.dialog =
    16301624                {
    16311625                        /**
     
    18071801                                                if ( widths )
    18081802                                                {
    18091803                                                        if ( widths[i] )
    1810                                                                 styles.push( 'width:' + fixLength( widths[i] ) );
     1804                                                                styles.push( 'width:' + CKEDITOR.tools.cssLength( widths[i] ) );
    18111805                                                }
    18121806                                                else
    18131807                                                        styles.push( 'width:' + Math.floor( 100 / childHtmlList.length ) + '%' );
    18141808                                                if ( height )
    1815                                                         styles.push( 'height:' + fixLength( height ) );
     1809                                                        styles.push( 'height:' + CKEDITOR.tools.cssLength( height ) );
    18161810                                                if ( elementDefinition && elementDefinition.padding != undefined )
    1817                                                         styles.push( 'padding:' + fixLength( elementDefinition.padding ) );
     1811                                                        styles.push( 'padding:' + CKEDITOR.tools.cssLength( elementDefinition.padding ) );
    18181812                                                if ( styles.length > 0 )
    18191813                                                        html.push( 'style="' + styles.join('; ') + '" ' );
    18201814                                                html.push( '>', childHtmlList[i], '</td>' );
     
    18731867                                        html.push( 'style="' );
    18741868                                        if ( elementDefinition && elementDefinition.expand )
    18751869                                                html.push( 'height:100%;' );
    1876                                         html.push( 'width:' + fixLength( width || '100%' ), ';' );
     1870                                        html.push( 'width:' + CKEDITOR.tools.cssLength( width || '100%' ), ';' );
    18771871                                        html.push( '"' );
    18781872                                        html.push( 'align="', CKEDITOR.tools.htmlEncode(
    18791873                                                ( elementDefinition && elementDefinition.align ) || ( dialog.getParentEditor().lang.dir == 'ltr' ? 'left' : 'right' ) ), '" ' );
     
    18841878                                                var styles = [];
    18851879                                                html.push( '<tr><td ' );
    18861880                                                if ( width )
    1887                                                         styles.push( 'width:' + fixLength( width || '100%' ) );
     1881                                                        styles.push( 'width:' + CKEDITOR.tools.cssLength( width || '100%' ) );
    18881882                                                if ( heights )
    1889                                                         styles.push( 'height:' + fixLength( heights[i] ) );
     1883                                                        styles.push( 'height:' + CKEDITOR.tools.cssLength( heights[i] ) );
    18901884                                                else if ( elementDefinition && elementDefinition.expand )
    18911885                                                        styles.push( 'height:' + Math.floor( 100 / childHtmlList.length ) + '%' );
    18921886                                                if ( elementDefinition && elementDefinition.padding != undefined )
    1893                                                         styles.push( 'padding:' + fixLength( elementDefinition.padding ) );
     1887                                                        styles.push( 'padding:' + CKEDITOR.tools.cssLength( elementDefinition.padding ) );
    18941888                                                if ( styles.length > 0 )
    18951889                                                        html.push( 'style="', styles.join( '; ' ), '" ' );
    18961890                                                html.push( ' class="cke_dialog_ui_vbox_child">', childHtmlList[i], '</td></tr>' );
  • _source/core/tools.js

     
    451451                {
    452452                        var fn = functions[ index ];
    453453                        return fn.apply( window, Array.prototype.slice.call( arguments, 1 ) );
    454                 }
     454                },
     455
     456                cssLength : (function()
     457                {
     458                        var decimalRegex = /^\d+(?:\.\d+)?$/;
     459                        return function( length )
     460                        {
     461                                return length + ( decimalRegex.test( length ) ? 'px' : '' );
     462                        };
     463                })()
    455464        };
    456465})();
    457466
© 2003 – 2020 CKSource – Frederico Knabben. All rights reserved. | Terms of use | Privacy policy