/* 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 toggleFullscreen() { // Toggle DFW mode. For use from inside the editor. if ( typeof wp === 'undefined' || ! wp.editor || ! wp.editor.fullscreen ) { return; } if ( editor.getParam('wp_fullscreen') ) { wp.editor.fullscreen.off(); } else { wp.editor.fullscreen.on(); } } editor.addCommand( 'wpFullScreen', toggleFullscreen ); editor.on( 'keyup', function( event ) { // Turn fullscreen off when Esc is pressed. if ( event.keyCode === 27 && wp.editor.fullscreen.settings.visible ) { wp.editor.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 }); });