diff --git a/addons/website/static/lib/ckeditor.sharedspace/plugin.js b/addons/website/static/lib/ckeditor.sharedspace/plugin.js new file mode 100644 index 00000000000..ae8ddc79eb4 --- /dev/null +++ b/addons/website/static/lib/ckeditor.sharedspace/plugin.js @@ -0,0 +1,124 @@ +/** + * @license Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +(function() { + + 'use strict'; + + var containerTpl = CKEDITOR.addTemplate( 'sharedcontainer', '' + + '
' + + '' + + '
' + + '' ); + + CKEDITOR.plugins.add( 'sharedspace', { + afterInit: function( editor ) { + var spaces = editor.config.sharedSpaces; + + if ( spaces ) { + for ( var spaceName in spaces ) { + create( editor, spaceName, spaces[ spaceName ] ); + } + } + } + }); + + function create( editor, spaceName, targetId ) { + var target = CKEDITOR.document.getById( targetId ), + innerHtml, space; + + if ( target ) { + // Have other plugins filling the space. + innerHtml = editor.fire( 'uiSpace', { space: spaceName, html: '' } ).html; + + if ( innerHtml ) { + // Block the uiSpace handling by others (e.g. themed-ui). + editor.on( 'uiSpace', function( ev ) { + if ( ev.data.space == spaceName ) + ev.cancel(); + }, null, null, 1 ); // Hi-priority + + // Inject the space into the target. + space = target.append( CKEDITOR.dom.element.createFromHtml( containerTpl.output({ + id: editor.id, + name: editor.name, + langDir: editor.lang.dir, + langCode: editor.langCode, + space: spaceName, + spaceId: editor.ui.spaceId( spaceName ), + content: innerHtml + }))); + + // Only the first container starts visible. Others get hidden. + if ( target.getCustomData( 'cke_hasshared' ) ) + space.hide(); + else + target.setCustomData( 'cke_hasshared', 1 ); + + // There's no need for the space to be selectable. + space.unselectable(); + + // Prevent clicking on non-buttons area of the space from blurring editor. + space.on( 'mousedown', function( evt ) { + evt = evt.data; + if ( !evt.getTarget().hasAscendant( 'a', 1 ) ) + evt.preventDefault(); + }); + + // Register this UI space to the focus manager. + editor.focusManager.add( space, 1 ); + + // When the editor gets focus, show the space container, hiding others. + editor.on( 'focus', function() { + for ( var i = 0, sibling, children = target.getChildren(); ( sibling = children.getItem( i ) ); i++ ) { + if ( sibling.type == CKEDITOR.NODE_ELEMENT && + !sibling.equals( space ) && + sibling.hasClass( 'cke_shared' ) ) { + sibling.hide(); + } + } + + space.show(); + }); + + editor.on( 'destroy', function() { + space.remove(); + }); + } + } + } +})(); + +/** + * Makes it possible to place some of the editor UI blocks, like the toolbar + * and the elements path, into any element in the page. + * + * The elements used to hold the UI blocks can be shared among several editor + * instances. In that case, only the blocks of the active editor instance will + * display. + * + * // Place the toolbar inside the element with ID "someElementId" and the + * // elements path into the element with ID "anotherId". + * config.sharedSpaces = { + * top: 'someElementId', + * bottom: 'anotherId' + * }; + * + * // Place the toolbar inside the element with ID "someElementId". The + * // elements path will remain attached to the editor UI. + * config.sharedSpaces = { + * top: 'someElementId' + * }; + * + * @cfg {Object} [sharedSpaces] + * @member CKEDITOR.config + */