119 lines
3.1 KiB
JavaScript
119 lines
3.1 KiB
JavaScript
/* global tinymce */
|
|
/**
|
|
* WP Fullscreen (Distraction Free Writing) TinyMCE plugin
|
|
*/
|
|
tinymce.PluginManager.add( 'wpfullscreen', function( editor ) {
|
|
var settings = editor.settings,
|
|
oldSize = 0;
|
|
|
|
function resize( e ) {
|
|
var deltaSize, myHeight,
|
|
d = editor.getDoc(),
|
|
body = d.body,
|
|
DOM = tinymce.DOM,
|
|
resizeHeight = 250;
|
|
|
|
if ( ( e && e.type === 'setcontent' && e.initial ) || editor.settings.inline ) {
|
|
return;
|
|
}
|
|
|
|
// Get height differently depending on the browser used
|
|
myHeight = tinymce.Env.ie ? body.scrollHeight : ( tinymce.Env.webkit && body.clientHeight === 0 ? 0 : body.offsetHeight );
|
|
|
|
// Don't make it smaller than 250px
|
|
if ( myHeight > 250 ) {
|
|
resizeHeight = myHeight;
|
|
}
|
|
|
|
body.scrollTop = 0;
|
|
|
|
// Resize content element
|
|
if ( resizeHeight !== oldSize ) {
|
|
deltaSize = resizeHeight - oldSize;
|
|
DOM.setStyle( DOM.get( editor.id + '_ifr' ), 'height', resizeHeight + 'px' );
|
|
oldSize = resizeHeight;
|
|
|
|
// WebKit doesn't decrease the size of the body element until the iframe gets resized
|
|
// So we need to continue to resize the iframe down until the size gets fixed
|
|
if ( tinymce.isWebKit && deltaSize < 0 ) {
|
|
resize( e );
|
|
}
|
|
}
|
|
}
|
|
|
|
// Register the command
|
|
editor.addCommand( 'wpAutoResize', resize );
|
|
|
|
function fullscreenOn() {
|
|
settings.wp_fullscreen = true;
|
|
editor.dom.addClass( editor.getDoc().documentElement, 'wp-fullscreen' );
|
|
// Add listeners for auto-resizing
|
|
editor.on( 'change setcontent paste keyup', resize );
|
|
}
|
|
|
|
function fullscreenOff() {
|
|
settings.wp_fullscreen = false;
|
|
editor.dom.removeClass( editor.getDoc().documentElement, 'wp-fullscreen' );
|
|
// Remove listeners for auto-resizing
|
|
editor.off( 'change setcontent paste keyup', resize );
|
|
oldSize = 0;
|
|
}
|
|
|
|
// For use from outside the editor.
|
|
editor.addCommand( 'wpFullScreenOn', fullscreenOn );
|
|
editor.addCommand( 'wpFullScreenOff', fullscreenOff );
|
|
|
|
function getExtAPI() {
|
|
return ( typeof wp !== 'undefined' && wp.editor && wp.editor.fullscreen );
|
|
}
|
|
|
|
// Toggle DFW mode. For use from inside the editor.
|
|
function toggleFullscreen() {
|
|
var fullscreen = getExtAPI();
|
|
|
|
if ( fullscreen ) {
|
|
if ( editor.getParam('wp_fullscreen') ) {
|
|
fullscreen.off();
|
|
} else {
|
|
fullscreen.on();
|
|
}
|
|
}
|
|
}
|
|
|
|
editor.addCommand( 'wpFullScreen', toggleFullscreen );
|
|
|
|
editor.on( 'keydown', function( event ) {
|
|
var fullscreen;
|
|
|
|
// Turn fullscreen off when Esc is pressed.
|
|
if ( event.keyCode === 27 && ( fullscreen = getExtAPI() ) && fullscreen.settings.visible ) {
|
|
fullscreen.off();
|
|
}
|
|
});
|
|
|
|
editor.on( 'init', function() {
|
|
// Set the editor when initializing from whitin DFW
|
|
if ( editor.getParam('wp_fullscreen') ) {
|
|
fullscreenOn();
|
|
}
|
|
|
|
editor.addShortcut( 'alt+shift+w', '', 'wpFullScreen' );
|
|
});
|
|
|
|
// Register buttons
|
|
editor.addButton( 'wp_fullscreen', {
|
|
tooltip: 'Distraction Free Writing',
|
|
shortcut: 'Alt+Shift+W',
|
|
onclick: toggleFullscreen,
|
|
classes: 'wp-fullscreen btn widget' // This overwrites all classes on the container!
|
|
});
|
|
|
|
editor.addMenuItem( 'wp_fullscreen', {
|
|
text: 'Distraction Free Writing',
|
|
icon: 'wp_fullscreen',
|
|
shortcut: 'Alt+Shift+W',
|
|
context: 'view',
|
|
onclick: toggleFullscreen
|
|
});
|
|
});
|