214 lines
6.9 KiB
JavaScript
214 lines
6.9 KiB
JavaScript
/*
|
|
* FCKeditor - The text editor for Internet - http://www.fckeditor.net
|
|
* Copyright (C) 2003-2009 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 ==
|
|
*
|
|
* Stretch the editor to full window size and back.
|
|
*/
|
|
|
|
var FCKFitWindow = function()
|
|
{
|
|
this.Name = 'FitWindow' ;
|
|
}
|
|
|
|
FCKFitWindow.prototype.Execute = function()
|
|
{
|
|
var eEditorFrame = window.frameElement ;
|
|
var eEditorFrameStyle = eEditorFrame.style ;
|
|
|
|
var eMainWindow = parent ;
|
|
var eDocEl = eMainWindow.document.documentElement ;
|
|
var eBody = eMainWindow.document.body ;
|
|
var eBodyStyle = eBody.style ;
|
|
var eParent ;
|
|
|
|
// Save the current selection and scroll position.
|
|
var oRange, oEditorScrollPos ;
|
|
if ( FCK.EditMode == FCK_EDITMODE_WYSIWYG )
|
|
{
|
|
oRange = new FCKDomRange( FCK.EditorWindow ) ;
|
|
oRange.MoveToSelection() ;
|
|
oEditorScrollPos = FCKTools.GetScrollPosition( FCK.EditorWindow ) ;
|
|
}
|
|
else
|
|
{
|
|
var eTextarea = FCK.EditingArea.Textarea ;
|
|
oRange = !FCKBrowserInfo.IsIE && [ eTextarea.selectionStart, eTextarea.selectionEnd ] ;
|
|
oEditorScrollPos = [ eTextarea.scrollLeft, eTextarea.scrollTop ] ;
|
|
}
|
|
|
|
// No original style properties known? Go fullscreen.
|
|
if ( !this.IsMaximized )
|
|
{
|
|
// Registering an event handler when the window gets resized.
|
|
if( FCKBrowserInfo.IsIE )
|
|
eMainWindow.attachEvent( 'onresize', FCKFitWindow_Resize ) ;
|
|
else
|
|
eMainWindow.addEventListener( 'resize', FCKFitWindow_Resize, true ) ;
|
|
|
|
// Save the scrollbars position.
|
|
this._ScrollPos = FCKTools.GetScrollPosition( eMainWindow ) ;
|
|
|
|
// Save and reset the styles for the entire node tree. They could interfere in the result.
|
|
eParent = eEditorFrame ;
|
|
// The extra () is to avoid a warning with strict error checking. This is ok.
|
|
while( (eParent = eParent.parentNode) )
|
|
{
|
|
if ( eParent.nodeType == 1 )
|
|
{
|
|
eParent._fckSavedStyles = FCKTools.SaveStyles( eParent ) ;
|
|
eParent.style.zIndex = FCKConfig.FloatingPanelsZIndex - 1 ;
|
|
}
|
|
}
|
|
|
|
// Hide IE scrollbars (in strict mode).
|
|
if ( FCKBrowserInfo.IsIE )
|
|
{
|
|
this.documentElementOverflow = eDocEl.style.overflow ;
|
|
eDocEl.style.overflow = 'hidden' ;
|
|
eBodyStyle.overflow = 'hidden' ;
|
|
}
|
|
else
|
|
{
|
|
// Hide the scroolbars in Firefox.
|
|
eBodyStyle.overflow = 'hidden' ;
|
|
eBodyStyle.width = '0px' ;
|
|
eBodyStyle.height = '0px' ;
|
|
}
|
|
|
|
// Save the IFRAME styles.
|
|
this._EditorFrameStyles = FCKTools.SaveStyles( eEditorFrame ) ;
|
|
|
|
// Resize.
|
|
var oViewPaneSize = FCKTools.GetViewPaneSize( eMainWindow ) ;
|
|
|
|
eEditorFrameStyle.position = "absolute";
|
|
eEditorFrame.offsetLeft ; // Kludge for Safari 3.1 browser bug, do not remove. See #2066.
|
|
eEditorFrameStyle.zIndex = FCKConfig.FloatingPanelsZIndex - 1;
|
|
eEditorFrameStyle.left = "0px";
|
|
eEditorFrameStyle.top = "0px";
|
|
eEditorFrameStyle.width = oViewPaneSize.Width + "px";
|
|
eEditorFrameStyle.height = oViewPaneSize.Height + "px";
|
|
|
|
// Giving the frame some (huge) borders on his right and bottom
|
|
// side to hide the background that would otherwise show when the
|
|
// editor is in fullsize mode and the window is increased in size
|
|
// not for IE, because IE immediately adapts the editor on resize,
|
|
// without showing any of the background oddly in firefox, the
|
|
// editor seems not to fill the whole frame, so just setting the
|
|
// background of it to white to cover the page laying behind it anyway.
|
|
if ( !FCKBrowserInfo.IsIE )
|
|
{
|
|
eEditorFrameStyle.borderRight = eEditorFrameStyle.borderBottom = "9999px solid white" ;
|
|
eEditorFrameStyle.backgroundColor = "white";
|
|
}
|
|
|
|
// Scroll to top left.
|
|
eMainWindow.scrollTo(0, 0);
|
|
|
|
// Is the editor still not on the top left? Let's find out and fix that as well. (Bug #174)
|
|
var editorPos = FCKTools.GetWindowPosition( eMainWindow, eEditorFrame ) ;
|
|
if ( editorPos.x != 0 )
|
|
eEditorFrameStyle.left = ( -1 * editorPos.x ) + "px" ;
|
|
if ( editorPos.y != 0 )
|
|
eEditorFrameStyle.top = ( -1 * editorPos.y ) + "px" ;
|
|
|
|
this.IsMaximized = true ;
|
|
}
|
|
else // Resize to original size.
|
|
{
|
|
// Remove the event handler of window resizing.
|
|
if( FCKBrowserInfo.IsIE )
|
|
eMainWindow.detachEvent( "onresize", FCKFitWindow_Resize ) ;
|
|
else
|
|
eMainWindow.removeEventListener( "resize", FCKFitWindow_Resize, true ) ;
|
|
|
|
// Restore the CSS position for the entire node tree.
|
|
eParent = eEditorFrame ;
|
|
// The extra () is to avoid a warning with strict error checking. This is ok.
|
|
while( (eParent = eParent.parentNode) )
|
|
{
|
|
if ( eParent._fckSavedStyles )
|
|
{
|
|
FCKTools.RestoreStyles( eParent, eParent._fckSavedStyles ) ;
|
|
eParent._fckSavedStyles = null ;
|
|
}
|
|
}
|
|
|
|
// Restore IE scrollbars
|
|
if ( FCKBrowserInfo.IsIE )
|
|
eDocEl.style.overflow = this.documentElementOverflow ;
|
|
|
|
// Restore original size
|
|
FCKTools.RestoreStyles( eEditorFrame, this._EditorFrameStyles ) ;
|
|
|
|
// Restore the window scroll position.
|
|
eMainWindow.scrollTo( this._ScrollPos.X, this._ScrollPos.Y ) ;
|
|
|
|
this.IsMaximized = false ;
|
|
}
|
|
|
|
FCKToolbarItems.GetItem('FitWindow').RefreshState() ;
|
|
|
|
// It seams that Firefox restarts the editing area when making this changes.
|
|
// On FF 1.0.x, the area is not anymore editable. On FF 1.5+, the special
|
|
//configuration, like DisableFFTableHandles and DisableObjectResizing get
|
|
//lost, so we must reset it. Also, the cursor position and selection are
|
|
//also lost, even if you comment the following line (MakeEditable).
|
|
// if ( FCKBrowserInfo.IsGecko10 ) // Initially I thought it was a FF 1.0 only problem.
|
|
if ( FCK.EditMode == FCK_EDITMODE_WYSIWYG )
|
|
FCK.EditingArea.MakeEditable() ;
|
|
|
|
FCK.Focus() ;
|
|
|
|
// Restore the selection and scroll position of inside the document.
|
|
if ( FCK.EditMode == FCK_EDITMODE_WYSIWYG )
|
|
{
|
|
oRange.Select() ;
|
|
FCK.EditorWindow.scrollTo( oEditorScrollPos.X, oEditorScrollPos.Y ) ;
|
|
}
|
|
else
|
|
{
|
|
if ( !FCKBrowserInfo.IsIE )
|
|
{
|
|
eTextarea.selectionStart = oRange[0] ;
|
|
eTextarea.selectionEnd = oRange[1] ;
|
|
}
|
|
eTextarea.scrollLeft = oEditorScrollPos[0] ;
|
|
eTextarea.scrollTop = oEditorScrollPos[1] ;
|
|
}
|
|
}
|
|
|
|
FCKFitWindow.prototype.GetState = function()
|
|
{
|
|
if ( FCKConfig.ToolbarLocation != 'In' )
|
|
return FCK_TRISTATE_DISABLED ;
|
|
else
|
|
return ( this.IsMaximized ? FCK_TRISTATE_ON : FCK_TRISTATE_OFF );
|
|
}
|
|
|
|
function FCKFitWindow_Resize()
|
|
{
|
|
var oViewPaneSize = FCKTools.GetViewPaneSize( parent ) ;
|
|
|
|
var eEditorFrameStyle = window.frameElement.style ;
|
|
|
|
eEditorFrameStyle.width = oViewPaneSize.Width + 'px' ;
|
|
eEditorFrameStyle.height = oViewPaneSize.Height + 'px' ;
|
|
}
|