X-Git-Url: https://scm.cri.ensmp.fr/git/ckeditor.git/blobdiff_plain/e7f8fb547940c134de50db80ffaf54be1135ca7b..fbd145a2acd338b7bb7d152fa24692d8ff3e6b4c:/Products/ckeditor/skins/ckeditor/plugins/plinn_styles/plugin.js diff --git a/Products/ckeditor/skins/ckeditor/plugins/plinn_styles/plugin.js b/Products/ckeditor/skins/ckeditor/plugins/plinn_styles/plugin.js new file mode 100644 index 0000000..835b08b --- /dev/null +++ b/Products/ckeditor/skins/ckeditor/plugins/plinn_styles/plugin.js @@ -0,0 +1,101 @@ +/* © 2014 Benoît Pin, MINES ParisTech */ +( function() { + +var PlinnStylesCombo = function(editor) { + this.editor = editor; + this.label = 'Styles'; + this.title = 'CSS Styles'; + this.toolbar = 'styles,10'; + this.panel = { + css : [CKEDITOR.skin.getPath( 'editor' )].concat(editor.config.contentsCss), + multiSelect : true, + attributes : {'aria-label': this.title} + }; + this.styles = []; +}; + +PlinnStylesCombo.prototype.onRender = function() { + var self = this; + this.editor.on('selectionChange', function(evt){self.checkSelection(evt);}); +}; + +PlinnStylesCombo.prototype.checkSelection = function(evt) { + if (evt.data.selection.getRanges().length > 1) { + this.disable(); + } + else { + this.enable(); + } +}; + +PlinnStylesCombo.prototype.loadStyle = function(definition) { + this.styles.push(definition); + this.styles[definition.name] = definition; +}; + +PlinnStylesCombo.prototype.init = function() { + var i, style; + for (i=0 ; i < this.styles.length ; i++) { + style = this.styles[i]; + this.add(style.name, + '
' + + style.name + + '
', + style.name + ); + } +}; + +PlinnStylesCombo.prototype.onClick = function(value) { + this.editor.focus(); + this.editor.fire('saveSnapshot'); + var style = this.styles[value]; + var className = style.className; + var ranges = this.editor.getSelection().getRanges(); + var element = this.editor.elementPath().lastElement; + if(ranges.length === 1) { + var start = ranges[0].startContainer; + var end = ranges[0].endContainer; + if(start.$ !== end.$) { + // selection is a fragment that need to be wrapped in container to apply style + element = new CKEDITOR.dom.element('div'); + element.append(ranges[0].cloneContents()); + this.editor.insertElement(element); + } + } + if (element.hasClass(className)) { + element.removeClass(className); + } + else { + element.addClass(className); + } + this.editor.fire('saveSnapshot'); +}; + +var PlinnStylePlugin = function() { + this.requires = 'richcombo'; + this.combo = undefined; +}; + +PlinnStylePlugin.prototype.init = function(editor) { + this.combo = new PlinnStylesCombo(editor); + editor.ui.addRichCombo('PlinnStyles', this.combo); + var self = this; + editor.on('stylesSet', function(evt){self.onStylesSet(evt);}); +}; + +PlinnStylePlugin.prototype.onStylesSet = function(evt) { + var stylesDefinitions = evt.data.styles; + if (!stylesDefinitions) { return; } + var i; + for(i=0 ; i < stylesDefinitions.length ; i++) { + this.combo.loadStyle(stylesDefinitions[i]); + } + +}; + + +// main +CKEDITOR.plugins.add( 'plinn_styles', new PlinnStylePlugin()); + +} ());