Ticket #5618: 5618_2.patch

File 5618_2.patch, 5.8 KB (added by Garry Yao, 8 years ago)
  • _source/core/tools.js

     
    691691                                catch (e) {}
    692692                        }
    693693                        return returnValue;
     694                },
     695
     696                /**
     697                 * Generate a combined key from a series of params.
     698                 * @param {String} subKey One or more string used as sub keys.
     699                 * @example
     700                 * var key = CKEDITOR.tools.genKey( 'key1', 'key2', 'key3' );
     701                 * alert( key );                // "key1-key2-key3".
     702                 */
     703                genKey : function()
     704                {
     705                        return Array.prototype.slice.call( arguments ).join( '-' );
    694706                }
    695707        };
    696708})();
  • _source/plugins/dialog/plugin.js

     
    545545        {
    546546                destroy : function()
    547547                {
     548                        this.hide();
    548549                        this._.element.remove();
    549550                },
    550551
     
    698699                        {
    699700                                CKEDITOR.dialog._.currentTop = this;
    700701                                this._.parentDialog = null;
    701                                 addCover( this._.editor );
     702                                showCover( this._.editor );
    702703
    703704                                element.on( 'keydown', accessKeyDownHandler );
    704705                                element.on( CKEDITOR.env.opera ? 'keypress' : 'keyup', accessKeyUpHandler );
     
    802803                 */
    803804                hide : function()
    804805                {
     806                        if ( !this.parts.dialog.isVisible() )
     807                                return;
     808
    805809                        this.fire( 'hide', {} );
    806810                        this._.editor.fire( 'dialogHide', this );
    807811                        var element = this._.element;
     
    810814                        // Unregister all access keys associated with this dialog.
    811815                        unregisterAccessKey( this );
    812816
     817                        // Close any child(top) dialogs first.
     818                        while( CKEDITOR.dialog._.currentTop != this )
     819                                CKEDITOR.dialog._.currentTop.hide();
     820
    813821                        // Maintain dialog ordering and remove cover if needed.
    814822                        if ( !this._.parentDialog )
    815                                 removeCover();
     823                                hideCover();
    816824                        else
    817825                        {
    818826                                var parentElement = this._.parentDialog.getElement().getFirst();
     
    845853                        else
    846854                                CKEDITOR.dialog._.currentZIndex -= 10;
    847855
    848 
     856                        delete this._.parentDialog;
    849857                        // Reset the initial values of the dialog.
    850858                        this.foreach( function( contentObj ) { contentObj.resetInitValue && contentObj.resetInitValue(); } );
    851859                },
     
    17491757        }
    17501758
    17511759        var resizeCover;
    1752         var coverElement;
     1760        // Caching resuable covers and allowing only one cover
     1761        // on screen.
     1762        var covers = {},
     1763                currentCover;
    17531764
    1754         var addCover = function( editor )
     1765        function showCover( editor )
    17551766        {
    17561767                var win = CKEDITOR.document.getWindow();
     1768                var backgroundColorStyle = editor.config.dialog_backgroundCoverColor || 'white',
     1769                        backgroundCoverOpacity = editor.config.dialog_backgroundCoverOpacity,
     1770                        baseFloatZIndex = editor.config.baseFloatZIndex,
     1771                        coverKey = CKEDITOR.tools.genKey(
     1772                                        backgroundColorStyle,
     1773                                        backgroundCoverOpacity,
     1774                                        baseFloatZIndex ),
     1775                        coverElement = covers[ coverKey ];
    17571776
    17581777                if ( !coverElement )
    17591778                {
    1760                         var backgroundColorStyle = editor.config.dialog_backgroundCoverColor || 'white';
    1761 
    17621779                        var html = [
    17631780                                        '<div style="position: ', ( CKEDITOR.env.ie6Compat ? 'absolute' : 'fixed' ),
    1764                                         '; z-index: ', editor.config.baseFloatZIndex,
     1781                                        '; z-index: ', baseFloatZIndex,
    17651782                                        '; top: 0px; left: 0px; ',
    17661783                                        ( !CKEDITOR.env.ie6Compat ? 'background-color: ' + backgroundColorStyle : '' ),
    1767                                         '" id="cke_dialog_background_cover">'
     1784                                        '" class="cke_dialog_background_cover">'
    17681785                                ];
    17691786
    1770 
    17711787                        if ( CKEDITOR.env.ie6Compat )
    17721788                        {
    17731789                                // Support for custom document.domain in IE.
     
    18031819                        html.push( '</div>' );
    18041820
    18051821                        coverElement = CKEDITOR.dom.element.createFromHtml( html.join( '' ) );
     1822                        coverElement.setOpacity( backgroundCoverOpacity != undefined ? backgroundCoverOpacity : 0.5 );
     1823
     1824                        coverElement.appendTo( CKEDITOR.document.getBody() );
     1825                        covers[ coverKey ] = coverElement;
    18061826                }
     1827                else
     1828                        coverElement.   show();
    18071829
    1808                 var element = coverElement;
    1809 
     1830                currentCover = coverElement;
    18101831                var resizeFunc = function()
    18111832                {
    18121833                        var size = win.getViewPaneSize();
    1813                         element.setStyles(
     1834                        coverElement.setStyles(
    18141835                                {
    18151836                                        width : size.width + 'px',
    18161837                                        height : size.height + 'px'
     
    18211842                {
    18221843                        var pos = win.getScrollPosition(),
    18231844                                cursor = CKEDITOR.dialog._.currentTop;
    1824                         element.setStyles(
     1845                        coverElement.setStyles(
    18251846                                        {
    18261847                                                left : pos.x + 'px',
    18271848                                                top : pos.y + 'px'
     
    18531874                                }, 0 );
    18541875                        scrollFunc();
    18551876                }
    1856 
    1857                 var opacity = editor.config.dialog_backgroundCoverOpacity;
    1858                 element.setOpacity( typeof opacity != 'undefined' ? opacity : 0.5 );
    1859 
    1860                 element.appendTo( CKEDITOR.document.getBody() );
    18611877        };
    18621878
    1863         var removeCover = function()
     1879        function hideCover()
    18641880        {
    1865                 if ( !coverElement )
     1881                if ( !currentCover )
    18661882                        return;
    18671883
    18681884                var win = CKEDITOR.document.getWindow();
    1869                 coverElement.remove();
     1885                currentCover.hide();
    18701886                win.removeListener( 'resize', resizeCover );
    18711887
    18721888                if ( CKEDITOR.env.ie6Compat )
     
    18791895                }
    18801896                resizeCover = null;
    18811897        };
    1882 
     1898       
     1899        function removeCovers()
     1900        {
     1901                for ( var coverId in covers )
     1902                        covers[ coverId ].remove();
     1903                covers = {};
     1904        }
     1905
    18831906        var accessKeyProcessors = {};
    18841907
    18851908        var accessKeyDownHandler = function( evt )
     
    27812804
    27822805        CKEDITOR.on( 'instanceDestroyed', function( evt )
    27832806        {
     2807                // Remove dialog cover on last instance destroy.
     2808                if ( CKEDITOR.tools.isEmpty( CKEDITOR.instances ) )
     2809                {
     2810                        var currentTopDialog;
     2811                        while ( currentTopDialog = CKEDITOR.dialog._.currentTop )
     2812                                currentTopDialog.hide();
     2813                        removeCovers();
     2814                }
     2815
    27842816                var dialogs = evt.editor._.storedDialogs;
    27852817                for ( var name in dialogs )
    27862818                        dialogs[ name ].destroy();
    27872819
    2788                 // Remove dialog cover on last instance destroy.
    2789                 if ( CKEDITOR.tools.isEmpty( CKEDITOR.instances ) && coverElement )
    2790                         coverElement.remove();
    27912820        });
    27922821
    27932822        })();
© 2003 – 2017 CKSource – Frederico Knabben. All rights reserved. | Terms of use | Privacy policy