]> git.immae.eu Git - perso/Immae/Projets/packagist/ludivine-ckeditor-component.git/blame - sources/plugins/maximize/plugin.js
Update to 4.7.3
[perso/Immae/Projets/packagist/ludivine-ckeditor-component.git] / sources / plugins / maximize / plugin.js
CommitLineData
c63493c8
IB
1/**\r
2 * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.\r
3 * For licensing, see LICENSE.md or http://ckeditor.com/license\r
4 */\r
5\r
6( function() {\r
7 function protectFormStyles( formElement ) {\r
8 if ( !formElement || formElement.type != CKEDITOR.NODE_ELEMENT || formElement.getName() != 'form' )\r
9 return [];\r
10\r
11 var hijackRecord = [],\r
12 hijackNames = [ 'style', 'className' ];\r
13 for ( var i = 0; i < hijackNames.length; i++ ) {\r
14 var name = hijackNames[ i ];\r
15 var $node = formElement.$.elements.namedItem( name );\r
16 if ( $node ) {\r
17 var hijackNode = new CKEDITOR.dom.element( $node );\r
18 hijackRecord.push( [ hijackNode, hijackNode.nextSibling ] );\r
19 hijackNode.remove();\r
20 }\r
21 }\r
22\r
23 return hijackRecord;\r
24 }\r
25\r
26 function restoreFormStyles( formElement, hijackRecord ) {\r
27 if ( !formElement || formElement.type != CKEDITOR.NODE_ELEMENT || formElement.getName() != 'form' )\r
28 return;\r
29\r
30 if ( hijackRecord.length > 0 ) {\r
31 for ( var i = hijackRecord.length - 1; i >= 0; i-- ) {\r
32 var node = hijackRecord[ i ][ 0 ];\r
33 var sibling = hijackRecord[ i ][ 1 ];\r
34 if ( sibling )\r
35 node.insertBefore( sibling );\r
36 else\r
37 node.appendTo( formElement );\r
38 }\r
39 }\r
40 }\r
41\r
42 function saveStyles( element, isInsideEditor ) {\r
43 var data = protectFormStyles( element );\r
44 var retval = {};\r
45\r
46 var $element = element.$;\r
47\r
48 if ( !isInsideEditor ) {\r
49 retval[ 'class' ] = $element.className || '';\r
50 $element.className = '';\r
51 }\r
52\r
53 retval.inline = $element.style.cssText || '';\r
1794320d 54 if ( !isInsideEditor ) // Reset any external styles that might interfere. (http://dev.ckeditor.com/ticket/2474)\r
c63493c8
IB
55 $element.style.cssText = 'position: static; overflow: visible';\r
56\r
57 restoreFormStyles( data );\r
58 return retval;\r
59 }\r
60\r
61 function restoreStyles( element, savedStyles ) {\r
62 var data = protectFormStyles( element );\r
63 var $element = element.$;\r
64 if ( 'class' in savedStyles )\r
65 $element.className = savedStyles[ 'class' ];\r
66 if ( 'inline' in savedStyles )\r
67 $element.style.cssText = savedStyles.inline;\r
68 restoreFormStyles( data );\r
69 }\r
70\r
71 function refreshCursor( editor ) {\r
72 if ( editor.editable().isInline() )\r
73 return;\r
74\r
1794320d 75 // Refresh all editor instances on the page (http://dev.ckeditor.com/ticket/5724).\r
c63493c8
IB
76 var all = CKEDITOR.instances;\r
77 for ( var i in all ) {\r
78 var one = all[ i ];\r
79 if ( one.mode == 'wysiwyg' && !one.readOnly ) {\r
80 var body = one.document.getBody();\r
81 // Refresh 'contentEditable' otherwise\r
1794320d 82 // DOM lifting breaks design mode. (http://dev.ckeditor.com/ticket/5560)\r
c63493c8
IB
83 body.setAttribute( 'contentEditable', false );\r
84 body.setAttribute( 'contentEditable', true );\r
85 }\r
86 }\r
87\r
88 if ( editor.editable().hasFocus ) {\r
89 editor.toolbox.focus();\r
90 editor.focus();\r
91 }\r
92 }\r
93\r
94 CKEDITOR.plugins.add( 'maximize', {\r
95 // jscs:disable maximumLineLength\r
1794320d 96 lang: 'af,ar,az,bg,bn,bs,ca,cs,cy,da,de,de-ch,el,en,en-au,en-ca,en-gb,eo,es,es-mx,et,eu,fa,fi,fo,fr,fr-ca,gl,gu,he,hi,hr,hu,id,is,it,ja,ka,km,ko,ku,lt,lv,mk,mn,ms,nb,nl,no,oc,pl,pt,pt-br,ro,ru,si,sk,sl,sq,sr,sr-latn,sv,th,tr,tt,ug,uk,vi,zh,zh-cn', // %REMOVE_LINE_CORE%\r
c63493c8
IB
97 // jscs:enable maximumLineLength\r
98 icons: 'maximize', // %REMOVE_LINE_CORE%\r
99 hidpi: true, // %REMOVE_LINE_CORE%\r
100 init: function( editor ) {\r
101 // Maximize plugin isn't available in inline mode yet.\r
102 if ( editor.elementMode == CKEDITOR.ELEMENT_MODE_INLINE )\r
103 return;\r
104\r
105 var lang = editor.lang;\r
106 var mainDocument = CKEDITOR.document,\r
107 mainWindow = mainDocument.getWindow();\r
108\r
109 // Saved selection and scroll position for the editing area.\r
110 var savedSelection, savedScroll;\r
111\r
112 // Saved scroll position for the outer window.\r
113 var outerScroll;\r
114\r
115 // Saved resize handler function.\r
116 function resizeHandler() {\r
117 var viewPaneSize = mainWindow.getViewPaneSize();\r
118 editor.resize( viewPaneSize.width, viewPaneSize.height, null, true );\r
119 }\r
120\r
121 // Retain state after mode switches.\r
122 var savedState = CKEDITOR.TRISTATE_OFF;\r
123\r
124 editor.addCommand( 'maximize', {\r
1794320d 125 // Disabled on iOS (http://dev.ckeditor.com/ticket/8307).\r
c63493c8
IB
126 modes: { wysiwyg: !CKEDITOR.env.iOS, source: !CKEDITOR.env.iOS },\r
127 readOnly: 1,\r
128 editorFocus: false,\r
129 exec: function() {\r
130 var container = editor.container.getFirst( function( node ) {\r
131 return node.type == CKEDITOR.NODE_ELEMENT && node.hasClass( 'cke_inner' );\r
132 } );\r
133 var contents = editor.ui.space( 'contents' );\r
134\r
135 // Save current selection and scroll position in editing area.\r
136 if ( editor.mode == 'wysiwyg' ) {\r
137 var selection = editor.getSelection();\r
138 savedSelection = selection && selection.getRanges();\r
139 savedScroll = mainWindow.getScrollPosition();\r
140 } else {\r
141 var $textarea = editor.editable().$;\r
142 savedSelection = !CKEDITOR.env.ie && [ $textarea.selectionStart, $textarea.selectionEnd ];\r
143 savedScroll = [ $textarea.scrollLeft, $textarea.scrollTop ];\r
144 }\r
145\r
146 // Go fullscreen if the state is off.\r
147 if ( this.state == CKEDITOR.TRISTATE_OFF ) {\r
148 // Add event handler for resizing.\r
149 mainWindow.on( 'resize', resizeHandler );\r
150\r
151 // Save the scroll bar position.\r
152 outerScroll = mainWindow.getScrollPosition();\r
153\r
154 // Save and reset the styles for the entire node tree.\r
155 var currentNode = editor.container;\r
156 while ( ( currentNode = currentNode.getParent() ) ) {\r
157 currentNode.setCustomData( 'maximize_saved_styles', saveStyles( currentNode ) );\r
158 // Show under floatpanels (-1) and context menu (-2).\r
159 currentNode.setStyle( 'z-index', editor.config.baseFloatZIndex - 5 );\r
160 }\r
161 contents.setCustomData( 'maximize_saved_styles', saveStyles( contents, true ) );\r
162 container.setCustomData( 'maximize_saved_styles', saveStyles( container, true ) );\r
163\r
164 // Hide scroll bars.\r
165 var styles = {\r
1794320d 166 overflow: CKEDITOR.env.webkit ? '' : 'hidden', // http://dev.ckeditor.com/ticket/6896\r
c63493c8
IB
167 width: 0,\r
168 height: 0\r
169 };\r
170\r
171 mainDocument.getDocumentElement().setStyles( styles );\r
172 !CKEDITOR.env.gecko && mainDocument.getDocumentElement().setStyle( 'position', 'fixed' );\r
173 !( CKEDITOR.env.gecko && CKEDITOR.env.quirks ) && mainDocument.getBody().setStyles( styles );\r
174\r
1794320d 175 // Scroll to the top left (IE needs some time for it - http://dev.ckeditor.com/ticket/4923).\r
c63493c8
IB
176 CKEDITOR.env.ie ? setTimeout( function() {\r
177 mainWindow.$.scrollTo( 0, 0 );\r
178 }, 0 ) : mainWindow.$.scrollTo( 0, 0 );\r
179\r
180 // Resize and move to top left.\r
1794320d 181 // Special treatment for FF Quirks (http://dev.ckeditor.com/ticket/7284)\r
c63493c8 182 container.setStyle( 'position', CKEDITOR.env.gecko && CKEDITOR.env.quirks ? 'fixed' : 'absolute' );\r
1794320d 183 container.$.offsetLeft; // SAFARI BUG: See http://dev.ckeditor.com/ticket/2066.\r
c63493c8
IB
184 container.setStyles( {\r
185 // Show under floatpanels (-1) and context menu (-2).\r
186 'z-index': editor.config.baseFloatZIndex - 5,\r
187 left: '0px',\r
188 top: '0px'\r
189 } );\r
190\r
1794320d 191 // Add cke_maximized class before resize handle since that will change things sizes (http://dev.ckeditor.com/ticket/5580)\r
c63493c8
IB
192 container.addClass( 'cke_maximized' );\r
193\r
194 resizeHandler();\r
195\r
1794320d 196 // Still not top left? Fix it. (Bug http://dev.ckeditor.com/ticket/174)\r
c63493c8
IB
197 var offset = container.getDocumentPosition();\r
198 container.setStyles( {\r
199 left: ( -1 * offset.x ) + 'px',\r
200 top: ( -1 * offset.y ) + 'px'\r
201 } );\r
202\r
1794320d 203 // Fixing positioning editor chrome in Firefox break design mode. (http://dev.ckeditor.com/ticket/5149)\r
c63493c8
IB
204 CKEDITOR.env.gecko && refreshCursor( editor );\r
205 }\r
206 // Restore from fullscreen if the state is on.\r
207 else if ( this.state == CKEDITOR.TRISTATE_ON ) {\r
208 // Remove event handler for resizing.\r
209 mainWindow.removeListener( 'resize', resizeHandler );\r
210\r
211 // Restore CSS styles for the entire node tree.\r
212 var editorElements = [ contents, container ];\r
213 for ( var i = 0; i < editorElements.length; i++ ) {\r
214 restoreStyles( editorElements[ i ], editorElements[ i ].getCustomData( 'maximize_saved_styles' ) );\r
215 editorElements[ i ].removeCustomData( 'maximize_saved_styles' );\r
216 }\r
217\r
218 currentNode = editor.container;\r
219 while ( ( currentNode = currentNode.getParent() ) ) {\r
220 restoreStyles( currentNode, currentNode.getCustomData( 'maximize_saved_styles' ) );\r
221 currentNode.removeCustomData( 'maximize_saved_styles' );\r
222 }\r
223\r
224 // Restore the window scroll position.\r
225 CKEDITOR.env.ie ? setTimeout( function() {\r
226 mainWindow.$.scrollTo( outerScroll.x, outerScroll.y );\r
227 }, 0 ) : mainWindow.$.scrollTo( outerScroll.x, outerScroll.y );\r
228\r
229 // Remove cke_maximized class.\r
230 container.removeClass( 'cke_maximized' );\r
231\r
1794320d 232 // Webkit requires a re-layout on editor chrome. (http://dev.ckeditor.com/ticket/6695)\r
c63493c8
IB
233 if ( CKEDITOR.env.webkit ) {\r
234 container.setStyle( 'display', 'inline' );\r
235 setTimeout( function() {\r
236 container.setStyle( 'display', 'block' );\r
237 }, 0 );\r
238 }\r
239\r
240 // Emit a resize event, because this time the size is modified in\r
241 // restoreStyles.\r
242 editor.fire( 'resize', {\r
243 outerHeight: editor.container.$.offsetHeight,\r
244 contentsHeight: contents.$.offsetHeight,\r
245 outerWidth: editor.container.$.offsetWidth\r
246 } );\r
247 }\r
248\r
249 this.toggleState();\r
250\r
251 // Toggle button label.\r
252 var button = this.uiItems[ 0 ];\r
1794320d 253 // Only try to change the button if it exists (http://dev.ckeditor.com/ticket/6166)\r
c63493c8
IB
254 if ( button ) {\r
255 var label = ( this.state == CKEDITOR.TRISTATE_OFF ) ? lang.maximize.maximize : lang.maximize.minimize;\r
256 var buttonNode = CKEDITOR.document.getById( button._.id );\r
257 buttonNode.getChild( 1 ).setHtml( label );\r
258 buttonNode.setAttribute( 'title', label );\r
259 buttonNode.setAttribute( 'href', 'javascript:void("' + label + '");' ); // jshint ignore:line\r
260 }\r
261\r
262 // Restore selection and scroll position in editing area.\r
263 if ( editor.mode == 'wysiwyg' ) {\r
264 if ( savedSelection ) {\r
1794320d 265 // Fixing positioning editor chrome in Firefox break design mode. (http://dev.ckeditor.com/ticket/5149)\r
c63493c8
IB
266 CKEDITOR.env.gecko && refreshCursor( editor );\r
267\r
268 editor.getSelection().selectRanges( savedSelection );\r
269 var element = editor.getSelection().getStartElement();\r
270 element && element.scrollIntoView( true );\r
271 } else {\r
272 mainWindow.$.scrollTo( savedScroll.x, savedScroll.y );\r
273 }\r
274 } else {\r
275 if ( savedSelection ) {\r
276 $textarea.selectionStart = savedSelection[ 0 ];\r
277 $textarea.selectionEnd = savedSelection[ 1 ];\r
278 }\r
279 $textarea.scrollLeft = savedScroll[ 0 ];\r
280 $textarea.scrollTop = savedScroll[ 1 ];\r
281 }\r
282\r
283 savedSelection = savedScroll = null;\r
284 savedState = this.state;\r
285\r
286 editor.fire( 'maximize', this.state );\r
287 },\r
288 canUndo: false\r
289 } );\r
290\r
291 editor.ui.addButton && editor.ui.addButton( 'Maximize', {\r
292 label: lang.maximize.maximize,\r
293 command: 'maximize',\r
294 toolbar: 'tools,10'\r
295 } );\r
296\r
1794320d 297 // Restore the command state after mode change, unless it has been changed to disabled (http://dev.ckeditor.com/ticket/6467)\r
c63493c8
IB
298 editor.on( 'mode', function() {\r
299 var command = editor.getCommand( 'maximize' );\r
300 command.setState( command.state == CKEDITOR.TRISTATE_DISABLED ? CKEDITOR.TRISTATE_DISABLED : savedState );\r
301 }, null, null, 100 );\r
302 }\r
303 } );\r
304} )();\r
305\r
306/**\r
307 * Event fired when the maximize command is called.\r
308 * It also indicates whether an editor is maximized or not.\r
309 *\r
310 * @event maximize\r
311 * @member CKEDITOR.editor\r
312 * @param {CKEDITOR.editor} editor This editor instance.\r
313 * @param {Number} data Current state of the command. See {@link CKEDITOR#TRISTATE_ON} and {@link CKEDITOR#TRISTATE_OFF}.\r
314 */\r