Déplacement préalable à l'eggification.
[ckeditor.git] / 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 (file)
index 0000000..835b08b
--- /dev/null
@@ -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,
+                               '<div class="' + style.className + '">' +
+                                       style.name + 
+                               '</div>',
+                               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());
+
+} ());