fckpanel.js

来自「国外很不错的一个开源OA系统Group-Office」· JavaScript 代码 · 共 303 行

JS
303
字号
/* * FCKeditor - The text editor for Internet - http://www.fckeditor.net * Copyright (C) 2003-2007 Frederico Caldeira Knabben * * == BEGIN LICENSE == * * Licensed under the terms of any of the following licenses at your * choice: * *  - GNU General Public License Version 2 or later (the "GPL") *    http://www.gnu.org/licenses/gpl.html * *  - GNU Lesser General Public License Version 2.1 or later (the "LGPL") *    http://www.gnu.org/licenses/lgpl.html * *  - Mozilla Public License Version 1.1 or later (the "MPL") *    http://www.mozilla.org/MPL/MPL-1.1.html * * == END LICENSE == * * Component that creates floating panels. It is used by many * other components, like the toolbar items, context menu, etc... */var FCKPanel = function( parentWindow ){	this.IsRTL			= ( FCKLang.Dir == 'rtl' ) ;	this.IsContextMenu	= false ;	this._LockCounter	= 0 ;	this._Window = parentWindow || window ;	var oDocument ;	if ( FCKBrowserInfo.IsIE )	{		// Create the Popup that will hold the panel.		this._Popup	= this._Window.createPopup() ;		oDocument = this.Document = this._Popup.document ;		FCK.IECleanup.AddItem( this, FCKPanel_Cleanup ) ;	}	else	{		var oIFrame = this._IFrame = this._Window.document.createElement('iframe') ;		oIFrame.src					= 'javascript:void(0)' ;		oIFrame.allowTransparency	= true ;		oIFrame.frameBorder			= '0' ;		oIFrame.scrolling			= 'no' ;		oIFrame.style.position		= 'absolute';		oIFrame.style.zIndex		= FCKConfig.FloatingPanelsZIndex ;		oIFrame.width = oIFrame.height = 0 ;		if ( this._Window == window.parent && window.frameElement )			window.frameElement.parentNode.insertBefore( oIFrame, window.frameElement ) ;		else			this._Window.document.body.appendChild( oIFrame ) ;		var oIFrameWindow = oIFrame.contentWindow ;		oDocument = this.Document = oIFrameWindow.document ;		// Initialize the IFRAME document body.		oDocument.open() ;		oDocument.write( '<html><head></head><body style="margin:0px;padding:0px;"><\/body><\/html>' ) ;		oDocument.close() ;		FCKTools.AddEventListenerEx( oIFrameWindow, 'focus', FCKPanel_Window_OnFocus, this ) ;		FCKTools.AddEventListenerEx( oIFrameWindow, 'blur', FCKPanel_Window_OnBlur, this ) ;	}	oDocument.dir = FCKLang.Dir ;	oDocument.oncontextmenu = FCKTools.CancelEvent ;	// Create the main DIV that is used as the panel base.	this.MainNode = oDocument.body.appendChild( oDocument.createElement('DIV') ) ;	// The "float" property must be set so Firefox calculates the size correcly.	this.MainNode.style.cssFloat = this.IsRTL ? 'right' : 'left' ;}FCKPanel.prototype.AppendStyleSheet = function( styleSheet ){	FCKTools.AppendStyleSheet( this.Document, styleSheet ) ;}FCKPanel.prototype.Preload = function( x, y, relElement ){	// The offsetWidth and offsetHeight properties are not available if the	// element is not visible. So we must "show" the popup with no size to	// be able to use that values in the second call (IE only).	if ( this._Popup )		this._Popup.show( x, y, 0, 0, relElement ) ;}FCKPanel.prototype.Show = function( x, y, relElement, width, height ){	var iMainWidth ;	if ( this._Popup )	{		// The offsetWidth and offsetHeight properties are not available if the		// element is not visible. So we must "show" the popup with no size to		// be able to use that values in the second call.		this._Popup.show( x, y, 0, 0, relElement ) ;		// The following lines must be place after the above "show", otherwise it		// doesn't has the desired effect.		this.MainNode.style.width	= width ? width + 'px' : '' ;		this.MainNode.style.height	= height ? height + 'px' : '' ;		iMainWidth = this.MainNode.offsetWidth ;		if ( this.IsRTL )		{			if ( this.IsContextMenu )				x  = x - iMainWidth + 1 ;			else if ( relElement )				x  = ( x * -1 ) + relElement.offsetWidth - iMainWidth ;		}		// Second call: Show the Popup at the specified location, with the correct size.		this._Popup.show( x, y, iMainWidth, this.MainNode.offsetHeight, relElement ) ;		if ( this.OnHide )		{			if ( this._Timer )				CheckPopupOnHide.call( this, true ) ;			this._Timer = FCKTools.SetInterval( CheckPopupOnHide, 100, this ) ;		}	}	else	{		// Do not fire OnBlur while the panel is opened.		if ( typeof( FCKFocusManager ) != 'undefined' )			FCKFocusManager.Lock() ;		if ( this.ParentPanel )			this.ParentPanel.Lock() ;		this.MainNode.style.width	= width ? width + 'px' : '' ;		this.MainNode.style.height	= height ? height + 'px' : '' ;		iMainWidth = this.MainNode.offsetWidth ;		if ( !width )	this._IFrame.width	= 1 ;		if ( !height )	this._IFrame.height	= 1 ;		// This is weird... but with Firefox, we must get the offsetWidth before		// setting the _IFrame size (which returns "0"), and then after that,		// to return the correct width. Remove the first step and it will not		// work when the editor is in RTL.		iMainWidth = this.MainNode.offsetWidth ;		var oPos = FCKTools.GetElementPosition(			relElement.nodeType == 9 ?				( FCKTools.IsStrictMode( relElement ) ? relElement.documentElement : relElement.body ) :				relElement,			this._Window ) ;		if ( this.IsRTL && !this.IsContextMenu )			x = ( x * -1 ) ;		x += oPos.X ;		y += oPos.Y ;		if ( this.IsRTL )		{			if ( this.IsContextMenu )				x  = x - iMainWidth + 1 ;			else if ( relElement )				x  = x + relElement.offsetWidth - iMainWidth ;		}		else		{			var oViewPaneSize = FCKTools.GetViewPaneSize( this._Window ) ;			var oScrollPosition = FCKTools.GetScrollPosition( this._Window ) ;			var iViewPaneHeight	= oViewPaneSize.Height + oScrollPosition.Y ;			var iViewPaneWidth	= oViewPaneSize.Width + oScrollPosition.X ;			if ( ( x + iMainWidth ) > iViewPaneWidth )				x -= x + iMainWidth - iViewPaneWidth ;			if ( ( y + this.MainNode.offsetHeight ) > iViewPaneHeight )				y -= y + this.MainNode.offsetHeight - iViewPaneHeight ;		}		if ( x < 0 )			 x = 0 ;		// Set the context menu DIV in the specified location.		this._IFrame.style.left	= x + 'px' ;		this._IFrame.style.top	= y + 'px' ;		var iWidth	= iMainWidth ;		var iHeight	= this.MainNode.offsetHeight ;		this._IFrame.width	= iWidth ;		this._IFrame.height = iHeight ;		// Move the focus to the IFRAME so we catch the "onblur".		this._IFrame.contentWindow.focus() ;	}	this._IsOpened = true ;	FCKTools.RunFunction( this.OnShow, this ) ;}FCKPanel.prototype.Hide = function( ignoreOnHide ){	if ( this._Popup )		this._Popup.hide() ;	else	{		if ( !this._IsOpened )			return ;		// Enable the editor to fire the "OnBlur".		if ( typeof( FCKFocusManager ) != 'undefined' )			FCKFocusManager.Unlock() ;		// It is better to set the sizes to 0, otherwise Firefox would have		// rendering problems.		this._IFrame.width = this._IFrame.height = 0 ;		this._IsOpened = false ;		if ( this.ParentPanel )			this.ParentPanel.Unlock() ;		if ( !ignoreOnHide )			FCKTools.RunFunction( this.OnHide, this ) ;	}}FCKPanel.prototype.CheckIsOpened = function(){	if ( this._Popup )		return this._Popup.isOpen ;	else		return this._IsOpened ;}FCKPanel.prototype.CreateChildPanel = function(){	var oWindow = this._Popup ? FCKTools.GetDocumentWindow( this.Document ) : this._Window ;	var oChildPanel = new FCKPanel( oWindow, true ) ;	oChildPanel.ParentPanel = this ;	return oChildPanel ;}FCKPanel.prototype.Lock = function(){	this._LockCounter++ ;}FCKPanel.prototype.Unlock = function(){	if ( --this._LockCounter == 0 && !this.HasFocus )		this.Hide() ;}/* Events */function FCKPanel_Window_OnFocus( e, panel ){	panel.HasFocus = true ;}function FCKPanel_Window_OnBlur( e, panel ){	panel.HasFocus = false ;	if ( panel._LockCounter == 0 )		FCKTools.RunFunction( panel.Hide, panel ) ;}function CheckPopupOnHide( forceHide ){	if ( forceHide || !this._Popup.isOpen )	{		window.clearInterval( this._Timer ) ;		this._Timer = null ;		FCKTools.RunFunction( this.OnHide, this ) ;	}}function FCKPanel_Cleanup(){	this._Popup = null ;	this._Window = null ;	this.Document = null ;	this.MainNode = null ;}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?