CKEDITOR.plugins.add("btquicktable", { requires: "bt_table,panelbutton,floatpanel", lang: "af,ar,bg,bn,bs,ca,cs,cy,da,de,el,en,en-au,en-ca,en-gb,eo,es,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,pl,pt,pt-br,ro,ru,si,sk,sl,sq,sr,sr-latn,sv,th,tr,ug,uk,vi,zh,zh-cn", // %REMOVE_LINE_CORE% afterInit: function (editor) { var lang = editor.lang; var conf = editor.config, quickRows = conf.qtRows || 10, quickColumns = conf.qtColumns || 8, quickStyle = conf.qtStyle || null, quickClass = conf.qtClass || "", quickWidth = conf.qtWidth || "100%", quickPreviewSize = conf.qtPreviewSize || "14px", quickPreviewBorder = conf.qtPreviewBorder || "1px solid #aaa", quickPreviewBackground = conf.qtPreviewBackground || "#e5e5e5"; function makeElement(name) { return new CKEDITOR.dom.element(name, editor.document); } // Create table for CLIENT. function insertTable(rowCount, columnCount, btData) { var table = makeElement("table"); var tbody = table.append(makeElement("tbody")); for (var i = 0; i < rowCount; i++) { var row = tbody.append(makeElement("tr")); for (var j = 0; j < columnCount; j++) { var cell = row.append(makeElement("td")); cell.appendBogus(); } } table.setStyles(quickStyle); conf.qtWidth !== null && table.setStyle("width", quickWidth); editor.insertElement(table); // Add bootstrap defaults table.addClass("table"); for (btClass in btData) { if (btData[btClass] == true) table.addClass(btClass); } if (!table.getParent().hasClass("table-responsive")) { var tablewrapper = makeElement("div"); tablewrapper.addClass("table-responsive"); tablewrapper.append(table); editor.insertElement(tablewrapper); } // Fire event for addborders plugin (so hidden borders are visible) editor.fire("removeFormatCleanup", table); } // Create table for dialog and create table function renderbtquicktable(panel) { var output = []; var clickFn = CKEDITOR.tools.addFunction(function (i, j) { // Call insert table insertTable(parseInt(i, 10) + 1, parseInt(j, 10) + 1, panel.bootstrapdata); panel.hide(); }); // Create selection table output.push( '' + '' ); for (var i = 0; i < quickRows; i++) { output.push(""); for (var j = 0; j < quickColumns; j++) { output.push( '" ); } output.push(""); } output.push("
"); return output.join(""); } // Create selecion and add row count. var selection = { row: -1, column: -1 }; function select(label, table, rowCount, columnCount) { var rows = table.$.tBodies[0].rows; for (var i = 0; i < rows.length; i++) { var cells = rows[i].cells; for (var j = 0; j < cells.length; j++) { var cell = cells[j]; if (i < rowCount && j < columnCount) { cell.style.background = quickPreviewBackground; } else { cell.style.background = ""; } } } selection.row = rowCount - 1; selection.column = columnCount - 1; label.setText(rowCount + " × " + columnCount + " " + lang.table.toolbar); } // Replace table dialog. editor.ui.add("Table", CKEDITOR.UI_PANELBUTTON, { label: lang.table.toolbar, command: "table", modes: { wysiwyg: 1 }, editorFocus: 0, toolbar: "insert,30", // striped: null, // borders: null, // tablehover: null, caption: null, table: null, panel: { css: CKEDITOR.skin.getPath("editor"), attributes: { role: "listbox", "aria-label": lang.table.toolbar } }, // Create panel ui. onBlock: function (panel, block) { block.autoSize = true; block.element.addClass("cke_colorblock"); // Data object class: Checkbox name; var btdata = { "table-bordered": lang.bt_table.addBorders, "table-striped": lang.bt_table.addStripes, "table-hover": lang.bt_table.addHover, "table-condensed": lang.bt_table.compactStyle }; panel.bootstrapdata = []; for (item in btdata) { var dialogElement = new CKEDITOR.dom.element.createFromHtml( '
" ); dialogElement.find("input").$[0].onchange = function () { return (panel.bootstrapdata[this.name] = this.checked); }; block.element.append(dialogElement); } this.bootsrapdata = panel.bootstrapdata; var caption = new CKEDITOR.dom.element("div"); caption.setStyles({ "text-align": "center", margin: "3px 0" }); block.element.append(caption); this.caption = caption; var tableWrapper = CKEDITOR.dom.element.createFromHtml(renderbtquicktable(panel)); this.table = this.addEvents(tableWrapper); block.element.append(tableWrapper); var moreButton = this.createMoreButton(); block.element.append(moreButton); CKEDITOR.ui.fire("ready", this); }, assignKeys: function (keys) { var rtl = lang.dir == "rtl"; keys[rtl ? 37 : 39] = "next"; // ARROW-RIGHT keys[40] = "next"; // ARROW-DOWN keys[9] = "next"; // TAB keys[rtl ? 39 : 37] = "prev"; // ARROW-LEFT keys[38] = "prev"; // ARROW-UP keys[CKEDITOR.SHIFT + 9] = "prev"; // SHIFT + TAB keys[32] = "click"; // SPACE return keys; }, addEvents: function (tableWrapper) { var table = (this.table = tableWrapper.getFirst()); var caption = this.caption; var btdata = this.bootsrapdata; table.on("mouseleave", function (evt) { select(caption, table, 1, 1); }); table.on("mousemove", function (evt) { var target = evt.data.getTarget(); if (target.getName() == "td") { var i = parseInt(target.getAttribute("data-i"), 10); var j = parseInt(target.getAttribute("data-j"), 10); select(caption, table, i + 1, j + 1); } }); tableWrapper.on("keydown", function (evt) { var keystroke = evt.data.getKeystroke(), row = selection.row, column = selection.column; switch (keystroke) { case 37: // ARROW-LEFT column--; break; case 39: // ARROW-RIGHT column++; break; case 40: // ARROW-DOWN row++; break; case 38: // ARROW-UP row--; break; case 13: // ENTER case 32: // SPACE insertTable(row + 1, column + 1, btdata); return; default: return; } if (row < 0 || column < 0) { this.panel.hide(); return; } if (row > quickRows - 1 || column > quickColumns - 1) { editor.execCommand("bt_table"); } select(caption, table, row + 1, column + 1); evt.data.preventDefault(); evt.data.stopPropagation(); }); return table; }, createMoreButton: function () { var moreButton = new CKEDITOR.dom.element("a"); moreButton.setAttributes({ _cke_focus: 1, hidefocus: true, title: lang.btquicktable.more, href: 'javascript:void("' + lang.btquicktable.more + '")', role: "option" }); moreButton.addClass("cke_colormore"); moreButton.setText(lang.btquicktable.more); moreButton.setStyle("text-align", "center"); moreButton.on("click", function (evt) { editor.execCommand("bt_table"); evt.data.preventDefault(); }); return moreButton; }, onOpen: function () { select(this.caption, this.table, 1, 1); } }); } });