X-Git-Url: https://jasonwoof.com/gitweb/?a=blobdiff_plain;f=_source%2Fplugins%2Ffloatpanel%2Fplugin.js;h=5569e5eb98e83257af3a006a4ee669379fa8d634;hb=f0610347140239143439a511ee2bd48cb784f470;hp=8940192d46e197deaad9d2cd665b3444139e7086;hpb=039a051ccf3901311661022a30afd60fc38130c9;p=ckeditor.git diff --git a/_source/plugins/floatpanel/plugin.js b/_source/plugins/floatpanel/plugin.js index 8940192..5569e5e 100644 --- a/_source/plugins/floatpanel/plugin.js +++ b/_source/plugins/floatpanel/plugin.js @@ -1,5 +1,5 @@ /* -Copyright (c) 2003-2010, CKSource - Frederico Knabben. All rights reserved. +Copyright (c) 2003-2011, CKSource - Frederico Knabben. All rights reserved. For licensing, see LICENSE.html or http://ckeditor.com/license */ @@ -51,6 +51,7 @@ CKEDITOR.plugins.add( 'floatpanel', this._ = { + editor : editor, // The panel that will be floating. panel : panel, parentElement : parentElement, @@ -60,6 +61,8 @@ CKEDITOR.plugins.add( 'floatpanel', children : [], dir : editor.lang.dir }; + + editor.on( 'mode', function(){ this.hide(); }, this ); }, proto : @@ -100,6 +103,10 @@ CKEDITOR.plugins.add( 'floatpanel', this.allowBlur( false ); isShowing = 1; + // Record from where the focus is when open panel. + this._.returnFocus = this._.editor.focusManager.hasFocus ? this._.editor : new CKEDITOR.dom.element( CKEDITOR.document.$.activeElement ); + + var element = this.element, iframe = this._.iframe, definition = this._.definition, @@ -123,10 +130,11 @@ CKEDITOR.plugins.add( 'floatpanel', element.setStyles( { - top : 0, + top : top + 'px', left: 0, display : '' }); + // Don't use display or visibility style because we need to // calculate the rendering layout later and focus the element. element.setOpacity( 0 ); @@ -154,14 +162,17 @@ CKEDITOR.plugins.add( 'floatpanel', // the blur event may get fired even when focusing // inside the window itself, so we must ensure the // target is out of it. - var target; - if ( CKEDITOR.env.ie && !this.allowBlur() - || ( target = ev.data.getTarget() ) - && target.getName && target.getName() != 'iframe' ) + var target = ev.data.getTarget() ; + if ( target.getName && target.getName() != 'iframe' ) return; if ( this.visible && !this._.activeChild && !isShowing ) + { + // Panel close is caused by user's navigating away the focus, e.g. click outside the panel. + // DO NOT restore focus in this case. + delete this._.returnFocus; this.hide(); + } }, this ); @@ -210,7 +221,7 @@ CKEDITOR.plugins.add( 'floatpanel', // http://en.wikipedia.org/wiki/Internet_Explorer_box_model_bug // (#3426) if ( CKEDITOR.env.ie && CKEDITOR.env.quirks && width > 0 ) - width += ( target.$.offsetWidth || 0 ) - ( target.$.clientWidth || 0 ); + width += ( target.$.offsetWidth || 0 ) - ( target.$.clientWidth || 0 ) + 3; // A little extra at the end. // If not present, IE6 might break into the next line, but also it looks better this way width += 4 ; @@ -226,7 +237,7 @@ CKEDITOR.plugins.add( 'floatpanel', // http://en.wikipedia.org/wiki/Internet_Explorer_box_model_bug // (#3426) if ( CKEDITOR.env.ie && CKEDITOR.env.quirks && height > 0 ) - height += ( target.$.offsetHeight || 0 ) - ( target.$.clientHeight || 0 ); + height += ( target.$.offsetHeight || 0 ) - ( target.$.clientHeight || 0 ) + 3; target.setStyle( 'height', height + 'px' ); @@ -302,7 +313,7 @@ CKEDITOR.plugins.add( 'floatpanel', // We need this get fired manually because of unfired focus() function. this.allowBlur( true ); }, 0, this); - }, 0, this); + }, CKEDITOR.env.air ? 200 : 0, this); this.visible = 1; if ( this.onShow ) @@ -311,14 +322,27 @@ CKEDITOR.plugins.add( 'floatpanel', isShowing = 0; }, - hide : function() + hide : function( returnFocus ) { if ( this.visible && ( !this.onHide || this.onHide.call( this ) !== true ) ) { this.hideChild(); + // Blur previously focused element. (#6671) + CKEDITOR.env.gecko && this._.iframe.getFrameDocument().$.activeElement.blur(); this.element.setStyle( 'display', 'none' ); this.visible = 0; this.element.getFirst().removeCustomData( 'activePanel' ); + + // Return focus properly. (#6247) + var focusReturn = returnFocus !== false && this._.returnFocus; + if ( focusReturn ) + { + // Webkit requires focus moved out panel iframe first. + if ( CKEDITOR.env.webkit && focusReturn.type ) + focusReturn.getWindow().$.focus(); + + focusReturn.focus(); + } } }, @@ -374,6 +398,8 @@ CKEDITOR.plugins.add( 'floatpanel', if ( activeChild ) { delete activeChild.onHide; + // Sub panels don't manage focus. (#7881) + delete activeChild._.returnFocus; delete this._.activeChild; activeChild.hide(); }